opencv图像处理之常见滤波器

图像平滑

Smoothing, also called blurring, is a simple and frequently used image processing operation.

平滑,也叫模糊.

本质就是把某点的像素值转换为其及其周围像素值的不同权重的叠加.h(k,l)即为卷积核,或者叫滤波器filter.

有几种常见的filter

  • Normalized Box Filter
  • Gaussian Filter
  • Median Filter
  • Bilateral Filter

均值滤波


权重矩阵如上.

img2= cv2.blur(img,(5,5))

The call blur(src, dst, ksize, anchor, borderType) is equivalent to boxFilter(src, dst, src.type(), anchor, true, borderType).
https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga8c45db9afe636703801b0b2e440fce37

效果如下:

高斯滤波

即假设某一位置的像素和其邻域像素符合高斯分布.具体的说的话,就是每一位置的像素的权重符合高斯分布.这样的话,给定一个高斯分布,及高斯核的大小,则可以计算出周边n个像素的权重值.

上图展示了一维度的高斯分布图和二维高斯分布的公式. 图像是2维度的.(即行维度和列维度确定一个像素点的位置).

高斯滤波的具体计算过程.可以参考https://blog.csdn.net/zr459927180/article/details/52400641

opencv中获取高斯核心的函数为getGaussianKernel,但是这个获取的一维的高斯核.对图像来说,以3*3邻域而言,我们应该得到一个3*3的权重矩阵.可以如下得到:

    kernal_x = cv2.getGaussianKernel(3,-1)
    kernal_y = cv2.getGaussianKernel(3,-1)
    kernal_filter = np.dot(kernal_x,kernal_y.T)
    print(kernal_filter)

输出如下:

[[0.0625 0.125  0.0625]
 [0.125  0.25   0.125 ]
 [0.0625 0.125  0.0625]]

则中间元素的亮度值经高斯转换后为0.0625 x p(0,0) + 0.125 x p(0,1) + .... + 0.0625 x p(2,2),可以看到权重矩阵相加等于1.

这里,我们举例用了3 x 3的高斯核,实际上并不限定高斯核一定要是正方形.

回到cv的GaussianBlur(),

其参数sigmaX,sigmaY即x,y方向上的高斯分布的标准差.这样就可以求得不同方向上的高斯矩阵,再做矩阵乘法,即得到m x n的权重矩阵.进而求得高斯转换后的图像.

我们知道高斯分布(也叫正态分布)的特点为,标准差越大,分布越分散,标准差越小,分布越集中.所以调大GaussianBlur()中的sigmaX,sigmaY将使得图像中的每个像素更多地参考周边像素,即更为平滑或者说模糊.

参见下图:(这张图选的不好,高斯模糊效果不明显,但还是可以看出图3更模糊一些)

import cv2
import numpy as np
def test():
    imgname = "/home/sc/opencv-3.4.3/samples/data/lena.jpg"
    img = cv2.imread(imgname)

    img2 = img.copy()
    #img2 = cv2.blur(img,(5,5))
    img2 = cv2.GaussianBlur(img,(5,7),1)
    img3 = cv2.GaussianBlur(img,(5,7),100)

    kernal_x = cv2.getGaussianKernel(3,0)
    kernal_y = cv2.getGaussianKernel(3,0)
    kernal_filter = np.dot(kernal_x,kernal_y.T)
    print(kernal_filter)

    kernal_x = cv2.getGaussianKernel(3,5)
    kernal_y = cv2.getGaussianKernel(3,5)
    kernal_filter = np.dot(kernal_x,kernal_y.T)
    print(kernal_filter)

    #return

    cv2.imshow("origin",img)
    cv2.imshow("dst",img2)
    cv2.imshow("dst3",img3)

    k=cv2.waitKey()
    if k == 27:
        cv2.destroyAllWindows()

test()

从getGaussianKernel()的输出可以明显地看出来,标准差调大时,权重矩阵的变换.

