彻底弄懂高斯模糊,均值模糊和中值模糊

一.均值模糊

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)11111111111

  • 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] 0000000012345001234500123450012345001234500000000919191919191919191


最终的控制台输出为:
[[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]]
  • 7
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值