纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

OpenCV 图像平滑处理 OpenCV-Python实现图像平滑处理操作

一天一篇Python库   2021-06-08 我要评论
想了解OpenCV-Python实现图像平滑处理操作的相关内容吗一天一篇Python库在本文为您仔细讲解OpenCV 图像平滑处理的相关知识和一些Code实例欢迎阅读和指正我们先划重点:OpenCV,图像平滑处理,OpenCV,均值滤波,OpenCV,图像处理下面大家一起来学习吧

什么是图像平滑处理

在尽量保留图像原有信息的情况下过滤掉图像内部的噪声这一过程我们称之为图像的平滑处理所得到的图像称为平滑图像

那么什么是图像的噪声呢?

图像的噪声就是图像中与周围像素点差异较大的像素点噪声的处理就是将其更改为临近像素点的近似值使图像更平滑

图像平滑处理的噪声取值的方式有以下6种:

(1)均值滤波

(2)方框滤波

(3)高斯滤波

(4)中值滤波

(5)双边滤波

(6)2D卷积(自定义滤波)

均值滤波

均值滤波是指用当前像素点周围N*N个像素点的均值来代替当前像素值使用该方法遍历处理图像内的每一个像素点即可完成整幅图像的均值滤波

在进行均值滤波处理时我们需要考虑对周围多少个像素点取平均值通常情况下我们会以当前像素点为中心对行数和列数相等的一块区域内的所有像素点取平均值

但是边缘像素点可能不能这样做毕竟比如左上角的像素点是没有左上像素点的这个时候我们常常会取图像内存在的周围邻域点的平均值

在OpenCV中它给我们提供的均值滤波函数为cv2.blur()其完整定义如下:

def blur(src, ksize, dst=None, anchor=None, borderType=None): 

src:原始图像

kszie:滤波中心的大小也就是取平均值的周围像素点的高度与宽度比如(5,5)就是取5*5邻域像素点均值作为结果

anchor:锚点其默认值为(-11)表示当前计算均值的点位于核的中心点位置一般使用默认值即可

borderType:边界样式该值决定了以何种方式处理边界一般情况下不需要更改

了解了该函数的定义下面我们简单的来完成一个去噪图像具体代码如下所示:

import cv2

img = cv2.imread("5.jpg")
result_5img = cv2.blur(img, (5, 5))
result_30img= cv2.blur(img, (30, 30))
cv2.imshow("img", img)
cv2.imshow("result_5img", result_5img)
cv2.imshow("result_30img", result_30img)
cv2.waitKey()
cv2.destroyAllWindows()

运行之后效果如下所示:

530

从上图可以看出来使用(55)卷积进行均值滤波处理后图像虽然模糊但还可以辨认而使用(3030)卷积进行均值滤波图像失真非常严重

所以我们可以得出来卷积核越大去噪效果越好花费的时间越长同时图像失真也越严重而实际的处理中我们需要在失真与去噪之间取得平衡选取合适的卷积大小

方框滤波

方框滤波与均值滤波的不同之处在于方框滤波不会计算像素均值它可以自由选择是否对均值滤波的结果进行归一化即可以自由选择滤波结果是邻域像素值之和的平均值还是邻域像素值之和

在OpenCV中它提供cv2.boxFilter()函数来实现方框滤波其完整定义如下:

def boxFilter(src, ddepth, ksize, dst=None, anchor=None, normalize=None, borderType=None): 

src:原始图像

ddepth:处理结果图像的图像深度一般使用-1表示与原图像使用相同的图像深度

ksize:滤波核心的大小

normalize:是否在滤波时进行归一化处理当它为1时表示要进行归一化处理也就是邻域像素值的和除以面积比如(33)公式如下:

公式

当它为0时表示不需要进行归一化处理直接使用邻域像素值的和

下面我们来用程序分别实现归一化与不归一化的效果代码如下:

import cv2

img = cv2.imread("5.jpg")
result1 = cv2.boxFilter(img, -1, (5, 5))
result2 = cv2.boxFilter(img, -1, (30, 30))
result3 = cv2.boxFilter(img, -1, (2, 2),normalize=0)
cv2.imshow("img", img)
cv2.imshow("result1", result1)
cv2.imshow("result2", result2)
cv2.imshow("result3", result3)
cv2.waitKey()
cv2.destroyAllWindows()

运行之后显示的效果如下所示:

效果

可以看到左下角不需要归一化处理这里只取(22)如果你取大了可以试试因为范围大了和一般都会大于255那么就会造成图像全是白色

高斯滤波

在进行均值滤波与方框滤波时其邻域内每个像素的权重是相等的而高斯滤波会将中心点的权重加大远离中心点的权重减小以此来计算邻域内各个像素值不同权重的和

在OpenCV中它给我们提供cv2.GaussianBlur()函数进行高斯滤波其完整定义如下:

def GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None):

src:原始图像

ksize:滤波核的大小

sigmaX:卷积和在水平方向上(X轴方向)的标准差其控制的是权重比例

