Python+OpenCV图像处理(七)—— 滤波与模糊操作

  过滤是信号和图像处理中基本的任务。其目的是根据应用环境的不同,选择性的提取图像中某些认为是重要的信息。过滤可以移除图像中的噪音、提取感兴趣的可视特征、允许图像重采样等等。频域分析将图像分成从低频到高频的不同部分。低频对应图像强度变化小的区域,而高频是图像强度变化非常大的区域。在频率分析领域的框架中,滤波器是一个用来增强图像中某个波段或频率并阻塞(或降低)其他频率波段的操作。低通滤波器是消除图像中高频部分,但保留低频部分。高通滤波器消除低频部分。参考博客:https://blog.csdn.net/sunny2038/article/details/9155893

  个人认为模糊操作就是过滤掉图像中的一些特殊噪音。

  具体模糊和滤波的关系如下图:参考知乎大神:https://www.zhihu.com/question/54918332/answer/142137732

  

一、均值模糊、中值模糊、用户自定义模糊

代码如下:

#均值模糊、中值模糊、自定义模糊    模糊是卷积的一种表象
import cv2 as cv
import numpy as np

def blur_demo(image):      #均值模糊  去随机噪声有很好的去燥效果
    dst = cv.blur(image, (1, 15))    #(1, 15)是垂直方向模糊,(15, 1)还水平方向模糊
    cv.namedWindow(‘blur_demo‘, cv.WINDOW_NORMAL)
    cv.imshow("blur_demo", dst)

def median_blur_demo(image):    # 中值模糊  对椒盐噪声有很好的去燥效果
    dst = cv.medianBlur(image, 5)
    cv.namedWindow(‘median_blur_demo‘, cv.WINDOW_NORMAL)
    cv.imshow("median_blur_demo", dst)

def custom_blur_demo(image):    # 用户自定义模糊
    kernel = np.ones([5, 5], np.float32)/25   #除以25是防止数值溢出 
    dst = cv.filter2D(image, -1, kernel)
    cv.namedWindow(‘custom_blur_demo‘, cv.WINDOW_NORMAL)
    cv.imshow("custom_blur_demo", dst)

src = cv.imread(‘E:\imageload\lenanoise.jpg‘)
cv.namedWindow(‘input_image‘, cv.WINDOW_NORMAL)
cv.imshow(‘input_image‘, src)

blur_demo(src)
median_blur_demo(src)
custom_blur_demo(src)

cv.waitKey(0)
cv.destroyAllWindows()

运行结果:

注意:

1.均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。

低通滤波(均值模糊)函数原型:blur(src, ksize[, dst[, anchor[, borderType]]]) -> dst

src参数表示待处理的输入图像。

ksize参数表示模糊内核大小。比如(1,15)表示生成的模糊内核是一个1*15的矩阵。

dst参数表示输出与src相同大小和类型的图像。

anchor参数、borderType参数可忽略

2.中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。具体原理参见博客:https://blog.csdn.net/weixin_37720172/article/details/72627543

中值滤波(中值模糊)函数原型:medianBlur(src, ksize[, dst]) -> dst

src参数表示待处理的输入图像。

ksize参数表示滤波窗口尺寸,必须是奇数并且大于1。比如这里是5,中值滤波器就会使用5×5的范围来计算,即对像素的中心值及其5×5邻域组成了一个数值集,对其进行处理计算,当前像素被其中值替换掉。

dst参数表示输出与src相同大小和类型的图像。

3.用户自定义模糊

所用函数:filter2D()

函数原型: filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]]) -> dst

src参数表示待处理的输入图像。

ddepth参数表示目标图像深度,输入值为-1时,目标图像和原图像深度保持一致

kernel: 卷积核(或者是相关核),一个单通道浮点型矩阵。修改kernel矩阵即可实现不同的模糊

二、高斯模糊

代码如下:

#高斯模糊    轮廓还在,保留图像的主要特征  高斯模糊比均值模糊去噪效果好
import cv2 as cv
import numpy as np

def clamp(pv):
    if pv > 255:
        return 255
    if pv < 0:
        return 0
    else:
        return pv

def gaussian_noise(image):        #加高斯噪声
    h, w, c = image.shape
    for row in range(h):
        for col in range(w):
            s = np.random.normal(0, 20, 3)
            b = image[row, col, 0]   #blue
            g = image[row, col, 1]   #green
            r = image[row, col, 2]   #red
            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.namedWindow("noise image", cv.WINDOW_NORMAL)
    cv.imshow("noise image", image)
    dst = cv.GaussianBlur(image, (15, 15), 0)  # 高斯模糊
    cv.namedWindow("Gaussian", cv.WINDOW_NORMAL)
    cv.imshow("Gaussian", dst)