中值滤波

即把像素值变为邻域像素值的中位数.

注意,kernal的大小必须为奇数.

import cv2
def test():
    imgname = "/home/sc/opencv-3.4.3/samples/data/lena.jpg"
    img = cv2.imread(imgname)

    dst = cv2.medianBlur(img, 1)
    dst2 = cv2.medianBlur(img, 11)

    cv2.imshow("origin",img)
    cv2.imshow("dst",dst)
    cv2.imshow("dst2",dst2)

    k=cv2.waitKey()
    if k == 27:
        cv2.destroyAllWindows()
test()

双边滤波

双边滤波函数是 cv2.bilateralFilter() ,双边滤波能在保持边界清晰的情况下有效的去除噪音。但是这种操作与其他滤波器相比会比较慢.我们已经知道高斯滤波器是求中心点邻近区域像素的高斯加权平均值。这种高斯滤波器只考虑像素之间的空间关系,而不会考虑像素值之间的关系(像素的相似度)。所以这种方法不会考虑一个像素是否位于边界。因此边界也会被模糊掉,而这不是我们想要的。

双边滤波在同时使用空间高斯权重和灰度值相似性高斯权重。空间高斯函数确保只有邻近区域的像素对中心点有影响,灰度值相似性高斯函数确保只有与中心像素灰度值相近的才会被用来做模糊运算。所以这种方法会确保边界不会被模糊掉,因为边界处的灰度值变化比较大.

简单滴说就是,在生成周边像素的权重矩阵时,如果发现旁边的像素值和当前的像素值差异很大,就只给差异很大的那个元素分配很小的权重,这样"大的突变差异就被保留了".
双边滤波的原理可以参考:https://blog.csdn.net/shenziheng1/article/details/50838970

dst = cv2.bilateralFilter(img, 9, 75, 75)

效果图:

可以看到纹理被模糊掉了,但是边界还是很好地保留了.

参考:参考:<https://docs.opencv.org/master/dc/dd3/tutorial_gausian_median_blur_bilateral_filter.html >
https://blog.csdn.net/shenziheng1/article/details/50838970
https://blog.csdn.net/GiffordY/article/details/91891920

原文地址:https://www.cnblogs.com/sdu20112013/p/11600436.html

时间: 2024-10-13 22:14:41

opencv图像处理之常见滤波器的相关文章

《OpenCV图像处理编程实例》 目录

当当网购买地址:http://product.dangdang.com/23956649.html京东网购买地址:http://item.jd.com/11929148.html 内容简介 本书以 OpenCV 开源库为基础实现图像处理领域的很多通用算法,并结合当今图像处理领域前沿技术,对多个典型工程实例进行讲解及实现.全书内容覆盖面广,由基础到进阶,各个技术点均提供详细的代码实现,以帮助读者快速上手和深入学习.本书内容共三个部分,其中 1-2 章为基础篇, 3-6 章为进阶篇, 7-9 章为高

OpenCV &mdash;&mdash; 图像处理

使用图像结构中所定义的高层处理方法(图形和视觉范畴)来完成特定任务 平滑处理   cvSmooth 处理后图像与输入图像的大小相同(不用考虑边缘) 中值滤波  CV_MEDIAN 不支持 in place 操作 , 高斯滤波 CV_GAUSSIAN 支持 in place 操作(可以设置高斯核不对称,双边滤波--高斯平滑,水彩画处理,可用于图像分割) 图像形态学 膨胀 -- 把二值图像各像素连接成分的边界扩大一层,填充边缘或像素内部的孔:使灰度图像高亮区域逐渐增长 腐蚀 -- 把二值图像各像素连

OpenCV 学习(利用滤波器进行边缘提取)

