首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Python----计算机视觉处理(Opencv:图像噪点消除:滤波算法,噪点消除)

  • 25-04-25 02:41
  • 3055
  • 12955
blog.csdn.net

一、噪声

        噪声:指图像中的一些干扰因素,通常是由图像采集设备、传输信道等因素造成的,表现为图像中随机 的亮度,也可以理解为有那么一些点的像素值与周围的像素值格格不入。常见的噪声类型包括高斯噪声 和椒盐噪声。高斯噪声是一种分布符合正态分布的噪声,会使图像变得模糊或有噪点。椒盐噪声则是一 些黑白色的像素值分布在原图像中。

二、滤波器

        滤波器:也可以叫做卷积核,与自适应二值化中的核一样,本身是一个小的区域,有着特定的核值,并 且工作原理也是在原图上进行滑动并计算中心像素点的像素值。滤波器可分为线性滤波和非线性滤波, 线性滤波对邻域中的像素进行线性运算,如在核的范围内进行加权求和,常见的线性滤波器有均值滤 波、高斯滤波等。非线性滤波则是利用原始图像与模板之间的一种逻辑关系得到结果,常见的非线性滤 波器中有中值滤波器、双边滤波器等。

滤波与模糊联系与区别:

•        它们都属于卷积,不同滤波方法之间只是卷积核不同(对线性滤波而言)

•        低通滤波器是模糊,高通滤波器是锐化

•        低通滤波器就是允许低频信号通过,在图像中边缘和噪点都相当于高频部分,所以低通滤波器用于 去除噪点、平滑和模糊图像。高通滤波器则反之,用来增强图像边缘,进行锐化处理。

注意:

        椒盐噪声可以理解为斑点,随机出现在图像中的黑点或白点;高斯噪声可以理解为拍摄图片时由 于光照等原因造成的噪声。 

三、滤波算法

3.1、均值滤波

        均值滤波是一种最简单的滤波处理,它取的是卷积核区域内元素的均值,如3×3的卷积核:

        在滤波算法组件中,当参数filtering_method选为均值滤波,参数component_param为ksize,代表卷 积核的大小,eg:ksize=3,则代表使用3×3的卷积核。

        比如有一张4*4的图片,现在使用一个3*3的卷积核进行均值滤波时,其过程如下所示:

        对于边界的像素点,则会进行边界填充,以确保卷积核的中心能够对准边界的像素点进行滤波操作。在 OpenCV中,默认的是使用BORDER_REFLECT_101的方式进行填充,下面的滤波方法中除了中值滤波使 用的是BORDER_REPLICATE进行填充之外,其他默认也是使用这个方式进行填充,因此下面就不再赘 述。通过卷积核在原图上从左上角滑动计算到右下角,从而得到新的4*4的图像的像素值。 

3.2、方框滤波

        方框滤波跟均值滤波很像,如3×3的滤波核如下:

        在滤波算法组件中,当参数filtering_method选为方框滤波时,参数component_param为ksize, ddepth,normalize。

•        ksize:代表卷积核的大小,eg:ksize=3,则代表使用3×3的卷积核。

•        ddepth:输出图像的深度,-1代表使用原图像的深度。

•        normalize:当normalize为True的时候,方框滤波就是均值滤波,上式中的a就等于1/9;normalize为 False的时候,a=1,相当于求区域内的像素和。

•        其滤波的过程与均值滤波一模一样,都采用卷积核从图像左上角开始,逐个计算对应位置的像素值,并 从左至右、从上至下滑动卷积核,直至到达图像右下角,唯一的区别就是核值可能会不同。

3.3、高斯滤波 

        均值滤波和方框滤波,卷积核内的每个值都一样,也就是说图像区域中每个像素的权重也就一样。高斯滤 波的卷积核权重并不相同:中间像素点权重最高,越远离中心的像素权重越小。高斯核是以核的中心位 置为坐标原点,然后计算周围点的坐标,然后带入下面的高斯公式中。

得到了卷积核的核值之后,其滤波过程与上面两种滤波方式的滤波过程一样,都是用卷积核从图像左上 角开始,逐个计算对应位置的像素值,并从左至右、从上至下滑动卷积核,直至到达图像右下角,唯一 的区别就是核值不同。

        在滤波算法组件中,当参数filtering_method选为高斯滤波,参数component_param为ksize, sigmaX。

