【python+opencv】图像卷积及滤波

目录

1.噪声的分类

2.图像卷积

2.1单次卷积操作

2.2对整幅图像卷积

2.3完整卷积过程

3.opencv中的卷积-filter2D函数

4.卷积中的padding填充(边界填充)

5.padding填充(边界填充)方式

5.1填充为黑色(0)

5.2 填充为白色(255)

5.3 填充为和原图边界一样的颜色

5.4 以边界为对称轴填充

6. 特殊的卷积(滤波)

6.1均值滤波

6.2高斯滤波

6.3中值滤波

6.4双边滤波


什么是图像噪声?

噪声常表现为一引起较强视觉效果的孤立像素点,叠加在原始的像素上。

图像噪声是怎么来的?

• 数字图像在其形成、传输记录过程中往往会受到多种噪声的污染

• 在图像处理的某些环节当输入并不如预想时也会在结果图像中引入噪声

图像噪声的影响

• 以无用的信息形式出现,扰乱图像的可观测信息

• 极大降低了图像质量

• 影响图像复原、分割、特征提取、图像识别等后继工作的进行


1.噪声的分类

一个好的图像去噪的方法必须:

• 能有效地去除目标和背景中的噪声

• 能很好地保护图像主体内容的颜色

通常采用图像滤波进行去噪:

• 图像卷积

• 傅立叶变换

高斯噪声:噪声强度大小服从正态分布,噪声颜色随机,通常是因为不良照明和高温引起的传感。

【python+opencv】图像卷积及滤波_第1张图片 •椒盐噪声(脉冲噪声):随机改变一些像素值,由图像传感器、传输信道、解码处理等产生的黑白相间的亮暗点噪声。

【python+opencv】图像卷积及滤波_第2张图片

2.图像卷积

使用卷积的方法来对图像进行去噪,卷积的两个输入分别是原始图片卷积核

卷积核的大小定义了卷积的视野

• 二维的常见选择是3——即3x3像素

卷积核的大小一般是奇数*奇数,卷积核的中心点称为锚点

 【python+opencv】图像卷积及滤波_第3张图片

2.1单次卷积操作

对应位置像素相乘再求和,输出一个像素值,如下

【python+opencv】图像卷积及滤波_第4张图片

 2.2对整幅图像卷积

卷积核在原图像上从左向右、从上向下逐渐滑动,滑动暂停时,相乘再相加,作为输出图像像素灰度值,如下

卷积核:

1 0 1
0 1 0
1 0 1

卷积过程:
【python+opencv】图像卷积及滤波_第5张图片

2.3完整卷积过程

卷积核从左至右,从上到下在图片上滑动,每滑动到一个新的位置输出当前位置的卷积值.

【python+opencv】图像卷积及滤波_第6张图片

小结:m * n大小的图像,用k * k的卷积核去做卷积,步长为1时,结果图像大小为:

(m - k + 1 ) * (n - k + 1 )

 3.opencv中的卷积-filter2D函数

dst=cv2.filter2D(src, ddepth, kernel, anchor, delta, borderType)

• src:原图像;

• ddepth:目标图像的像素深度(每像素由多少位来表示),通常设置为-1,表示输出图像 与原图像有相同的像素深度;

• kernel:卷积核,为float型二维矩阵

• anchor (可选) :卷积核的锚点,默认值(-1 , -1 )表示锚点位于卷积核中心;

• delta (可选) :将卷积结果加上由该参数指定的值,默认为0;

• borderType (可选) :填充区域如何生成,默认情况下并非填充0像素,而是采用镜像模

式,如gfedcb|abcdefgh|gfedcba,其中|表示原图像的边界。 

 4.卷积中的padding填充(边界填充)

 上述例子中5*5的图片经过卷积大小缩小到了3*3,结果图大小和卷积核移动的步数相等

【python+opencv】图像卷积及滤波_第7张图片

       然而,大多数情况下,我们希望结果图和原始图大小一致此时,我们使用padding(边界填充)增加原始图片的高和宽。 

下面通过图片说明:

蓝色区域5*5原始图片

白色虚线区域是扩充的边框,图片变为7*7

绿色区域结果图像5*5

【python+opencv】图像卷积及滤波_第8张图片

        小结:cv2.filter2D会根据卷积核和原图大小,默认进行填充操作,保证原图和结果图大小一致。

5.padding填充(边界填充)方式

5.1填充为黑色(0)

【python+opencv】图像卷积及滤波_第9张图片

