opencv学习七:利用卷积对图像模糊处理

模糊操作

方法:均值模糊,中值模糊,自定义模糊
模糊原理:
基于离散卷积,不同的卷积得到不同的卷积效果,模糊是卷积的表象。

卷积原理:
(2乘1+3乘以1+6乘以1)除以3=3
边缘2和1未被卷积保留
边缘不参与卷积直接保留。这个应该是均值模糊
在这里插入图片描述参考博客:OpenCV—模糊操作

1.均值模糊:

代码如下:

import cv2 as cv
import numpy as np

#均值模糊:去除随机噪声
def blur_demo(image):
    dst = cv.blur(image, (5, 5))#ksize是卷积核大小1行3列,列数越大模糊越大
    cv.imshow("blur_demo", dst)
    
src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/lena.jpg")  #读取图片位置
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
blur_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

运行截图:
在这里插入图片描述1.均值模糊函数blur():定义:blur(src,ksize,dst=None, anchor=None, borderType=None)

定义是有5个参数,但最后三个均为none,所以也就2个参数
src:要处理的原图像
ksize: 周围关联的像素的范围:代码中(5,5)就是9*5的大小,就是计算这些范围内的均值来确定中心位置的大小

opencv有一个专门的平均滤波模板供使用–归一化卷积模板,所有的滤波模板都是使卷积框覆盖区域所有像素点与模板相乘后得到的值作为中心像素的值。
Opencv中均值模板可以用cv2.blur和cv2.boxFilter,比如一个3*3的模板其实就可以如下表示:

在这里插入图片描述
模板大小是m*n是可以设置的。如果你不想要前面的1/9,可以使用非归一化的模板cv2.boxFilter。

2.中值模糊mediaBlur
中值滤波模板就是用卷积框中像素的中值代替中心值,达到去噪声的目的。
这个模板一般用于去除椒盐噪声。
前面的滤波器都是用计算得到的一个新值来取代中心像素的值,而中值滤波是用中心像素周围(也可以使他本身)的值来取代他,卷积核的大小也是个奇数。
代码如下:

import cv2 as cv
import numpy as np
#中值模糊,对于椒盐噪声的去噪效果好,去掉图片中的一些黑点等
def median_blur_demo(image):
    dst = cv.medianBlur(image, 5)#ksize是卷积核大小1行3列,列数越大模糊越大
    cv.imshow("median_blur_demo", dst)
src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/lena.jpg")  #读取图片位置
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
median_blur_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
    

运行截图:
在这里插入图片描述这张没什么噪点,所以效果不明显,还是喜欢这个例子:
去噪点

中值模糊函数medianBlur(): 定义:medianBlur(src, ksize, dst=None)
ksize与blur()函数不同,不是矩阵,而是一个数字,例如为5,就表示了5*5的方阵

3.自定义模糊filter2D(上面是封装在2D滤波器之上)
图像滤波函数imfilter函数的应用及其扩展
Opencv提供的一个通用的2D滤波函数为cv2.filter2D(),
滤波函数的使用需要一个核模板,对图像的滤波操作过程为:将和模板放在图像的一个像素A上,求与之对应的图像上的每个像素点的和,
核不同,得到的结果不同,而滤波的使用核心也是对于这个核模板的使用,需要注意的是,该滤波函数是单通道运算的,
也就是说对于彩色图像的滤波,需要将彩色图像的各个通道提取出来,对各个通道分别滤波才行。
3.1实现中值模糊
代码如下:

import cv2 as cv
import numpy as np

#自定义模糊
def custom_blur_demo(image):
    kernel = np.ones([5, 5], np.float32)/25#声明二维数组5*5,初始化1,保证值不溢出,除以数组大小,实现中值模糊  自定义卷积核的算子
    dst = cv.filter2D(image, -1, kernel=kernel)
    cv.imshow("custom_blur_demo", dst)

src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/lena.jpg")  #读取图片位置
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
custom_blur_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

上述生成的5*5核模板其实就是一个均值滤波。,当我们是/25就是中值滤波,归一化处理

运行截图:
在这里插入图片描述使用的函数为:filter2D():定义为filter2D(src,ddepth,kernel)

ddepth:深度,输入值为-1时,目标图像和原图像深度保持一致
kernel: 卷积核(或者是相关核),一个单通道浮点型矩阵
修改kernel矩阵即可实现不同的模糊

3.2 实现锐化处理
代码如下:

import cv2 as cv
import numpy as np

#自定义模糊
def custom_blur_demo(image):
    kernel = np.array(([[0, -1, 0], [-1, 5, -1], [0, -1, 0]]), np.float32)
    #中间的像素比重为5 其他和为0和-1 总权重为1,算子自定义取值。总和为0:做边缘梯度。总和为1:做锐化增强
    dst = cv.filter2D(image, -1, kernel=kernel)
    cv.imshow("custom_blur_demo", dst)

src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/lena.jpg")  #读取图片位置
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
custom_blur_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

运行截图:
在这里插入图片描述刚学有好多地方还不是很懂,后续慢慢补充

猜你喜欢

转载自blog.csdn.net/weixin_44145452/article/details/112462955
今日推荐