opencv 图像滤波,使用opencv和python实现图像的智能处理

  opencv 图像滤波,使用opencv和python实现图像的智能处理

  图像滤波按图像域可分为两种:邻域滤波和频域滤波。根据图像频率,滤波效果可分为低通滤波和高通滤波两种。本文将通过一个案例详细介绍OpenCV中图像过滤的特效,有需要的可以参考。

  00-1010 1分类2邻域滤波2.1线性滤波2.2非线性滤波3频域滤波3.1低通滤波3.2高通滤波

  

目录

  根据图像域,图像滤波可以分为两种类型:

  空域滤波的本质是数字窗口上的数学运算。一般用于图像平滑、图像锐化、特征提取(如纹理测量、边缘检测)等。邻域过滤使用邻域算子3354来确定给定像素的最终输出。其本质是修改像素频率。一般用于降噪、重采样、图像压缩等。根据图像频率,滤波效果可分为两种:

  低通滤波。滤除原图像的高频成分,即模糊图像的边缘和细节。高通滤波。滤除原始图像的低频成分,即锐化图像。导入原始图像和噪声图像

  进口cv2,撇除

  将numpy作为np导入

  #原图

  srcImg=cv2.imread(test.jpg )

  cv2.imshow(src image ,srcImg)

  #给图像添加高斯噪声

  noise img=skim age . util . random _ noise(Sr cimg,mode=gaussian )

  cv2.imshow(带噪声的图像,noiseImg)

  其中噪声是可选的。

  高斯:高斯加性噪声localvar:高斯加性噪声,每个点都有特定的局部方差泊松:泊松分布噪声盐:盐噪声,用1随机替换像素胡椒:胡椒噪声,用0或-1随机替换像素sp:椒盐噪声,显示黑白噪声。

  

1 分类

  