•        ksize:代表卷积核的大小,eg:ksize=3,则代表使用3×3的卷积核。

•        sigmaX:就是高斯函数里的值,σx值越大,模糊效果越明显。高斯滤波相比均值滤波效率要慢,但可以 有效消除高斯噪声,能保留更多的图像细节,所以经常被称为最有用的滤波器。

3.4、中值滤波 

        中值又叫中位数,是所有数排序后取中间的值。中值滤波没有核值,而是在原图中从左上角开始,将卷 积核区域内的像素值进行排序,并选取中值作为卷积核的中点的像素值

        中值滤波就是用区域内的中值来代替本像素值,所以那种孤立的斑点,如0或255很容易消除掉,适用于 去除椒盐噪声和斑点噪声。中值是一种非线性操作,效率相比前面几种线性滤波要慢。

        在滤波算法组件中,当参数filtering_method选为中值滤波,参数component_param为ksize,代表卷 积核的大小,eg:ksize=3,则代表使用3×3的卷积核。

3.5、双边滤波

        模糊操作基本都会损失掉图像细节信息,尤其前面介绍的线性滤波器,图像的边缘信息很难保留下来。 然而,边缘(edge)信息是图像中很重要的一个特征,所以这才有了双边滤波。

        可以看到,双边滤波明显保留了更多边缘信息。

        双边滤波的基本思路是同时考虑将要被滤波的像素点的空域信息(周围像素点的位置的权重)和值域信 息(周围像素点的像素值的权重)。为什么要添加值域信息呢?是因为假设图像在空间中是缓慢变化的 话,那么临近的像素点会更相近,但是这个假设在图像的边缘处会不成立,因为图像的边缘处的像素点 必不会相近。因此在边缘处如果只是使用空域信息来进行滤波的话,得到的结果必然是边缘被模糊了, 这样我们就丢掉了边缘信息,因此添加了值域信息。

        双边滤波采用了两个高斯滤波的结合,一个负责计算空间邻近度的权值(也就是空域信息),也就是上 面的高斯滤波器,另一个负责计算像素值相似度的权值(也就是值域信息),也是一个高斯滤波器。

        可以看到,对于 \omega来说,这就是普通的高斯滤波函数,其带入的坐标是坐标值,\sigma _{s}是程序输入值,该 函数是在空间临近度上计算的。而 \omega_{r }是计算像素值相似度,也是高斯函数带入坐标值,然后得到对应点 的像素值,进行两个点像素值插值的绝对值的平方。也就是说,双边滤波的核值不再是一个固定值,而 是随着滤波的过程在不断发生变化的。

        在滤波算法组件中,当参数filtering_method选为双边滤波,参数component_param为 ksize,d,sigmaColor,sigmaSpace.

•       ksize:卷积核的大小

•       d:过滤时周围每个像素领域的直径

•       sigmaColor:在color space中过滤sigma。参数越大,临近像素将会在越远的地方mix。

•       sigmaSpace:在coordinate space中过滤sigma。参数越大,那些颜色足够相近的的颜色的影响越 大。

关于2个sigma参数:

        简单起见,可以令2个sigma的值相等;

        如果他们很小(小于10),那么滤波器几乎没有什么效果;

        如果他们很大(大于150),那么滤波器的效果会很强,使图像显得非常卡通化。

关于参数d:

        过大的滤波器(d>5)执行效率低。

        对于实时应用,建议取d=5;

        对于需要过滤严重噪声的离线应用,可取d=9;

注意:

        在于选用滤波器的时候,优先高斯滤波,然后均值滤波。

        斑点和椒盐噪声优先使用中值滤波。

        要去除噪点的同时尽可能保留更多的边缘信息,使用双边滤波。

        线性滤波方式:均值滤波、方框滤波、高斯滤波(速度相对快)。

        非线性滤波方式:中值滤波、双边滤波(速度相对慢)。 

四、噪点消除 

4.1、均值滤波

导入模块

import cv2

 输入图像

img = cv2.imread('lenda01.png')

 选取滤波