5.2 填充为白色(255)

【python+opencv】图像卷积及滤波_第10张图片

5.3 填充为和原图边界一样的颜色

【python+opencv】图像卷积及滤波_第11张图片

5.4 以边界为对称轴填充

【python+opencv】图像卷积及滤波_第12张图片

6. 特殊的卷积(滤波)

➢均值滤波:卷积核所有元素值相等,且相加为1的卷积操作

➢高斯滤波:一种可用于消除高斯噪声的卷积操作

➢中值滤波:一种可用于消除椒盐噪声的卷积操作

➢双边滤波:一种可用于消除噪声,同时不过多损失清晰度的卷积操作

6.1均值滤波

•有一定去噪功能

•会造成边缘模糊

•可用filter2D实现,需手动构造卷积核

•也可使用cv2.blur,传入原图和卷积核边长

import cv2
import  numpy as np
img=cv2.imread("D:\\desk\\images\\lena02.png")


#均值滤波
#第一种方法:用filter2D构造卷积核
kernel=np.array([[0,0,0],[0,1,0],[0,0,0]])
kernel=kernel/9
#对原图进行卷积
img_filter=cv2.filter2D(img, ddepth=-1,kernel=kernel)     #卷积核的个数,也等于输出特征图的数量

#第二种方法:直接用cv2.blur滤波
median2=cv2.blur(img,(5,5))


#显示结果
cv2.imshow("img",img)
cv2.imshow("img_filter",median2)
cv2.waitKey()      #等待键盘输入,输入任意键返回

6.2高斯滤波

➢消除高斯噪声,最常用的去噪方法

➢同样会造成模糊

dst= cv2.GaussianBlur(src,ksize,sigmaX)

•卷积核通过高斯函数自动计算得到

•src: 输入图像

•ksize: 卷积核边长,格式为(w,h),必须为正奇数  (卷积核越大,图像越模糊)

•sigmaX:X方向上的高斯核标准偏差, 一般设为0

#一般用于消除高斯滤波
import cv2
import  numpy as np
img=cv2.imread("D:\\desk\\images\\lena02.png")
#高斯滤波:卷积核越大,图像越模糊

#高斯滤波,卷积核大小为5*5
denoise5=cv2.GaussianBlur(img,(5,5),0)
#高斯滤波,卷积核大小为11*11
denoise11=cv2.GaussianBlur(img,(11,11),0)

#显示结果
cv2.imshow("img",img)
cv2.imshow("denoise5",denoise5)
cv2.imshow("denoise11",denoise11)

cv2.waitKey()      #等待键盘输入,输入任意键返回

6.3中值滤波

➢对于原图中N*N的局部区域,将像素值排序,取中间大小的像素值放入当前位置

➢没有卷积核的概念

➢对于去除椒盐噪声特别有效

➢可以有效保存边缘信息

dst=cv2.medianBlur(src, ksize)

•src:原图

•ksize:每次覆盖的区域大小,必须是大于1的正奇数

#中值滤波:对于去除椒盐噪声特别有效
import cv2
import  numpy as np
img=cv2.imread("D:\\desk\\images\\lena02_saltPepper.png")

#中值滤波:对于去除椒盐噪声特别有效
img_fiflter=cv2.medianBlur(img,5)      #5为X方向上的高斯核标准偏差


#显示结果
cv2.imshow("img",img)
cv2.imshow("img_fiflter",img_fiflter)

cv2.waitKey()      #等待键盘输入,输入任意键返回

6.4双边滤波

➢计算卷积核权重时,不仅考虑周边像素距离的远近,还考虑像素值和中心像素的相似性,如果周边像素和中心像素像素值差异较大,周边像素的权重就小

➢降低卷积后的图片模糊程度

dst= cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[,borderType])

•src:原图像

•d:卷积核的直径

•sigmaColor:与当前像素点颜色差距大小于该值的像素点,才能参与到卷积中;该值越大,去噪效果越好,但边缘越模糊

•sigmaSpace:只在d会参与到卷积中

import cv2
import  numpy as np
img=cv2.imread("D:\\desk\\images\\lena02.png")

result=cv2.bilateralFilter(img,5,150,150)
imgs=np.hstack([img,result])

#显示结果
cv2.imshow("img",img)
cv2.imshow("imgs",imgs)

cv2.waitKey()      #等待键盘输入,输入任意键返回

你可能感兴趣的:(计算机视觉,实用类,opencv,计算机视觉,图像处理,python)