准备工作
读取灰度图的方法:
1 | img = imread(<path>,cv2.IMREAD_GRAYSCALE); |
滤波操作
来,咱们首先产生些噪点
1 | import cv2; |
均值滤波
原理是将像素点本身,以及像素点周围的八个像素(共九个像素)取平均数
例如图像
21 | 37 | 42 |
---|---|---|
52 | 244 | 212 |
112 | 24 | 58 |
对中间像素(244)进行均值滤波的过程就是
$\overline{x}=\frac{21+37+42+52+244+212+112+24+58}{9}$
它的卷积核是这样的
$
\left(
\begin{matrix}
1 & 1 & 1 \
1 & 1 & 1 \
1 & 1 & 1
\end{matrix}
\right)
$
如此往复,把整张图片遍历即可得到滤波后的图形
1 | import cv2; |
均值滤波的缺点:会导致图片变模糊
高斯滤波
这是高斯滤波公式
$
G(x,y) = \frac{1}{2 \pi \sigma^{2}} \exp\left(-\frac{x^{2}+y^{2}}{2\sigma^{2}}\right)
$
下面是计算高斯核元素的公式
$G(i, j)=\frac{1}{2\pi\sigma^{2}}\exp\left(-\frac{(i - c_x)^{2}+(j - c_y)^{2}}{2\sigma^{2}}\right)$
分别令k和sigema=1后,为了使得权系数为1,需要进行归一化,然后得到的高斯滤波的一个3*3的卷积核是这样的
$
\left(
\begin{matrix}
0.0751 & 0.1238 & 0.751 \
0.1238 & 0.2042 & 0.1238 \
0.7511 & 0.1238 & 0.0751
\end{matrix}
\right)
$
通过观察可以知道,离中间像素最近的元素的权重比边角的权重数值要大,也即高斯滤波是加权平均版本的均值滤波
还好还好,这些复杂的公式不用我们自己算,可以直接食用OpenCV封装好的函数
1 | import cv2; |
中值滤波
这种滤波方式比较简单,我们把均值滤波的表格拿下来
21 | 37 | 42 |
---|---|---|
52 | 244 | 212 |
112 | 24 | 58 |
把这些数字从小到大排序得到
21 24 37 42 52 58 112 212 244
52就是这组数据的中间值,那么就把表格中间(2,2)的位置替换成52得到
21 | 37 | 42 |
---|---|---|
52 | 52 | 212 |
112 | 24 | 58 |
就结束了
1 | import cv2; |
互逆运算——腐蚀与膨胀
需要注意的是:腐蚀、膨胀以及开闭运算需要在二值化图像上进行,并且腐蚀并不绝对是腐蚀(也有可能erode函数操作出来的图像是dilate的效果),具体需要看二值化的方法,由于我的图像轮廓线是纯黑色,因此直接使用,imgres = cv2.threshold(img,127,255,cv2.THRESH_BINARY);来进行二值化的话就会出现腐蚀函数算出膨胀效果,因此我们需要将二值化进行反相,也就是这样转换,imgres = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV);
腐蚀
腐蚀就是将卷积核跟二值化图像进行“与”运算,当卷积核覆盖的范围不是全1时,会将卷积核所覆盖的内容全部置0,例如当图像的某一3*3范围内有这样一组数据,
0 | 1 | 1 |
---|---|---|
1 | 0 | 0 |
1 | 1 | 1 |
那么腐蚀运算会把它们都变成纯0,通过腐蚀运算,我们可以将图像的边缘部分向内“腐蚀”
1 | kernel = np.ones((3,3), np.uint8) #新建一个核 |
膨胀
膨胀是与腐蚀运算相反的运算,它是将卷积核跟二值化图像进行“或”运算,也就是说,只要卷积核所覆盖的区域中包含“1”的话,那么整个范围都会被置1,正好与腐蚀运算相反
1 | kernel = np.ones((5,5), np.uint8) #新建一个核 |
开运算、闭运算
开运算是先进行腐蚀、再进行膨胀
闭运算是先进行膨胀、后进行腐蚀
1 | open = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) |
形态学梯度
形态学梯度=膨胀结果-腐蚀结果
也就是说,形态学梯度就是图像的边缘
1 | gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) |
边缘检测——Sobel算子
左:阈值为127,最大值255的二值化图像
中:灰度图
右:使用Sobel算子对二值化图像处理