一、图像滤波
1、滤波实际上是信号处理得一个概念,图像可以看成一个二维信号,其中像素点的灰度值代表信号的强弱;
2、 高频:图像上变化剧烈的部分;
3、 低频:图像灰度值变化缓慢,平坦的地方;
4、根据图像高低频,设置高通和低通滤波器。高通滤波器可以检测变化尖锐,明显的地方,低通可以让图像变得平滑,消除噪声;
5、滤波作用:高通滤波器用于边缘检测,低通滤波器用于图像平滑去噪;
6、线性滤波:方框滤波/均值滤波/高斯滤波;
7、非线性滤波:中值滤波/双边滤波
领域算子:利用给定像素周围的像素值决定此像素的最终输出值的一种算子;
线性滤波:一种常用的领域算子,像素输出取决于输入像素的加权和(卷积)
1、方框滤波
方框滤波(box Filter)被封装在一个名为boxFilter的函数中,即boxFilter函数的作用是使用方框滤波器(box filter)来模糊一张图片,从src输入,从dst输出;
方框滤波器的核:
函数:cv2.boxFilter(src,depth,ksize,normalize)
参数说明:
参数1:输入图像
参数2:目标图像深度
参数3:核大小(核越大图像越模糊)
参数4:normalize属性
img=cv2.imread('lena.jpg',cv2.IMREAD_UNCHANGED)
n=cv2.boxFilter(img,-1,(3,3),normalize=1)
n1=cv2.boxFilter(img,-1,(3,3),normalize=0)#没有归一化容易溢出
cv2.imshow('src',img)
cv2.imshow('norm',n)
cv2.imshow('unorm',n1)
2、均值滤波
均值滤波是一种最简单的滤波处理,它取的是卷积核区域内元素的均值,用cv2.blur()实现,如3×3的卷积核:
函数:cv2.blur(src, ksize)
参数说明:
参数1:输入原图
参数2:kernel的大小,一般为奇数
#均值滤波
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
blur=cv2.blur(img,(7,7))
plt.subplot(121),plt.imshow(img),plt.title('src')
plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('blur')
plt.xticks([]),plt.yticks([])
plt.show()
3、高斯滤波
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。高斯滤波的卷积核权重并不相同,中间像素点权重最高,越远离中心的像素权重越小。其原理是一个2维高斯函数。
高斯滤波相比均值滤波效率要慢,但可以有效消除高斯噪声,能保留更多的图像细节,所以经常被称为最有用的滤波器
函数:
cv2.Guassianblur(src, ksize, std) 表示进行高斯滤波,
参数说明:
参数1:输入原图
参数2:高斯核大小(核越大,越能消除噪声,但是图像越模糊)
参数3:标准差σ,平滑时,调整σ实际是在调整周围像素对当前像素的影响程度,调大σ即提高了远处像素对中心像素的影响程度,滤波结果也就越平滑。
#核与标准差组合人为可以调到最合适
guass_blur=cv2.GaussianBlur(img,(5,5),0)
4、中值滤波
中值滤波是一种非线性滤波,是用 像素点邻域灰度值的中指代替该点的灰度值,中值滤波可以去除椒盐噪声和斑点噪声。(祛除比较突兀的噪声)
函数:
cv2.medianBlur(img,ksize)
参数说明:
参数1:输入原图
参数2:核大小
#中值滤波
median_blur=cv2.medianBlur(img,7)
5、双边滤波
双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空间与信息和灰度相似性,达到保边去噪的目的,具有简单、非迭代、局部处理的特点。
函数:cv2.bilateralFilter(src=image, d, sigmaColor, sigmaSpace)
参数说明:
参数1:输入原图
参数2:像素的邻域直径
参数3:灰度值相似性高斯函数标准差
参数4:空间高斯函数标准差
#双边滤波
b_blur=cv2.bilateralFilter(img,-1,15,10)
二、图像增强
1、图像直方图的均衡化
目的:直方图均衡化是将原图像通过某种变换,得到一幅灰度直方图为均匀分布的新图像的方法。
直方图均衡化方法的基本思想是对在图像中像素个数多的灰度级进行展宽,而对像素个数少的灰度级进行缩减。从而达到清晰图像的目的。
步骤:统计直方图中每个灰度级出现的次数;计算累计归一化直方图;重新计算像素点的像素
函数:cv2.equalizeHist(img)
参数1:待均衡化图像
#灰度图的均衡化
img=cv2.imread('1.jpg',1)
gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img_equal=cv2.equalizeHist(gray_img)
#彩色图的直方图的均衡化,分解每个通道
#对每个通道均衡化
(b,g,r)=cv2.split(img)
bh=cv2.equalizeHist(b)
gh=cv2.equalizeHist(g)
rh=cv2.equalizeHist(r)
#合并每个通道
result=cv2.merge((bh,gh,rh))
2、Gamma变换
Gamma变换是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系:
目的:Gamma变换就是用来图像增强,其提升了暗部细节,通过非线性变换,让图像从暴光强度的线性响应变得更接近人眼感受的响应,即将漂白(相机曝光)或过暗(曝光不足)的图片,进行矫正。
gamma变换
def adjust_gamma(image,gamma=1.0):
invgamma=1.0/gamma
table=[]
for i in range(256):
table.append(((i/255.0)**invgamma)*255)
table=np.array(table).astype("uint8")
return cv2.LUT(image,table) #查找表与图片的元素一一对应
img_gamma=adjust_gamma(img,2)
总结:在此代码中,gamma在0到1之间图像是变暗的,在大于1时图像是变亮的。
三、图像形态学操作
形态学,是图像处理中应用最为广泛的技术之一,主要用于从图像中提取
对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目
标对象最为本质的形状特征,如边界和连通区域等。
结构元素:设有两幅图像B,X。
若X是被处理的对象,而B是用来处理X的,则称B为结构元素(structure
element),又被形象地称做刷子。结构元素通常都是一些比较小的图像
1、腐蚀和膨胀(往往针对二值图像)
图像的膨胀(Dilation)和腐蚀(Erosion)是两种基本的形态学运算,其中膨胀类似于“领域扩张”,将图像中前景进行扩张,其运行结果图比原图的前景区域更大;腐蚀类似于“领域被蚕食”,将图像中前景部分进行缩减细化,其运行结果图比原图的前景区域更小
腐蚀
腐蚀的运算符是“-”,其定义如下:
该公式表示图像A用卷积模板B来进行腐蚀处理,通过模板B与图像A进行卷积计算,得出B覆盖区域的像素点最小值,并用这个最小值来替代参考点的像素值(针对灰度图腐蚀的概念)
下面是二值图像腐蚀的过程:
结构元素是黑色和黄色,当黑色anchor移动到第一个前景点时,判断anchor上黑色和黄色这两个点完全包含在前景图没有,没有就标记黑色下面这个点,腐蚀这个点。如果被完全包含,黑色点这个下面这个点不做处理。黑色点下面时背景点,不做任何处理。
腐蚀后的图像:灰色的点是被腐蚀的点
函数:cv2.erode(src,element,anchor,iterations)
参数1:src,原图像
参数2:element,腐蚀操作的内核,默认一个简单的 3x3 矩(各种形状)
参数3:anchor,默认为Point(-1,-1),内核中心点
参数4:iterations,腐蚀次数,默认值1
img=cv2.imread('2.jpg')
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
kernel=np.ones((5,5),np.uint8)
erosion=cv2.erode(img,kernel,iterations=1)
膨胀
胀(dilation)可以看做是腐蚀的对偶运算
结构元素是黑色和黄色,当黑色anchor移动到第一个前景点时,判断anchor上这两个点与前景点有交集没有,判断有,但是黑色下面这个点就是前景目标就不用处理。如果黑色下面这个是背景点就标记这个点,膨胀这个点。判断没有,黑色下面的点就不用做任何处理。
膨胀后的图像:(绿色代表膨胀点)
#膨胀
#cv封装定义kernel结构元素的形状,cv2.MORPH_RECT是矩形
kernel1=cv2.getStructuringElement(cv2.MORPH_RECT,(7,7))
#cv2.MORPH_RECT是十字形状
#kernel1=cv2.getStructuringElement(cv2.MARKER_CROSS,(7,7))
#cv2.MORPH_ELLIPSE 椭圆形
#kernel1=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(7,7))
dilation=cv2.dilate(img,kernel1,iterations=1)
开运算
开运算 = 先腐蚀运算,再膨胀运算(看上去把细微连在一起的两块目标分开了),开运算的效果图如下图所示
#开运算
kernel2=cv2.getStructuringElement(cv2.MORPH_RECT,(7,7))
opening=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel2)
开运算总结:
1、开运算能够除去孤立的小点,毛刺和小桥,而总的位置和形状不变。
2、 开运算是一个基于几何运算的滤波器。
3、结构元素大小的不同将导致滤波效果的不同。
4、不同的结构元素的选择导致了不同的分割,即提取出不同的特征。
闭运算:
闭运算 = 先膨胀运算,再腐蚀运算(看上去将两个细微连接的图块封闭在一起),闭运算的效果图如图所示
#闭运算
kernel3=cv2.getStructuringElement(cv2.MORPH_RECT,(9,9))
closing=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel2)
闭运算总结:
1、闭运算能够填平小湖(即小孔),弥合小裂缝,而总的位置和形状不变。
2、闭运算是通过填充图像的凹角来滤波图像的。
3、结构元素大小的不同将导致滤波效果的不同。
4、不同结构元素的选择导致了不同的分割。
四、形态学梯度(Gradient):(图像形态变化的趋势)
基础梯度:基础梯度是用膨胀后的图像减去腐蚀后的图像得到差值图像也是opencv中支持的计算形态学梯度的方法,而此方法得到梯度有称为基本梯度。
内部梯度:是用原图像减去腐蚀之后的图像得到差值图像,称为图像的内部梯度。
外部梯度:图像膨胀之后再减去原来的图像得到的差值图像,称为图像的外部梯
#基础梯度
kernel4=cv2.getStructuringElement(cv2.MORPH_RECT,(9,9))
gradient=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel4)
顶帽(Top Hat):原图像与开运算图的区别(差值),突出原图像中比周围亮的区域
#顶帽
tophat=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel4)
黑帽(Black Hat):闭操作图像 - 原图像,突出原图像中比周围暗的区域
#黑帽
balckhat=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel4)