python + opencv图像处理(八)——模糊操作

本文详细介绍了模糊操作的基本原理,包括基于离散卷积的实现方式,并探讨了不同卷积核如何产生多样化的模糊效果。具体展示了均值模糊、中值模糊及自定义模糊的Python代码实现,对比了各种模糊技术在图像处理中的应用效果。

模糊操作基本原理:
1、基于离散卷积
2、定义好每个卷积核
3、不同卷积核得到不同的卷积效果
4、模糊是卷积的一种表象
分别有:均值模糊、中值模糊、自定义模糊

from cv2 import cv2 as cv
import numpy as np 

# 均值模糊 可以去噪
def blur_demo(image):
    dst = cv.blur(image,(5,5))  # 水平和垂直方向进行操作 常用(5,,5)
    cv.imshow("blur_demo",dst)

# 中值模糊 可以去噪  对于椒盐去噪效果比均值模糊好
def median_blur_demo(image):
    dst = cv.medianBlur(image,5)
    cv.imshow("median_blur_demo",dst)

# 自定义模糊
def custom_blur_demo(image):
    # kernel = np.ones([5,5],np.float32)/25
    # 根据前面知识进行修改
    # 可修改数组中的值  # 锐化
    kernel = np.array([[1,1,1],[1,1,1],[1,1,1]],np.float32)/9  # 这是3*3的数组,故为9
    dst = cv.filter2D(image,-1,kernel=kernel)
    cv.imshow('custom_demo',dst)

if __name__ == "__main__":
    filepath = "C:\\pictures\\person.jpg"
    img = cv.imread(filepath)       # blue green red
    cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
    cv.imshow("input image",img)

    blur_demo(img)
    median_blur_demo(img)
    custom_blur_demo(img)

    cv.waitKey(0)
    cv.destroyAllWindows()

各个模糊后的结果以及原图
左:中值模糊
右:自定义模糊

在这里插入图片描述
左:均值模糊
右:原图
在这里插入图片描述

第一课: import cv2 as cv import numpy as np #均值模糊,作用:去噪声 def blur_demo(image): dst= cv.blur(image,(3,3)) cv.imshow("blur_win",dst) #去掉椒盐噪声 def median_blur(image): dst =cv.medianBlur(image,5) cv.imshow("median_blur_win",dst) def custom_blur_demo(image): #kernel = np.array([[1,1,1],[1,1,1],[1,1,1]],np.float32)/9 #kernel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]],np.float32) kernel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]],np.float32) dst = cv.filter2D(image,-1,kernel) cv.imshow("custom_blur_demo",dst) src = cv.imread("E:/opencv/picture/test3.jpg") cv.imshow("initial_win",src) blur_demo(src) median_blur(src) custom_blur_demo(src) cv.waitKey(0) cv.destroyAllWindows() 分析: 1. 均值滤波:cv.blur(src,ksize):去噪声 注:这里的ksize是个(x,y)形式 卷积过程: 6*6上面是个3*3的窗口,从上向下移动,黄色的每个像素点值之和取平均值赋给中心红色像素作为它卷积处理之后的的新的像素值,每次移动一个像素格! 2. 中值滤波:cv.median_blur(srcm,ksize):对于去椒盐噪声很有用 注:这里的ksize是个x数值形式 举个例子:我们在图像中去3*3的矩阵,里面有9个像素点,我们将9个像素进行排序,最后将这个矩阵的中心点赋值为这九个像素的中值。 3. 用户自定义模糊 所用函数:filter2D() 函数原型: filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]]) -> dst src参数表示待处理的输入图像。 ddepth参数表示目标图像深度,输入值为-1时,目标图像和原图像深度保持一致 kernel: 卷积核(或者是相关核),一个单通道浮点型矩阵。修改kernel矩阵即可实现不同的模糊 分析: 1. kernel的大小应该是奇数,这样它才有一个中心点 2. 滤波器矩阵所有的元素之和应该要等于1,这是为了保证滤波前后图像的亮度保持不变。 3. 我们也可以用filt2D的方法实现均值滤波。 如 kernel = np.array([[1,1,1],[1,1,1],[1,1,1]],np.float32)/9 注意:这里kernel的运算一定要除以9哦。 4. 当然也有其它的kernel可以用于其它图像处理 kernel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]],np.float32) 该kernel用于锐化图像。 第二课: import cv2 as cv import numpy as np def clamp(pv): if pv>255: return 255 else: return pv def gaussian_noise(image): h,w,ch= image.shape for row in range(h): for col in range(w): s = np.random.normal(0, 20, 3) b = image[row, col, 0] g = image[row, col, 1] r = image[row, col, 2] image[row,col,0] =clamp(b +s[0]) image[row, col, 1] = clamp(g + s[1]) image[row, col, 2] = clamp(r + s[2]) cv.imshow("gaussian_win",image) src = cv.imread("E:/opencv/picture/lena.jpg") cv.imshow("initial_win",src) gaussian_noise(src) dst = cv.GaussianBlur(src,(0,0),2) cv.imshow("dst_win",dst) cv.waitKey(0) cv.destroyAllWindows() 分析: 1. 如何在图像中制造噪声? 答:在源图像的每个像素上加上个随机值就会出现噪声线性。 这里我们还是使用逐个像素点改变像素值的办法来处理的,用了两层for嵌套: for row in range(h): for col in range(w): 接着就是要改变像素值了,我们使用了随机数指令: s = np.random.normal(0,15,3) 该指令分析如下: numpy.random.normal(loc=0.0, scale=1.0, size=None) 参数一:概率分布的均值,对应着整个分布的中心center 参数二:概率分布的标准差,对应于分布的宽度,scale越大越矮胖,反之越瘦高 参数三:输出值shape,默认是输出一个值,因为这里我们要改变各个像素点各个通道的数值,所以这里设置为3。 这块的源码是这样的: def guess_noise(image): h,w= image.shape[0:2] for row in range(h): for col in range(w): s = np.random.normal(0,15,3) b = image[row,col,0] g = image[row,col,1] r = image[row,col,2] image[row,col,0] = b+s[0] image[row,col,1] = g+s[1] image[row,col,2] = r+s[2] cv.imshow("noise_win",image) 2. 高斯模糊: 加强版的均值模糊(均值模糊只是线性模糊) 高斯模糊实质上就是一种均值模糊,只是高斯模糊是按照加权平均的,距离越近的点权重越大,距离越远的点权重越小。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。 api指令: GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) 参数一:待处理的输入图像 参数二:高斯滤波器模板大小。其中ksize.width和ksize.height可以不同,但它们必须是正数和奇数。或者它们可以是(0,0),然后从第三个参数计算出来。 参数三:表示X方向上的高斯内核标准差 参数四:表示Y方向上的高斯内核标准差。如果参数四为0,则设置为等于参数三,如果这两个参数均为零,则分别从ksize.width和ksize.height计算得到。 注:若ksize不为(0,0)则按照ksize计算,后面的参数三,参数四无意义。若ksize为(0,0)则根据后面的参数三计算ksize 故一般来说设置成cv.GaussianBlur(src,(0,0),3) 或者是dst = cv.GaussianBlur(src,(3,3),0) 都行 第三课、高斯双边模糊 import cv2 as cv import numpy as np def bl_demo(image): dst = cv.bilateralFilter(image,0,100,15) cv.imshow("dst_win",dst) def shift_demo(image): dst = cv.pyrMeanShiftFiltering(image,10,50) cv.imshow("shift_demo",dst) src = cv.imread("E:/opencv/picture/lena.jpg") cv.imshow("inital_win",src) #bl_demo(src) shift_demo(src) cv.waitKey(0) cv.destroyAllWindows() 1. 高斯双边模糊:加强版的高斯模糊,保留了边界信息 cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) → dst 双边滤波器可以去除无关噪声,同时保持较好的边缘信息。 但是,其速度比绝大多数滤波器都慢。 在局部上,就是在灰度值差异不大的区域平滑,在灰度值差异比较大的边界地区保留边界。所以双边滤波器作用于每个像素的同时,必然会受到领域像素点的距离、灰度值差的权重影响。 参数一:输入源 参数二:一般写0就行 参数三(作用于色差):色彩空间的sigma参数,该参数较大时,各像素邻域内相距较远的颜色会被混合到一起,从而造成更大范围的半相等颜色)。 这个参数决定多少差值之内的像素会被计算,而大于这个差值的,我们就认为是边缘区域需要保留该区域像素值。color差异一般我们希望它大一点。 参数四(作用于距离):坐标空间的sigma参数,该参数较大时,只要颜色相近,越远的像素会相互影响。space差异一般我们希望它小一点。 2. 偏移高斯模糊
### Python OpenCV 图像处理教程系列 #### 一、基础知识与环境搭建 对于希望深入了解Python OpenCV图像处理技术的学习者而言,掌握基础知识和正确配置开发环境至关重要。学习者应熟悉Python编程语言以及OpenCV库的基本操作,包括但不限于读取图片文件、显示图片窗口等功能[^1]。 ```python import cv2 # 加载一张彩色图像 img = cv2.imread('image.jpg', 1) # 显示图像 cv2.imshow('Image Window Title', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` #### 二、高级技巧探索 当掌握了基本概念之后,可以进一步研究更复杂的主题,比如图像变换、增强及复原等方面的内容。这些技能能够帮助开发者实现诸如旋转、缩放、滤波等多种效果,在实际应用中有广泛用途。 - **图像变换** 对于图像变换这一领域来说,它涵盖了仿射变换(Affine Transformation)、透视变换(Perspective Transformation)等多个方面。利用OpenCV提供的函数接口,用户可以根据需求轻松完成不同类型的几何变化任务。 - **图像增强** 提升视觉质量也是图像处理的重要目标之一。通过调整亮度对比度参数或是采用直方图均衡化等手段,可以使原始素材变得更加清晰易辨认。 - **图像复原** 面对受损或模糊不清的照片资料时,则需借助专门设计的修复算法来进行补救工作。去噪、超分辨率重建都是常见且有效的恢复措施。 #### 三、实践案例分析 理论联系实际是巩固所学知识的有效途径。参考具体实例有助于加深理解并积累实战经验。例如,在GitHub平台上存在许多开源项目可供借鉴学习;其中不乏高质量的作品展示了丰富的应用场景和技术细节[^2]。 此外,还有针对特定场景下的优化方案值得探讨——如图像叠加效果制作过程中的透明度控制策略就涉及到一系列有趣的技术要点[^3]: ```python import numpy as np import cv2 def blend_images(img1, img2, alpha=0.5): """Blend two images with given transparency factor.""" beta = (1.0 - alpha) dst = cv2.addWeighted(img1, alpha, img2, beta, 0.0) return dst # Create a list of blending factors from 0 to 1 by steps of 0.02. step_list = [float(0.02 * x) for x in range(0, 51)] for i in step_list: blended_img = blend_images(image_1, image_2, i) # Display or save the result... ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiao黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值