src = cv.imread(‘E:\imageload\lena.jpg‘)
cv.namedWindow("input_image", cv.WINDOW_NORMAL)
cv.imshow(‘input_image‘, src)

gaussian_noise(src)
dst = cv.GaussianBlur(src, (15,15), 0)   #高斯模糊
cv.namedWindow("Gaussian Blur", cv.WINDOW_NORMAL)
cv.imshow("Gaussian Blur", dst)

cv.waitKey(0)
cv.destroyAllWindows()

运行结果:

注意:

1.高斯模糊实质上就是一种均值模糊,只是高斯模糊是按照加权平均的,距离越近的点权重越大,距离越远的点权重越小。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。

2.高斯分布的一维和二维原理如下:

  补:高斯分布的标准差σ。标准差代表着数据的离散程度,如果σ较小,那么生成的模板的中心系数较大,而周围的系数较小,这样对图像的平滑效果就不是很明显;反之,σ较大,则生成的模板的各个系数相差就不是很大,比较类似均值模板,对图像的平滑效果比较明显。高斯模糊具体原理见博文:https://blog.csdn.net/u012992171/article/details/51023768

3.高斯模糊GaussianBlur函数原型:GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) -> dst

src参数表示待处理的输入图像。

ksize参数表示高斯滤波器模板大小。 ksize.width和ksize.height可以不同,但它们都必须是正数和奇数。或者,它们可以是零,即(0, 0),然后从σ计算出来。

sigmaX参数表示 X方向上的高斯内核标准差。

sigmaY参数表示 Y方向上的高斯内核标准差。 如果sigmaY为零,则设置为等于sigmaX,如果两个sigma均为零,则分别从ksize.width和ksize.height计算得到。

  补:若ksize不为(0, 0),则按照ksize计算,后面的sigmaX没有意义。若ksize为(0, 0),则根据后面的sigmaX计算ksize

4.numpy包里的random模块用于生成随机数,random模块里的normal函数表示的是生成高斯随机数。

normal函数默认原型:normal(loc=0.0, scale=1.0, size=None)。

loc参数表示高斯分布的中心点。

scale参数表示高斯分布的标准差σ。

size参数表示产生随机数的个数。size取值可以为(m,n,k),表示绘制m*n*k个样本。

三、边缘保留滤波EPF

  进行边缘保留滤波通常用到两个方法:高斯双边滤波和均值迁移滤波。

代码如下:

#边缘保留滤波(EPF)  高斯双边、均值迁移
import cv2 as cv
import numpy as np

def bi_demo(image):   #双边滤波
    dst = cv.bilateralFilter(image, 0, 100, 15)
    cv.namedWindow("bi_demo", cv.WINDOW_NORMAL)
    cv.imshow("bi_demo", dst)

def shift_demo(image):   #均值迁移
    dst = cv.pyrMeanShiftFiltering(image, 10, 50)
    cv.namedWindow("shift_demo", cv.WINDOW_NORMAL)
    cv.imshow("shift_demo", dst)

src = cv.imread(‘E:/imageload/example.png‘)
cv.namedWindow(‘input_image‘, cv.WINDOW_NORMAL)
cv.imshow(‘input_image‘, src)

bi_demo(src)
shift_demo(src)

cv.waitKey(0)
cv.destroyAllWindows()

运行结果:

注意:

1.双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波

2.双边滤波函数原型:bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) -> dst

src参数表示待处理的输入图像。

d参数表示在过滤期间使用的每个像素邻域的直径。如果输入d非0,则sigmaSpace由d计算得出,如果sigmaColor没输入,则sigmaColor由sigmaSpace计算得出。

sigmaColor参数表示色彩空间的标准方差,一般尽可能大。较大的参数值意味着像素邻域内较远的颜色会混合在一起,从而产生更大面积的半相等颜色。

sigmaSpace参数表示坐标空间的标准方差(像素单位),一般尽可能小。参数值越大意味着只要它们的颜色足够接近,越远的像素都会相互影响。当d > 0时,它指定邻域大小而不考虑sigmaSpace。 否则,d与sigmaSpace成正比。

双边滤波原理:

https://blog.csdn.net/edogawachia/article/details/78837988https://blog.csdn.net/MoFMan/article/details/77482794   ,https://www.cnblogs.com/qiqibaby/p/5296681.html  反正我是没怎么看懂o(╥﹏╥)o

3.均值漂移pyrMeanShiftFiltering函数原型:pyrMeanShiftFiltering(src, sp, sr[, dst[, maxLevel[, termcrit]]]) -> dst

src参数表示输入图像,8位,三通道图像。

sp参数表示漂移物理空间半径大小。

sr参数表示 漂移色彩空间半径大小。

maxLevel参数表示金字塔的最大层数。