img_blur = cv2.blur(img,(9,9))

 输出图像

  1. cv2.imshow('img', img)
  2. cv2.imshow('img_blur', img_blur)
  3. cv2.waitKey(0)

 完整代码

  1. import cv2
  2. img = cv2.imread('lenda01.png')
  3. img_blur = cv2.blur(img,(9,9))
  4. cv2.imshow('img', img)
  5. cv2.imshow('img_blur', img_blur)
  6. cv2.waitKey(0)

4.2、方框滤波

        此代码展示的是当normalize为Fasle时的图像,为True时图像和均值滤波一样

导入模块

import cv2

 输入图像

img = cv2.imread('lenda01.png')

 选取滤波

img_boxFilter = cv2.boxFilter(img,-1,(3,3),normalize=False)

 输出图像

  1. cv2.imshow('img', img)
  2. cv2.imshow('img_boxFilter', img_boxFilter)
  3. cv2.waitKey(0)

 完整代码

  1. import cv2
  2. img = cv2.imread('lenda01.png')
  3. img_boxFilter = cv2.boxFilter(img,-1,(3,3),normalize=False)
  4. cv2.imshow('img', img)
  5. cv2.imshow('img_boxFilter', img_boxFilter)
  6. cv2.waitKey(0)

4.3、高斯滤波

导入模块

import cv2

 输入图像

img = cv2.imread('lenda01.png')

 选取滤波

img_GaussianBlur = cv2.GaussianBlur(img,(9,9),sigmaX=99)

 输出图像

  1. cv2.imshow('img', img)
  2. cv2.imshow('img_GaussianBlur', img_GaussianBlur)
  3. cv2.waitKey(0)

 完整代码

  1. import cv2
  2. img = cv2.imread('lenda01.png')
  3. img_GaussianBlur = cv2.GaussianBlur(img,(9,9),sigmaX=99)
  4. cv2.imshow('img', img)
  5. cv2.imshow('img_GaussianBlur', img_GaussianBlur)
  6. cv2.waitKey(0)

4.4、中值滤波

导入模块

import cv2

 输入图像

img = cv2.imread('lenda01.png')

 选取滤波 

img_medianBlur = cv2.medianBlur(img,7)

 输出图像

  1. cv2.imshow('img', img)
  2. cv2.imshow('img_medianBlur', img_medianBlur)
  3. cv2.waitKey(0)

 完整代码

  1. import cv2
  2. img = cv2.imread('lenda01.png')
  3. img_medianBlur = cv2.medianBlur(img,7)
  4. cv2.imshow('img', img)
  5. cv2.imshow('img_medianBlur', img_medianBlur)
  6. cv2.waitKey(0)

4.5、双边滤波

导入模块

import cv2

 输入图像

img = cv2.imread('lenda01.png')

 选取滤波

img_bilateralFilter = cv2.bilateralFilter(img,9,150,150)

 输出图像

  1. cv2.imshow('img', img)
  2. cv2.imshow('img_bilateralFilter', img_bilateralFilter)
  3. cv2.waitKey(0)

 完整代码

  1. import cv2
  2. img = cv2.imread('lena.png')
  3. img_bilateralFilter = cv2.bilateralFilter(img,9,30,30)
  4. cv2.imshow('img', img)
  5. cv2.imshow('img_bilateralFilter', img_bilateralFilter)
  6. cv2.waitKey(0)

五、库函数 

5.1、blur()

cv.blur(	src, ksize[, dst[, anchor[, borderType]]]	) ->	dst
方法描述
src输入图像;它可以有任意数量的通道,这些通道是独立处理的,但深度应为 CV_8U、CV_16U、CV_16S、CV_32F 或 CV_64F。
dst输出图像的大小和类型与 src 相同。
ksize模糊的内核大小。
anchor锚点;默认值 Point(-1,-1) 表示锚点位于内核中心。
borderTypeborder 模式用于推断图像外部的像素,请参阅 BorderTypes。不支持BORDER_WRAP。

5.2、boxFilter()

cv.boxFilter(	src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]]	) ->	DST
方法描述
src输入图像;它可以有任意数量的通道,这些通道是独立处理的,但深度应为 CV_8U、CV_16U、CV_16S、CV_32F 或 CV_64F。
dst输出图像的大小和类型与 src 相同。
ddepth输出图像深度(-1 以使用 src.depth())
ksize模糊的内核大小。
anchor锚点;默认值 Point(-1,-1) 表示锚点位于内核中心。
normalize标志,指定内核是否按其区域进行规范化。
borderTypeborder 模式用于推断图像外部的像素,请参阅 BorderTypes。不支持BORDER_WRAP。