2 邻域滤波

  线性邻域滤波意味着像素的输出值取决于输入区域中像素的加权和。以下是一些常见的线性过滤运算符。

  箱式过滤

  箱式过滤器,其核函数为:

  非归一化块滤波用于计算每个像素邻域中的积分特征,例如在密集光流算法中使用的逆图像的协方差矩阵。

  归一化块滤波是模糊滤波,即邻域平均法3354使用图像区域中每个像素的平均值来代替原始图像中的每个像素值。平均滤波用于图像平滑,但不仅能降低噪声,而且破坏了图像的边缘细节,使图像模糊,降噪能力差。

  执行块过滤

  #箱式过滤

  boxImg=cv2.boxFilter(noiseImg,ddepth=-1,ksize=(2,2),normalize=False)

  cv2.imshow(框图像,boxImg)

  #均值滤波

  blurImg=cv2.blur(noiseImg,(6,5))

  cv2.imshow(模糊图像,模糊)

  如果将块过滤器内核设定为(6,5)并归一化,效果与均值过滤器相同。

  高斯滤波

  高斯滤波器基于二维高斯核函数。

  它具有在滤除噪声的同时保留细节的能力,因此被广泛应用于图像去噪,但其效率低于平均滤波。

  高斯滤波器有两个特征量:

  >

  • 核大小,其决定了图像的平滑范围。理论上,高斯核函数应该无穷大,以达到最佳的平滑效果,但过大的卷积核会导致运算效率骤降。根据高斯函数3σ规则,可以取高斯核大小为(6σ+1)×(6σ+1);
  • 离散程度σ,其决定了对高频成分的抑制程度。σ越大,像素加权半径越大,平滑程度越强。
  •   

      

    # 高斯滤波

      gaussImg = cv2.GaussianBlur(noiseImg, (5, 5), 0)

      cv2.namedWindow("gaussain image")

      cv2.imshow("gaussain image", gaussImg)

      

      

      

      

    2.2 非线性滤波

      虽然线性滤波器易于构造且计算效率高,但有些情况下,使用邻域像素的非线性滤波效果更好。例如,若图像具有椒盐噪声而非高斯噪声,此时对图像高斯滤波并不会去除噪声像素,只是把噪声转换为更为柔和但仍然可见的颗粒。

      

      中值滤波(Median filter)是一种基于排序统计理论的典型非线性滤波技术,核心原理是用像素点邻域灰度值中值代替该像素点的灰度值。中值滤波对脉冲噪声、椒盐噪声尤为有效,且具有边缘保护特性。中值滤波器本质上是数字窗口内的非线性取中值运算,而非线性滤波器的加权运算,因此中值滤波没有卷积核,运算效率仅有线性滤波的1/5左右。

      

    # 原图

      srcImg = cv2.imread("test.jpg")

      cv2.imshow("src image", srcImg)

      # 给图像增加椒盐噪声

      noiseImg = skimage.util.random_noise(srcImg, mode=s&p)

      cv2.imshow("image with noise", noiseImg)

      medImg = cv2.medianBlur(np.uint8(noiseImg * 255), 3)

      cv2.namedWindow("median image")

      cv2.imshow("median image", medImg)

      

      

      

      

    中值滤波对椒盐噪声效果

      

      

    3 频域滤波

      通过傅里叶变换将图像变换到频域,即可在频域进行图像处理。根据傅里叶变换的对称性以及从低频到高频的排列规则,图像原始频域图像会在四角形成低频分量区,而形成高频中心。通常为了观察方便,变换算法(例如Matlab中的fftshift)会将低频分量移动到图像中心形成低频中心

      

      

    图像傅里叶变换代码如下

      

    # 傅里叶变换

      dft = cv2.dft(np.float32(grayImg), flags = cv2.DFT_COMPLEX_OUTPUT)

      # 将图像中的低频部分移动到图像的中心

      dftShift = np.fft.fftshift(dft)

      # 计算幅频特性

      magnitude = 20 * np.log(cv2.magnitude(dftShift[:, :, 0], dftShift[:, :, 1]))

      plt.subplot(121), plt.imshow(grayImg, cmap = gray)

      plt.title(原图), plt.xticks([]), plt.yticks([])

      plt.subplot(122), plt.imshow(magnitude, cmap = gray)

      plt.title(频谱图), plt.xticks([]), plt.yticks([])

      plt.show()

      

      

      

    3.1 低通滤波

      

    # 定义滤波掩码

      def mask(img, ftype):

       crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2) # 求得图像的中心点位置

       # 低通

       if ftype == low:

       mask = np.zeros((img.shape[0], img.shape[1], 2), np.uint8)

       mask[crow-30:crow+30, ccol-30:ccol+30] = 1

       # 高通

       if ftype == high:

       mask = np.ones((img.shape[0], img.shape[1], 2), np.uint8)

       mask[crow-30:crow+30, ccol-30:ccol+30] = 0

       return mask

      lowImg = dftShift * mask(grayImg, low)

      lowImg = np.fft.ifftshift(lowImg)

      lowImg = cv2.idft(lowImg)

      lowImg = cv2.magnitude(lowImg[:, :, 0], lowImg[:, :, 1])

      

      

      

      

    3.2 高通滤波

      

    # 定义滤波掩码

      def mask(img, ftype):

       crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2) # 求得图像的中心点位置

       # 低通

       if ftype == low:

       mask = np.zeros((img.shape[0], img.shape[1], 2), np.uint8)

       mask[crow-30:crow+30, ccol-30:ccol+30] = 1

       # 高通

       if ftype == high:

       mask = np.ones((img.shape[0], img.shape[1], 2), np.uint8)

       mask[crow-30:crow+30, ccol-30:ccol+30] = 0

       return mask

      highImg = dftShift * mask(grayImg, high)

      highImg = np.fft.ifftshift(highImg)

      highImg = cv2.idft(highImg)

      highImg = cv2.magnitude(highImg[:, :, 0], highImg[:, :, 1])

      

      

      以上就是Python OpenCV图像处理之图像滤波特效详解的详细内容,更多关于Python OpenCV图像滤波特效的资料请关注盛行IT软件开发工作室其它相关文章!

    郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

    留言与评论(共有 条评论)
       
    验证码: