2019-10-18 16:51:30 zbwgycm 阅读数 120
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4444 人正在学习 去看看 贾志刚

Introduction

滤波是一个信号处理领域的概念。信息通过波的形式传递,滤波就是通过提取相应的频率成分,从而获取有用的信息。图像滤波也是如此。根据提取频率的成分不同,可以将滤波操作分为低通滤波、带通滤波和高通滤波。在图像处理领域,图像低通滤波,也就是图像平滑滤波,是最重要的方向之一。许多与图像相关的工作都需要使用图像滤波做预处理,而图像平滑滤波也广泛应用于图像去噪、图像增强、图像融合、立体视觉、HDR等各个领域。

图像平滑滤波从实现方式上来讲可以分为基于局部信息的滤波和基于全局优化的滤波。基于局部信息的滤波方式由于实现简单,速度一般较快,所以最常见到,如均值滤波、中值滤波、高斯滤波等等。由于这些滤波方式在平滑纹理和噪声的同时往往也会平滑边缘,所以后来一些保边滤波方式,如双边滤波、导向滤波被提出。而基于全局优化的滤波一般来说都是保边性滤波。下面主要按照这个分类介绍一下常见的滤波方式及其应用。

基于局部信息的滤波方式

均值滤波就是利用邻域像素点的平均值代替当前点的像素值。均值滤波可以使用积分图的方式进行加速,从而实现与滤波窗口大小无关的时间开销。而这也是成为对许多滤波器加速的基础,如导向滤波、快速中值滤波都是使用积分图来加速。均值滤波将邻域像素看作是平等的赋予相同的权重,高斯滤波则是根据距离远近依次权重递减。所以高斯滤波往往比均值滤波得到效果更加保持强边缘。中值滤波常用于滤除椒盐噪声,其利用邻域像素点的中值代替当前点的像素值。中值滤波也有较好的保边效果,也常用于立体视觉中视差图的优化。一种快速实现中值滤波的方式就是通过均值滤波实现对局部邻域的直方图统计,从而快速计算局部邻域中值。

上面提到高斯滤波通过距离当前像素点位置的远近来对邻域像素进行加权,而双边滤波则是在此基础上继续延伸,将邻域像素值与当前像素值的差异也作为权重,用两种权重进行加权平均,所以双边滤波是一种保边滤波器,在平滑小纹理和噪声的同时能够保持强边缘。由于双边滤波不同位置的滤波核不同,只能逐点计算,因此速度往往比较慢。有许多方法被提出用于对双边滤波加速,其中一种方法便是使用双边空间。其将像素值作为一个额外维度,使得权重的计算转变成在第三维度上的卷积,从而加快运算速度。这个概念被作者进一步延伸,便有了后来的Bilateral Guided Upsample和Google的HDRnet,有兴趣的可以参考这里。但双边滤波可以保持边缘但不能保持梯度,还会出现梯度翻转现象。

导向滤波来自于Closed-Form Matting,其主要基于局部线性模型假设,即在一个局部邻域中,输入图像qq可以用引导图II线性表出,即
qi=akIi+bk,iωkq_i=a_kI_i+b_k, \forall i \in \omega_k

以此可以利用最小二乘法建立优化方程,并对系数引入正则项约束(岭回归):
E(ak,bk)=iωk(akIi+bkqi)2+ϵak2E(a_k,b_k)=\sum_{i\in \omega_k} (a_kI_i+b_k-q_i)^2+\epsilon a^2_k

对该问题可以直接求解,得到aka_kbkb_k值与局部均值和局部协方差有关,因此可以使用快速均值滤波求解。导向滤波速度很快,而且也不会出现梯度翻转现象,因此无论在学术界还是在工业界都被广泛应用。但有时导向滤波得到的结果会在强边缘附近出现光晕现象(halo artifact)。具体介绍可以参考作者的PPT,还是讲的非常清楚的。另外,作者还提出了导向滤波的加速方式,基本的思想就是在低尺度上求解aka_kbkb_k,然后上采样回去求解平滑图像。

基于全局优化的滤波方式

这一类滤波都是通过建立全局优化方程,然后求解得到滤波结果。其与图像复原任务十分相似且密切相关。一般来说,其优化方程可以表达为:
E(x)=f(x,y)+p(x)E(x) = f(x,y)+p(x)

其由两部分组成,一个是保真项f(x,y)f(x,y),保持平滑后的图像与原图像结构相似;一个是先验项p(x)p(x),指导滤波后的图像应该服从什么分布。通常保真项采用L2L_2范数,不同的滤波方式的主要区别在于先验项的设计。图像平滑滤波常用是局部平滑先验,在梯度域对图像进行约束。详细可以参考这篇文章。常见到的如WLS filter,L1 filter, L0 filter,都是分别对梯度做L2L_2L1L_1L0L_0范数的约束。香港中文大学的Jiajia ya课题组在这个领域做的比较多,可以参考他的个人主页

总结