sigmaY:卷积和在垂直方向上(Y轴方向)的标准差也是控制的是权重比例如果它为0只采用sigmaX的值如果sigmaX与sigmaY都是0则通过ksize.width和ksize.height计算得到(可选参数)

下面我们来使用高斯滤波看看效果代码如下所示:

import cv2

img = cv2.imread("5.jpg")
result = cv2.GaussianBlur(img, (3, 3), 0, 0)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

运行之后效果如下所示:

高斯滤波

中值滤波

中值滤波与前面的三种滤波都不同它不在采用加权求均值的方式计算滤波结果而是用邻域内所有像素值的中间值来代替当前像素点的像素值

简单点说就是取当前像素点及其周围临近像素点的像素值将这些值进行排序后取中间位置的像素值作为当前位置的像素值

在OpenCV中它提供给我们cv2.medianBlur()函数来进行中值滤波其完整定义如下:

def medianBlur(src, ksize, dst=None): 

src:原始图像

kszie:滤波核的大小

参数就两个下面我们来用代码测试一下:

import cv2

img = cv2.imread("5.jpg")
result = cv2.medianBlur(img, 3)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

运行之后显示效果如下:

中值滤波

可以看到这里我们将脸上的红点去掉了需要特别注意的是滤波核的大小必须是奇数矩阵中心点向外衍生必然是奇数不信可以随便矩阵取一点试试

双边滤波

双边滤波是综合考虑空间信息和色彩信息的滤波方式在滤波的过程中能够有效地保护图像内的边缘信息

前面滤波方式基本只考虑了空间的权重信息这种情况计算起来比较方便但是边缘信息的处理上存在较大问题而双边滤波在处理边缘时与当前点色彩相近的像素点给与较大的权重值而与当前像素点色彩差别大的会给较小的权重这样就保护了边缘信息

简单点概括双边滤波在计算某一个像素点的新值时不仅考虑距离信息还考虑色彩信息双边滤波即能有效地去除噪声又能很好地保护边缘信息

在OpenCV中它给我们提供cv2.bilateralFilter()函数来实现其完整定义如下:

def bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None):

src:原始图像

d:在滤波时选取的空间距离参数这里表示以当前像素点为中心点的直径如果该值为非正数则会从参数sigmaSpace计算得到如果滤波空间较大比如d>5则速度较慢因此在实际的应用中推荐d=5对于噪声较大的离线滤波可以选择d=9

sigmaColor:在滤波处理时选择的颜色范围该值决定了周围哪些像素点能够参与到滤波中来与当前像素点的像素值差值小于sigmaColor的像素点能够参与到当前的滤波中该值越大就说明周围有越多的像素点可以参与到运算中该值为0时滤波失去意义该值为255指定直径内的所有点都能够参与运算

sigmaSpace:坐标空间中的sigma值它的值越大说明有越多的点能够参与到滤波计算中来当d>0时无论sigmaSpace的值如何d都指定邻域大小否则d域sigmaSpace的值成比例

为了简单起见博主这里将两个sigmaColor与sigmaSpace值设置为相同的如果它们的值比较小比如小于10滤波的效果不太明显如果它们的值较大比如大于150则滤波效果会比较明显

代码如下所示:

import cv2

img = cv2.imread("5.jpg")
result = cv2.bilateralFilter(img,25,50,50)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

运行之后显示效果如下所示:

双边滤波

2D卷积

在OpenCV中除了提供上面这些常用的滤波方式之外还允许用户自定义卷积核实现卷积操作这个函数是cv2.Filter2D()其完整定义如下:

def filter2D(src, ddepth, kernel, dst=None, anchor=None, delta=None, borderType=None): 

src:原始图像

ddepth:处理结果图像的深度-1与原图像一致

kernel:卷积核是一个单通道数组如果想在处理彩色图像时让每个通道使用不同的核则必须将彩色图像分解后使用不同的核完成

delta:修正值可选参数如果该值存在会在基础滤波的结果上加上该值作为最终的滤波结果

下面我们来使用这个函数看看效果具体代码如下所示:

import cv2
import numpy as np

img = cv2.imread("5.jpg")
kernel = np.ones((9,9), np.float32) / 81
result = cv2.filter2D(img, -1, kernel)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

运行之后效果如下所示:

2D卷积


相关文章

猜您喜欢

  • OpenCV 油画 OpenCV-Python实现油画效果的实例

    想了解OpenCV-Python实现油画效果的实例的相关内容吗一天一篇Python库在本文为您仔细讲解OpenCV 油画的相关知识和一些Code实例欢迎阅读和指正我们先划重点:OpenCV,油画下面大家一起来学习吧..
  • Python导出导入依赖包 Python怎样导出导入所有依赖包详解

    想了解Python怎样导出导入所有依赖包详解的相关内容吗AI悦创在本文为您仔细讲解Python导出导入依赖包的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Python导出导入依赖包,python导入包的几种方法,python导入包的方式下面大家一起来学习吧..

网友评论

Copyright 2020 www.fresh-weather.com 【世纪下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式