python --opencv图像处理滤波详解(均值滤波、2D 图像卷积、方框滤波、 高斯滤波、中值滤波、双边滤波)

这篇具有很好参考价值的文章主要介绍了python --opencv图像处理滤波详解(均值滤波、2D 图像卷积、方框滤波、 高斯滤波、中值滤波、双边滤波)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

介绍

第一件事情还是先做名词解释,图像平滑到底是个啥?

从字面意思理解貌似图像平滑好像是在说图像滑动。

emmmmmmmmmmmmmmm。。。。

其实半毛钱关系也没有,图像平滑技术通常也被成为图像滤波技术(这个名字看到可能大家会有点感觉)。

每一幅图像都包含某种程度的噪声,噪声可以理解为由一种或者多种原因造成的灰度值的随机变化,如由光子通量的随机性造成的噪声等等。

而图像平滑技术或者是图像滤波技术就是用来处理图像上的噪声,其中,能够具备边缘保持作用的图像平滑处理,成为了大家关注的重点。

这不废话,处理个图片降噪,结果把整个图像搞的跟玻璃上糊上了一层水雾一样,这种降噪有啥意义。

本文会介绍 OpenCV 中提供的图像平滑的 4 个算法:

均值滤波
方框滤波
高斯滤波
中值滤波
下面开始一个一个看吧:)

增加噪声

import cv2 as cv
import numpy as np

# 读取图片
img = cv.imread("maliao.jpg", cv.IMREAD_UNCHANGED)
rows, cols, chn = img.shape

# 加噪声
for i in range(5000):
    x = np.random.randint(0, rows)
    y = np.random.randint(0, cols)
    img[x, y, :] = 255

cv.imshow("noise", img)

# 图像保存
cv.imwrite("maliao_noise.jpg", img)

# 等待显示
cv.waitKey()
cv.destroyAllWindows()

python --opencv图像处理滤波详解(均值滤波、2D 图像卷积、方框滤波、 高斯滤波、中值滤波、双边滤波)

2D 图像卷积(图像过滤)

在介绍滤波之前先简单介绍下 2D 图像卷积,图像卷积其实就是图像过滤。

图像过滤的时候可以使用各种低通滤波器( LPF ),高通滤波器( HPF )等对图像进行过滤。

低通滤波器( LPF )有助于消除噪声,但是会使图像模糊。

高通滤波器( HPF )有助于在图像中找到边缘。

OpenCV 为我们提供了一个函数 filter2D() 来将内核与图像进行卷积。

我们尝试对图像进行平均滤波, 5 x 5 平均滤波器内核如下:

python --opencv图像处理滤波详解(均值滤波、2D 图像卷积、方框滤波、 高斯滤波、中值滤波、双边滤波)
我们保持这个内核在一个像素上,将所有低于这个内核的 25 个像素相加,取其平均值,然后用新的平均值替换中心像素。它将对图像中的所有像素继续此操作,完整的示例代码如下:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

# 读取图片
img = cv.imread("maliao_noise.jpg", cv.IMREAD_UNCHANGED)
rgb_img = cv.cvtColor(img, cv.COLOR_BGR2RGB)

kernel = np.ones((5,5),np.float32)/25

dst = cv.filter2D(rgb_img, -1, kernel)

titles = ['Source Image', 'filter2D Image']
images = [rgb_img, dst]

for i in range(2):
    plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])

plt.show()

python --opencv图像处理滤波详解(均值滤波、2D 图像卷积、方框滤波、 高斯滤波、中值滤波、双边滤波)

均值滤波

均值滤波是指任意一点的像素值,都是周围 N * M 个像素值的均值。

其实均值滤波和上面的那个图像卷积的示例,做了同样的事情,我只是用 filter2D() 这个方法手动完成了均值滤波,实际上 OpenCV 为我们提供了专门的均值滤波的方法,前面图像卷积没有看明白的同学,可以再一遍均值滤波,我尽量把这个事情整的明白的。

还是来画个图吧:

python --opencv图像处理滤波详解(均值滤波、2D 图像卷积、方框滤波、 高斯滤波、中值滤波、双边滤波)
中间那个红色的方框里面的值,是周围 25 个格子区域中的像素的和去除以 25 ,这个公式是下面这样的:

python --opencv图像处理滤波详解(均值滤波、2D 图像卷积、方框滤波、 高斯滤波、中值滤波、双边滤波)
我为了偷懒,所有的格子里面的像素值都写成 1 ,毕竟 n / n 永远都等于 1 ,快夸我机智。

上面这个 5 * 5 的矩阵称为核,针对原始图像内的像素点,采用核进行处理,得到结果图像。

这个核我们可以自定义大小,比如 5 * 5 ,3 * 3 , 10 * 10 等等,具体定义多大完全看疗效。