5.3、GaussianBlur()

cv.GaussianBlur(	src, ksize, sigmaX[, dst[, sigmaY[, borderType[, hint]]]]	) ->	DST
方法描述
src输入图像;图像可以有任意数量的通道,这些通道是独立处理的,但深度应为 CV_8U、CV_16U、CV_16S、CV_32F 或 CV_64F。
dst输出图像的大小和类型与 src 相同。
ksizeGaussian kernel 大小。ksize.width 和 ksize.height 可以不同,但它们都必须是正数和奇数。或者,它们可以是零,然后根据 sigma 计算。
sigmaXX 方向上的高斯核标准差
sigmaYY 方向的高斯核标准差;如果 sigmaY 为零,则设置为等于 sigmaX,如果两个 sigma 都为零,则分别从 ksize.width 和 ksize.height 计算出来(详见 getGaussianKernel);为了完全控制结果,而不管所有这些语义将来可能如何修改,建议指定所有 ksize、sigmaX 和 sigmaY。
borderType像素外插方法,请参阅 BorderTypes。不支持BORDER_WRAP。
hint实现修改标志。请参阅 AlgorithmHint

5.4、medianBlur()

cv.medianBlur(	src, ksize[, dst]	) ->	DST
方法描述
src输入 1 通道、3 通道或 4 通道图像;当 kSize 为 3 或 5 时,图像深度应为 CV_8U、CV_16U 或 CV_32F,对于较大的孔径尺寸,只能CV_8U。
dst目标数组,其大小和类型与 src 相同。
ksize孔径线性尺寸;它必须是奇数且大于 1,例如:3、5、7 ...

5.5、bilateralFilter()

cv.bilateralFilter(	src, d, sigmaColor, sigmaSpace[, dst[, borderType]]	) ->	DST
方法描述
src源 8 位或浮点、1 通道或 3 通道图像。
dst与 src 大小和类型相同的目标图像。
d筛选期间使用的每个像素邻域的直径。如果为非正数,则从 sigmaSpace 计算。
sigmaColor在色彩空间中过滤 sigma。该参数值越大,意味着像素邻域内较远的颜色(请参阅 sigmaSpace)将混合在一起,从而产生更大的半相等颜色区域。
sigmaSpace在坐标空间中过滤 sigma。参数值越大,意味着只要颜色足够接近,更远的像素就会相互影响(请参阅 sigmaColor )。当 d>0 时,它指定邻域大小,而不考虑 sigmaSpace。否则,d 与 sigmaSpace 成正比。
borderTypeborder 模式用于推断图像外部的像素,请参阅 BorderTypes

  BorderTypes

描述
BORDER_CONSTANT
Python:cv.BORDER_CONSTANT

iiiiii|abcdefgh|iiiiiii并指定一些i

BORDER_REPLICATE
Python:cv.BORDER_REPLICATE

aaaaaa|abcdefgh|hhhhhhh

BORDER_REFLECT
Python:cv.BORDER_REFLECT

fedcba|abcdefgh|hgfedcb

BORDER_WRAP
Python:cv.BORDER_WRAP

cdefgh|abcdefgh|abcdefg

BORDER_REFLECT_101
Python:cv.BORDER_REFLECT_101

gfedcb|abcdefgh|gfedcba

BORDER_TRANSPARENT
Python:cv.BORDER_TRANSPARENT

uvwxyz|abcdefgh|ijklmno- 将离群值视为透明值。

BORDER_REFLECT101
Python:cv.BORDER_REFLECT101

与 BORDER_REFLECT_101 相同

BORDER_DEFAULT
Python:cv.BORDER_DEFAULT

与 BORDER_REFLECT_101 相同

BORDER_ISOLATED
Python:cv.BORDER_ISOLATED

插值限制在 ROI 边界内。

注:本文转载自blog.csdn.net的蹦蹦跳跳真可爱589的文章"https://blog.csdn.net/weixin_64110589/article/details/146077489"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

114
音视频
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top