termcrit参数表示漂移迭代终止条件。

均值漂移原理:

https://blog.csdn.net/dcrmg/article/details/52705087

https://blog.csdn.net/qq_23968185/article/details/51804574

https://blog.csdn.net/jinshengtao/article/details/30258833

原文地址:https://www.cnblogs.com/FHC1994/p/9097231.html

时间: 2024-10-10 15:43:55

Python+OpenCV图像处理(七)—— 滤波与模糊操作的相关文章

Python+OpenCV图像处理(一)——读取显示一张图片

配置好所有环境后,开始利用python+opencv进行图像处理第一步. 读取和显示一张图片: import cv2 as cv src=cv.imread('E:\imageload\example.png') cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE) cv.imshow('input_image', src) cv.waitKey(0) cv.destroyAllWindows() 输出效果: 代码解释: src=cv.imread(

Python OpenCV 实现图像滤波

一.实验过程 我使用的是python语言+openCV来实现图像滤波. 使用imread()函数读取图片,使用imshow()函数显示图片,waitKey()函数含义为按下任意键继续: 代码示例: img = cv2.imread("photo1.bmp") cv2.imshow("img",img) cv2.waitKey(0) 结果: 我们可以用pil来实现在图片上显示文字,首先先安装pillow 实例代码: #cv2和PIL中颜色的hex码的储存顺序不同,需转

Python+OpenCV图像处理之开闭操作

开操作:图像形态学的重要操纵之一,基于膨胀与腐蚀操作组合形成的:主要是应用在二值图像分析中,灰度图像亦可 开操作 = 腐蚀+膨胀 ,输入图像 + 结构元素 作用:用来消除小物体.平滑较大物体的边界的同时并不明显改变其面积,提取水平或竖直的线 闭操作:图像形态学的重要操纵之一,基于膨胀与腐蚀操作组合形成的:主要是应用在二值图像分析中,灰度图像亦可 闭操作 = 膨胀+腐蚀 ,输入图像 + 结构元素 作用:用来填充物体内细小空洞.连接邻近物体.平滑其边界的同时并不明显改变其面积 python实现 im

python+opencv图像处理(一)

一.什么是opencv?  Open Source Computer Vision Library.OpenCV于1999年由Intel建立,如今由Willow Garage提供支持.OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.MacOS操作系统上.它轻量级而且高效--由一系列 C 函数和少量C++类构成,同时提供了Python.Ruby.MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法.最新版本是3.1 ,201

Python+OpenCV图像处理之模板匹配

模板匹配就是在整个图像区域中发现与给定子图像匹配的小块区域 在OpenCV中,提供了相应的函数完成这个操作: matchTemplate 函数:在模板和输入图像之间寻找匹配,获得匹配结果图像 minMaxLoc 函数:在给定的矩阵中寻找最大和最小值,并给出它们的位置 几种常见的模板匹配算法: ①TM_SQDIFF是平方差匹配:TM_SQDIFF_NORMED是标准平方差匹配.利用平方差来进行匹配,最好匹配为0.匹配越差,匹配值越大. ②TM_CCORR是相关性匹配:TM_CCORR_NORMED

Python+OpenCV图像处理(五)—— ROI与泛洪填充

一.ROI ROI(region of interest),感兴趣区域.机器视觉.图像处理中,从被处理的图像以方框.圆.椭圆.不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI. 代码如下: #进行图片截取.合并.填充 import cv2 as cv src=cv.imread('E:\imageload\lena.jpg') cv.namedWindow('first_image', cv.WINDOW_AUTOSIZE) cv.imshow('first_image', src

Python+OpenCV图像处理(十四)—— 直线检测

简介: 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等).最基本的霍夫变换是从黑白图像中检测直线(线段). 2.Hough变换的原理是将特定图形上的点变换到一组参数空间上,根据参数空间点的累计结果找到一个极大值对应的解,那么这个解就对应着要寻找的几何形状的参数(比如说直线,那么就会得到直线的斜率k与常熟b,圆就会得到圆心与半径等等) 3.霍夫线变

Python+OpenCV图像处理之直线检测

霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等). python实现 import cv2 import numpy as np # 使用霍夫直线变换做直线检测,前提条件:边缘检测已经完成 __author__ = "boboa" # 标准霍夫线变换 def line_detection_demo(image): gray = cv2.cvtColor(image, cv2.COLO

Python+OpenCV图像处理之圆检测

霍夫变换不仅可以用来检测直线,同样也可以用来检测圆 python实现 import cv2 import numpy as np __author__ = "boboa" def detect_circles_demo(image): dst = cv2.pyrMeanShiftFiltering(image, 10, 100) # 均值偏移滤波 cimage = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY) circles = cv2.HoughCirc