OpenCV 为我提供了 blur() 方法用作实现均值滤波,原函数如下:

def blur(src, ksize, dst=None, anchor=None, borderType=None)
  • kSize: 内核参数,其实就是图片进行卷积的时候相乘的那个矩阵,具体的卷积是如何算的,网上有很多,我这里就不介绍了,所得到的图像是模糊的,而且图像其实是按照原来的比例缺少了(原图像-内核参数+1)^2 个单元格。
  • anchor: Point 类型,即锚点,有默认值 Point(-1, -1) ,当坐标为负值,就表示取核的中心。
  • borderType: Int 类型,用于推断图像外部像素的某种边界模式,有默认值 BORDER_DEFAULT 。

示例

import cv2 as cv
import matplotlib.pyplot as plt

# 读取图片
img = cv.imread("maliao_noise.jpg", cv.IMREAD_UNCHANGED)
rgb_img = cv.cvtColor(img, cv.COLOR_BGR2RGB)

# 均值滤波
blur_img = cv.blur(rgb_img, (3, 3))
# blur_img = cv.blur(img, (5, 5))
# blur_img = cv.blur(img, (10, 10))
# blur_img = cv.blur(img, (20, 20))

titles = ['Source Image', 'Blur Image']
images = [rgb_img, blur_img]

for i in range(2):
    plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])

plt.show()

python --opencv图像处理滤波详解(均值滤波、2D 图像卷积、方框滤波、 高斯滤波、中值滤波、双边滤波)

这个降噪的效果好像没有前面 2D 卷积的那个降噪效果好,但是图像更为清晰,因为我在这个示例中使用了更小的核 3 * 3 的核,顺便我也试了下大核,比如代码中注释掉的 10 * 10 的核或者 20 * 20 的核,实时证明,核越大降噪效果越好,但是相反的是图像会越模糊。

方框滤波

方框滤波和均值滤波核基本一致,其中的区别是需不需要进行归一化处理。

什么是归一化处理等下再说,我们先看方框滤波的原函数:

def boxFilter(src, ddepth, ksize, dst=None, anchor=None, normalize=None, borderType=None)
  • src: 原始图像。
  • ddepth: Int 类型,目标图像深度,通常用 -1 表示与原始图像一致。
  • kSize: 内核参数。
  • dst: 输出与 src 大小和类型相同的图像。
  • anchor: Point 类型,即锚点,有默认值 Point(-1, -1) 。
  • normalize: Int 类型,表示是否对目标图像进行归一化处理。

当 normalize 为 true 时,需要执行均值化处理。

当 normalize 为 false 时,不进行均值化处理,实际上是求周围各像素的和,很容易发生溢出,溢出时均为白色,对应像素值为 255 。

import cv2 as cv
import matplotlib.pyplot as plt

# 读取图片
img = cv.imread('maliao_noise.jpg')
source = cv.cvtColor(img, cv.COLOR_BGR2RGB)

# 方框滤波
result = cv.boxFilter(source, -1, (5, 5), normalize = 1)

# 显示图形
titles = ['Source Image', 'BoxFilter Image']
images = [source, result]

for i in range(2):
    plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])

plt.show()

python --opencv图像处理滤波详解(均值滤波、2D 图像卷积、方框滤波、 高斯滤波、中值滤波、双边滤波)
当我们把 normalize 的属性设为 0 时,不进行归一化处理,结果就变成了下面这个样子:

python --opencv图像处理滤波详解(均值滤波、2D 图像卷积、方框滤波、 高斯滤波、中值滤波、双边滤波)

高斯滤波

为了克服简单局部平均法的弊端(图像模糊),目前已提出许多保持边缘、细节的局部平滑算法。它们的出发点都集中在如何选择邻域的大小、形状和方向、参数加平均及邻域各店的权重系数等。

在高斯滤波的方法中,实际上是把卷积核换成了高斯核,那么什么是高斯核呢?

简单来讲就是方框还是那个方框,原来每个方框里面的权是相等的,大家最后取平均,现在变成了高斯分布的,方框中心的那个权值最大,其余方框根据距离中心元素的距离递减,构成一个高斯小山包,这样取到的值就变成了加权平均。

下图是所示的是 3 * 3 和 5 * 5 领域的高斯核。

python --opencv图像处理滤波详解(均值滤波、2D 图像卷积、方框滤波、 高斯滤波、中值滤波、双边滤波)
高斯滤波是在 OpenCV 中是由 GaussianBlur() 方法进行实现的,它的原函数如下:

def GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)
  • sigmaX: 表示 X 方向方差。

这里需要注意的是 ksize 核大小,在高斯核当中,核 (N, N) 必须是奇数, X 方向方差主要控制权重。

import cv2 as cv
import matplotlib.pyplot as plt