在不同的任务中,往往需求不同,这也造成了各种各样的滤波方式的出现。图像平滑滤波的方式有很多,其主要的研究方向在于如何实现更快的速度,如何在平滑纹理的同时更好地保持强边缘和结构。

2017-05-08 11:50:52 guduruyu 阅读数 13278
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4444 人正在学习 去看看 贾志刚

在图像处理中,经常需要对图像进行平滑、锐化、边界增强等滤波处理。在使用PIL图像处理库时,我们通过Image类中的成员函数filter()来调用滤波函数对图像进行滤波,而滤波函数则通过ImageFilter类来定义的。

下面先直接看一个样例:

#-*- coding: UTF-8 -*-     
  
from PIL import Image
from PIL import ImageFilter

def image_filters_test():

    im = Image.open("lenna.jpg")

    #预定义的图像增强滤波器
    im_blur = im.filter(ImageFilter.BLUR)
    im_contour = im.filter(ImageFilter.CONTOUR)

    im_min = im.filter(ImageFilter.MinFilter(3))

    im.show()
    im_blur.show()
    im_contour.show()
    im_min.show()

    return



ImageFilter类中预定义了如下滤波方法:

• BLUR:模糊滤波

• CONTOUR:轮廓滤波

• DETAIL:细节滤波

• EDGE_ENHANCE:边界增强滤波

• EDGE_ENHANCE_MORE边界增强滤波(程度更深)

• EMBOSS:浮雕滤波

• FIND_EDGES:寻找边界滤波

• SMOOTH:平滑滤波

• SMOOTH_MORE:平滑滤波(程度更深)

• SHARPEN:锐化滤波

• GaussianBlur(radius=2):高斯模糊

>radius指定平滑半径。

• UnsharpMask(radius=2, percent=150, threshold=3):反锐化掩码滤波

>radius指定模糊半径;

>percent指定反锐化强度(百分比);

>threshold控制被锐化的最小亮度变化。

• Kernel(size, kernel, scale=None, offset=0):核滤波

当前版本只支持核大小为3x3和5x5的核大小,且图像格式为“L”和“RGB”的图像。

>size指定核大小(width, height);

>kernel指定核权值的序列;

>scale指定缩放因子;

>offset指定偏移量,如果使用,则将该值加到缩放后的结果上。

• RankFilter(size, rank):排序滤波

>size指定滤波核的大小

>rank指定选取排在第rank位的像素,若大小为0,则为最小值滤波;若大小为size * size / 2则为中值滤波;若大小为size * size - 1则为最大值滤波。

• MedianFilter(size=3):中值滤波

>size指定核的大小

• MinFilter(size=3):最小值滤波器

>size指定核的大小

• MaxFilter(size=3):最大值滤波器

>size指定核的大小

• ModeFilter(size=3):波形滤波器

选取核内出现频次最高的像素值作为该点像素值,仅出现一次或两次的像素将被忽略,若没有像素出现两次以上,则保留原像素值。

>size指定核的大小


上例的滤波处理结果如下




2017.05.08

2019-07-18 22:17:26 qq_29507011 阅读数 420
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4444 人正在学习 去看看 贾志刚

图像滤波分为均值滤波、高斯滤波、中值滤波、双边滤波,其中中值滤波对椒盐噪声有奇效

均值滤波:cv2.blur(img,元祖:卷积核大小) 对于椒盐噪声有效
高斯滤波:cv2.GaussianBlur(img,元祖:卷积核大小,标准差:越小平滑效果越好,低频,反之高频) 对于高斯噪声有效
中值滤波:cv2.medianBlur(img,核的大小) 对椒盐噪声有奇效
双边滤波:cv2.bilateralFilter(img,核的大小,参数越大临近像素将会在越远的地方mix,参数越大那些颜色足够相近的的颜色的影响越大) 滤波的同时能保留边缘信息

import numpy as np
import cv2
#import matplotlib.pyplot as plt
import random

path = r'../test.jpg'
image = cv2.imread(path,0)
hight,width = image.shape

for i in range(20000):
	h = random.randint(0,hight-1)
	w = random.randint(0,width-1)
	image[h,w] = 255

img_mean = cv2.blur(image,(9,9))
img_gauss = cv2.GaussianBlur(image,(9,9),0)
img_median = cv2.medianBlur(image,5)
img_bilater = cv2.bilateralFilter(image,9,175,75)

cv2.imshow('test',image)
cv2.imshow('mean',img_mean)
cv2.imshow('gauss',img_gauss)
#中值滤波效果极佳
cv2.imshow('median',img_median)
cv2.imshow('bilater',img_bilater)

cv2.imwrite('median.jpg',img_median)
cv2.waitKey(0)
cv2.destroyWindows()

对于加入20000个噪声的图片进行中值滤波后的图像如下:在这里插入图片描述
效果奇佳!!!

浅析matlab图像滤波

阅读数 9988

没有更多推荐了,返回首页