OpenCV 学习(利用滤波器进行边缘提取) 通过低通滤波器,我们可以将图像平滑,相反的,利用高通滤波器可以提取出图像的边缘. Sobel 滤波器 Sobel 滤波器是一种有方向性的滤波器,可以作用在 X 方向或 Y 方向. 关于这种滤波器的理论介绍可以参考: https://en.wikipedia.org/wiki/Sobel_operator 函数原型如下: void Sobel( InputArray src, OutputArray dst, int ddepth, int dx, i

【图像处理】Gabor滤波器

Gabor的核函数参考的wiki 使用实数Real的公式计算核函数代码: Mat getGaborFilter(float lambda, float theta, float sigma2,float gamma, float psi = 0.0f){ if(abs(lambda-0.0f)<1e-6){ lambda = 1.0f; } float sigma_x = sigma2; float sigma_y = sigma2/(gamma*gamma); int nstds = 3; f

从零开始的Opencv图像处理项目实战课程设计

一.简介.1.通过课程能够获得什么?     a.对于想学习图像处理的同学能够快速入门:     b.能够快速搭建起来"具备解决实际问题能力的"软硬件平台:     c.能够积累一套可以不断复用的图像处理软件框架:     d.初步形成图像处理的思维能力,灵活应对各种需求.2.课程包括哪些内容     a.综述.课程的核心是开发一个基于Opencv的"答题卡"识别系统.不仅包括算法,而且包括软件框架,而且包括硬件选配.     b.opencv图像处理的环境配置.运

【图像处理】Schmid滤波器

Schmid也是一种类Gabor图像滤波器,在这篇文章[1]中有详细推导和介绍. 一种更简洁的表达公式是: 当中,r为核半径,Z为归一化參数,τ和σ是比較重要的參数,在ReID提取TextFeature中,常常使用例如以下一系列參数: (2,1), (4,1), (4,2), (6,1), (6,2), (6,3), (8,1), (8,2), (8,3), (10,1), (10,2), (10,3), (10,4) 此外,还结合前面的Gabor滤波器,γ,θ,λ,σ的參数分别使用:(0.3,

图像处理之常见二值化方法汇总

图像处理之常见二值化方法汇总 图像二值化是图像分析与处理中最常见最重要的处理手段,二值处理方法也非常多.越 精准的方法计算量也越大.本文主要介绍四种常见的二值处理方法,通常情况下可以满 足大多数图像处理的需要.主要本文讨论的方法仅针对RGB色彩空间. 方法一: 该方法非常简单,对RGB彩色图像灰度化以后,扫描图像的每个像素值,值小于127的 将像素值设为0(黑色),值大于等于127的像素值设为255(白色).该方法的好处是计算 量少速度快.缺点更多首先阈值为127没有任何理由可以解释,其次完全不

《OpenCV图像处理编程实例》

<OpenCV图像处理编程实例>例程复现 随书代码下载:http://www.broadview.com.cn/28573 总结+遇到的issue解决: 第一章 1.VS2015安装OpenCV2.4.11 四步骤: 1)步骤一:下载Windows安装包OpenCV2.4.11并解压,本人为:D:\ProgramFiles\opencv2 2)步骤二:配置OpenCV2.4.11的环境变量,本人为:D:\ProgramFiles\opencv2\opencv\build\x86\vc12\bi

OpenCV图像处理篇之图像平滑

图像平滑算法 图像平滑与图像模糊是同一概念,主要用于图像的去噪.平滑要使用滤波器,为不改变图像的相位信息,一般使用线性滤波器,其统一形式如下: 其中h称为滤波器的核函数,说白了就是权值.不同的核函数代表不同的滤波器,有不同的用途. 在图像处理中,常见的滤波器包括: 归一化滤波器(Homogeneous blur) 也是均值滤波器,用输出像素点核窗口内的像素均值代替输出点像素值. 高斯滤波器(Guassian blur) 是实际中最常用的滤波器,高斯滤波是将输入数组的每一个像素点与 高斯内核 卷积