# 读取图片
img = cv.imread('maliao_noise.jpg')
source = cv.cvtColor(img, cv.COLOR_BGR2RGB)

# 方框滤波
result = cv.GaussianBlur(source, (3, 3), 0)

# 显示图形
titles = ['Source Image', 'GaussianBlur Image']
images = [source, result]

for i in range(2):
    plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])

plt.show()

python --opencv图像处理滤波详解(均值滤波、2D 图像卷积、方框滤波、 高斯滤波、中值滤波、双边滤波)

中值滤波

在使用邻域平均法去噪的同时也使得边界变得模糊。

而中值滤波是非线性的图像处理方法,在去噪的同时可以兼顾到边界信息的保留。

中值滤波具体的做法是选一个含有奇数点的窗口 W ,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值。

下图是一个一维的窗口的滤波过程:

python --opencv图像处理滤波详解(均值滤波、2D 图像卷积、方框滤波、 高斯滤波、中值滤波、双边滤波)
在 OpenCV 中,主要是通过调用 medianBlur() 来实现中值滤波,它的原函数如下:

def medianBlur(src, ksize, dst=None)

中值滤波的核心数和高斯滤波的核心数一样,必须要是大于 1 的奇数。

import cv2 as cv
import matplotlib.pyplot as plt

# 读取图片
img = cv.imread('maliao_noise.jpg')
source = cv.cvtColor(img, cv.COLOR_BGR2RGB)

# 方框滤波
result = cv.medianBlur(source, 3)

# 显示图形
titles = ['Source Image', 'medianBlur Image']
images = [source, result]

for i in range(2):
    plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])

plt.show()

python --opencv图像处理滤波详解(均值滤波、2D 图像卷积、方框滤波、 高斯滤波、中值滤波、双边滤波)
可以明显看到,目前中值滤波是对原图像降噪后还原度最高的,常用的中值滤波的图形除了可以使用方框,还有十字形、圆形和环形,不同形状的窗口产生不同的滤波效果。

python --opencv图像处理滤波详解(均值滤波、2D 图像卷积、方框滤波、 高斯滤波、中值滤波、双边滤波)

双边滤波

import cv2 as cv

source = cv.imread("zhaopian.jpg")
dst = cv.bilateralFilter(src=source, d=0, sigmaColor=30, sigmaSpace=15)

cv.imshow("source", source)
cv.imshow("dst", dst)

cv.waitKey()
cv.destroyAllWindows()

python --opencv图像处理滤波详解(均值滤波、2D 图像卷积、方框滤波、 高斯滤波、中值滤波、双边滤波)
原理解析

上面的图片美颜效果其实使用的是 OpenCV 中为我们提供的双边滤波器,是一种图片降噪算法。

前面的文章介绍过,高斯滤波的方式会造成边缘模糊化,这是没办法的事情,这是高斯滤波过滤方式而导致的。

而双边滤波就是在高斯滤波的基础上,对高斯滤波的方式加以改进,结合图像的空间邻近度和像素值相似度的一种折处理,同时考虑 空域信息(domain) 和 值域信息(range) ,达到保边降噪的目的。

说人话就是双边滤波在进行滤波的过程中,不光要考虑周围像素值与中点像素值的大小之差,还需要考虑空间上的距离,进而确定该点对中间点的影响因子。

比如在一张图像中,相邻的像素点的颜色会非常相近,但是如果在边缘区域,相邻元素点的颜色变化会非常的大。

高斯过滤器的过滤过程中就是因为没有考虑边缘区域而导致过滤后图像边缘模糊,而双边滤波由于在过滤的过程中考虑到了周围像素值与中点像素值的差值大小,从而会确定一个影响因子,从而实现图片的保边降噪。

具体的实现原理如下:

python --opencv图像处理滤波详解(均值滤波、2D 图像卷积、方框滤波、 高斯滤波、中值滤波、双边滤波)
从这个图中可以看出,在图(b)空域核上,每个像素的权重是符合高斯分布的,而在图(c)的值域核上,由于像素取值相差过大,不同颜色的权重系数相差也很大,双边过滤过滤完成后,边缘两侧的像素点保留了原有的色彩值。

接下来还是看下双边滤波的原函数:文章来源地址https://www.toymoban.com/news/detail-441768.html

def bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
  • src:原图
  • d:像素邻域的直径。如果这个值设为非正数,那么 OpenCV 会从第五个参数 sigmaSpace 来将它计算出来。
  • sigmaColor:颜色空间滤波器的 值。这个参数的值越大,就表明该像素邻域内有更宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
  • sigmaSpace:坐标空间中滤波器的 值,坐标空间的标注方差。他的数值越大,意味着越远的像素会相互影响,从而使更大的区域足够相似的颜色获取相同的颜色。当 d > 0 , d 指定了邻域大小且与 sigmaSpace 无关。否则, d 正比于 sigmaSpace 。使用过程中我发现这个值越大,图像的过渡效果越好。

