一.均值模糊
1.什么是均值模糊
均值模糊就是对图像进行算术平均值模糊,比如输入的卷积核维度是3x3,那么这个卷积核就是如图所示:
[
1
9
1
9
1
9
1
9
1
9
1
9
1
9
1
9
1
9
]
\left[\begin{matrix} \frac{1}{9} & \frac{1}{9} & \frac{1}{9}\\ \frac{1}{9} & \frac{1}{9} & \frac{1}{9}\\ \frac{1}{9} & \frac{1}{9} & \frac{1}{9} \end{matrix} \right]
⎣⎡919191919191919191⎦⎤
假设我们传入的
k
s
i
z
e
=
(
k
s
i
z
e
h
,
k
s
i
z
e
w
)
ksize = (ksize_h,ksize_w)
ksize=(ksizeh,ksizew),那么均值模糊的卷积核就是:
1
(
k
s
i
z
e
h
,
k
s
i
z
e
w
)
∗
[
1
1
…
1
1
1
…
1
…
…
…
1
1
1
…
1
]
\frac{1}{(ksize_h,ksize_w)} * \left[\begin{matrix} 1 & 1 & … & 1\\ 1 & 1 & … & 1\\ … & …& … & 1\\ 1 & 1 & … & 1 \end{matrix} \right]
(ksizeh,ksizew)1∗⎣⎢⎢⎡11…111…1…………1111⎦⎥⎥⎤
- blur(src, ksize, dst=None, anchor=None, borderType=None)
- 参数:ksize:卷积核的大小。dst,若填入dst,则将图像写入到dst矩阵。borderType:填充方式
2. 数字化图片演示
def blur_test():
img = np.array([[1, 1, 1, 1, 1],
[2, 2, 2, 2, 2],
[3, 3, 3, 3, 3],
[4, 4, 4, 4, 4],
[5, 5, 5, 5, 5]], dtype=np.float32)
print(img)
dst = cv2.blur(img, (3, 3), borderType=cv2.BORDER_CONSTANT)
# 卷积核为3x3,填充方式为默认0填充
print(dst)
img经过borderType=cv2.BORDER_CONSTANT
的填充之后,结果为
[
0
0
0
0
0
0
0
0
1
1
1
1
1
0
0
2
2
2
2
2
0
0
3
3
3
3
3
0
0
4
4
4
4
4
0
0
5
5
5
5
5
0
0
0
0
0
0
0
0
]
\left[\begin{matrix} 0 & 0 & 0& 0 &0 &0 &0 \\ 0 & 1 & 1& 1 &1 &1 &0 \\ 0 & 2 & 2& 2 &2 &2 &0 \\ 0 & 3 & 3& 3 &3 &3 &0 \\ 0 & 4 & 4& 4 &4 &4 &0 \\ 0 & 5 & 5& 5 &5 &5 &0 \\ 0 & 0 & 0& 0 &0 &0 &0 \\ \end{matrix} \right]
⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡0000000012345001234500123450012345001234500000000⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
(3,3)的卷积核为:
[
1
9
1
9
1
9
1
9
1
9
1
9
1
9
1
9
1
9
]
\left[\begin{matrix} \frac{1}{9} & \frac{1}{9} & \frac{1}{9}\\ \frac{1}{9} & \frac{1}{9} & \frac{1}{9}\\ \frac{1}{9} & \frac{1}{9} & \frac{1}{9} \end{matrix} \right]
⎣⎡919191919191919191⎦⎤
进行卷积运算:
[
0
0
0
0
0
0
0
0
1
1
1
1
1
0
0
2
2
2
2
2
0
0
3
3
3
3
3
0
0
4
4
4
4
4
0
0
5
5
5
5
5
0
0
0
0
0
0
0
0
]
∗
[
1
9
1
9
1
9
1
9
1
9
1
9
1
9
1
9
1
9
]
\left[\begin{matrix} 0 & 0 & 0& 0 &0 &0 &0 \\ 0 & 1 & 1& 1 &1 &1 &0\\ 0 & 2 & 2& 2 &2 &2 &0\\ 0 & 3 & 3& 3 &3 &3 &0\\ 0 & 4 & 4& 4 &4 &4 &0\\ 0 & 5 & 5& 5 &5 &5 &0\\ 0 & 0 & 0& 0 &0 &0 &0\\ \end{matrix} \right] * \left[\begin{matrix} \frac{1}{9} & \frac{1}{9} & \frac{1}{9}\\ \frac{1}{9} & \frac{1}{9} & \frac{1}{9}\\ \frac{1}{9} & \frac{1}{9} & \frac{1}{9} \end{matrix} \right]
⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡0000000012345001234500123450012345001234500000000⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤∗⎣⎡919191919191919191⎦⎤
最终的控制台输出为:
[[1. 1. 1. 1. 1.]
[2. 2. 2. 2. 2.]
[3. 3. 3. 3. 3.]
[4. 4. 4. 4. 4.]
[5. 5. 5. 5. 5.]]
[[0.6666667 1. 1. 1. 0.6666667]
[1.3333334 2. 2. 2. 1.3333334]
[2. 3. 3. 3. 2. ]
[2.6666667 4. 4. 4. 2.6666667]
[2. 3. 3. 3. 2. ]]
3. 真实图片演示
均值模糊用在真正的图片上时:
def mean_blur(image):
src = cv.blur(image,(10,10),borderType=cv.BORDER_CONSTANT)
cv.namedWindow("mean_blur",cv.WINDOW_NORMAL)
cv.imshow("mean_blur",src)
image = cv.imread("test_pic.JPG")
cv.namedWindow('input_image',cv.WINDOW_NORMAL)
cv.imshow('input_image',image)
mean_blur(image)
cv.waitKey(0)
cv.destroyAllWindows()
Output:可以看出左边经过均值模糊之后的图片出现了明显的模糊现象。
4. 补充:填充方式
上文中我们使用默认的填充方式borderType=cv2.BORDER_CONSTANT
,还有好几种填充方式可以使用:具体情况可以参考 python+opencv之边缘填充一文
填充方式 | 解释 |
---|---|
cv.BORDER_REPLICATE | 复制法,即复制最边缘的像素 例如:aaaa/abcdefg/ggggg |
cv.BORDER_REFLECT | 反射法,即以最边缘的像素为对称轴 |
cv.BORDER_WRAP | 外包装法,即以图像的左边界与右边界相连,上下边界相连。 |
cv.BORDER_REFLECT_101 | 反射法,即以最边缘的像素为对称轴 |
想具体知道图片数字化之后的样子可以参考以下代码:
import cv2 as cv
import numpy as np
img = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]], dtype=np.float32)
top_size, bottom_size, left_size, right_size = (1, 1, 1, 1)
replicate = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv.BORDER_REPLICATE)
print(replicate)
output:
[[1. 1. 2. 3. 3.]
[1. 1. 2. 3. 3.]
[4. 4. 5. 6. 6.]
[7. 7. 8. 9. 9.]
[7. 7. 8. 9. 9.]]
二.中值模糊
1. 什么是中值模糊
取卷积核中心的值作为卷积后的新值
- mediaBlur(src, ksize, dst=None)
- 参数:ksize:卷积核的大小。dst,若填入dst,则将图像写入到dst矩阵。
- ⚠️:它没有填充方式的参数,它的默认填充方式为:cv.BORDER_REPLICATE
2. 数字化图片演示
import cv2 as cv
import numpy as np
img = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]], dtype=np.float32)
dst = cv.medianBlur(img, 3)
print(dst)
Output:
[[2. 3. 3.]
[4. 5. 6.]
[7. 7. 8.]]
先将输入的图片 [ 1 2 3 4 5 6 7 8 9 ] \left[\begin{matrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \\ \end{matrix} \right] ⎣⎡147258369⎦⎤进行cv.BORDER_REPLICATE填充: [ 1 1 2 3 3 1 1 2 3 3 4 4 5 6 6 7 7 8 9 9 7 7 8 9 9 ] \left[\begin{matrix} 1 & 1 &2 &3 &3\\ 1 & 1 &2 &3 &3\\ 4 & 4 &5 &6 &6\\ 7 & 7 &8 &9 &9\\ 7 & 7 &8 &9 &9\\ \end{matrix} \right] ⎣⎢⎢⎢⎢⎡1147711477225883369933699⎦⎥⎥⎥⎥⎤再将3x3的卷积核中心值挑出来,就为最终结果。
三.高斯模糊
def Gauss_blur():
img = np.array([[14, 15, 16],
[24, 25, 26],
[34, 35, 36]], dtype=np.float32)
blur = cv2.GaussianBlur(img, (3, 3), 1.5)
print(blur)
Gauss_blur()
# output:
[[20.771631 21.156027 21.540426]
[24.615604 25. 25.3844 ]
[28.45958 28.843975 29.228374]]