到了这里,关于python --opencv图像处理滤波详解(均值滤波、2D 图像卷积、方框滤波、 高斯滤波、中值滤波、双边滤波)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 图像处理:均值滤波算法

    目录 前言 概念介绍 基本原理 Opencv实现均值滤波 Python手写实现均值滤波 参考文章 在此之前,我曾在此篇中推导过图像处理:推导五种滤波算法(均值、中值、高斯、双边、引导)。这在此基础上,我想更深入地研究和推导这些算法,以便为将来处理图像的项目打下基础。

    2023年04月23日
    浏览(78)
  • 数字图像处理(七)均值滤波

    题目:使用均值滤波器对图像进行滤波。 采用国际标准测试图像Lena。 3*3的均值滤波器定义如下: c++代码: 结果展示: 均值滤波器的特点: 计算均值会将图像中的边缘信息和特征信息模糊掉,丢失很多特征,使得景物的清晰度降低,画面变得模糊。对于高斯噪声,当滤波器

    2024年02月11日
    浏览(90)
  • Matlab图像处理-均值滤波

    均值滤波 均值滤波所使用的运算是卷积。均值滤波用邻域内像素的平均值来代替中心像素的值,相当于低通滤波,有将图像模糊化的趋势,对椒盐噪声基本无能为力。 在 MATLAB 中,可使用 imfilter 函数 来实现线性空间滤波,该函数的语法如下 : J = imfilter ( I,w,filtering_mode,bound

    2024年02月06日
    浏览(44)
  • ZYNQ图像处理(6)——均值滤波和中值滤波

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

    2024年02月08日
    浏览(53)
  • 图像处理中调用matlab自带均值滤波、高斯滤波和中值滤波函数的案例以及自编均值滤波的案例。

    @[TOC](利用matlab自带均值滤波器的代码,分别对一幅图像实现3*3,5*5,7*7,9*9的均值滤波,并对实验结果进行分析。) @[TOC](分别给干净图像添加高斯和椒盐噪声,然后进行均值滤波、高斯滤波和中值滤波,并对实现结果进行分析。) @[TOC](自编均值滤波器对一幅图像实现填充后,

    2024年02月11日
    浏览(41)
  • FPGA图像处理仿真实验——均值滤波(FIFO)

            之前的博客中用shift ram做的均值滤波,那篇文章里讲了原理,在这里不进行重复。考虑到shift ram的深度有限,在处理高分辨率图片时可能会收到限制,所以这次采用FIFO来进行均值滤波。FIFO可以看成是一个先进先出的堆栈,有两个独立的读使能信号和写使能信号,

    2024年02月13日
    浏览(40)
  • 【C++】【图像处理】均值滤波和高斯滤波(低通滤波)算法解析(以.raw格式的图像为基础进行图像处理、gray levels:256)

     中值滤波: 中值滤波中的MidValueFind函数的实现就是冒泡排序,最后去中间值返回:  Soble算子边缘提取:     总结: 1、均值、高斯滤波和Sobel算子边缘提取的核心,创建卷积核并确定各个点上的权重,然后将边缘灰度级归零(是否边缘归零按业务需求决定),提取非边缘像

    2024年02月05日
    浏览(56)
  • 【C++】【图像处理】均值滤波 and 高斯滤波 and 中值滤波(低通滤波)算法解析(以.raw格式的图像为基础进行图像处理、gray levels:256)

     中值滤波: 中值滤波中的MidValueFind函数的实现就是冒泡排序,最后去中间值返回:  Soble算子边缘提取:     总结: 1、均值、高斯滤波和Sobel算子边缘提取的核心,创建卷积核并确定各个点上的权重,然后将边缘灰度级归零(是否边缘归零按业务需求决定),提取非边缘像

    2024年02月05日
    浏览(47)
  • 《数字图像处理-OpenCV/Python》连载:空间滤波之高斯滤波器

    本书京东 优惠购书链接 https://item.jd.com/14098452.html 本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html 图像滤波是指在尽可能保留图像细节特征的条件下对目标图像的噪声进行抑制,是常用的图像处理方法。 空间滤波也称空间域滤波,滤波器规定了邻域形状与邻域

    2024年02月02日
    浏览(59)
  • 图像处理:推导五种滤波算法(均值、中值、高斯、双边、引导)

    目录 概论 算法原理 1、均值滤波 2、中值滤波 3、高斯滤波 4、双边滤波 5、引导滤波  手写代码 Opencv代码实现  最后的总结 参考文章         本来打算是分开推导的,但我觉得还是整个合集吧,避免有水文的嫌疑,那么因为学习的需要,会涉及到图像的滤波处理,我汇总

    2024年02月07日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包