目录

前言

概念介绍

基本原理

卷积核的大小

卷积核的形状和权重比

卷积核的归一化

结论

Opencv实现高斯滤波

Python手写实现高斯滤波

参考文章


前言

在此之前,我曾在此篇中推导过图像处理:推导五种滤波算法(均值、中值、高斯、双边、引导)。这在此基础上,我想更深入地研究和推导这些算法,以便为将来处理图像的项目打下基础。

概念介绍

高斯滤波是一种常用的图像处理技术,常用于去噪、平滑和边缘检测等应用中。它是基于高斯函数的概念,由于高斯函数的性质,距离中心像素越远的像素对新值的贡献越小,对图像中的像素进行加权平均处理,使得周围像素的影响比较大,而远离中心像素的影响则较小。因此,高斯滤波可以平滑图像并去除一部分噪声,同时保留图像中的边缘和细节。

具体来说,高斯滤波是通过一个矩阵(卷积核)来实现的。这个矩阵的值是由高斯函数计算出来的,高斯函数在中心点处取得最大值,随着距离的增加而逐渐减小。矩阵的大小和参数的选择取决于需要处理的图像和要达到的效果。

基本原理

这里以一个3x3的卷积核为例,卷积核的值是由高斯函数计算出来的,高斯函数在中心点处取得最大值,随着距离的增加而逐渐减小。通过对每个像素应用卷积核,高斯滤波可以对图像进行平滑处理并去除噪声,同时保留图像的细节和边缘。

如上图所示,高斯函数在中心点处的值最大,离中心点越远的值越小。这意味着对于每个像素,距离中心像素越远的像素对新值的影响越小。这种影响方式使得高斯滤波可以去除图像噪声,同时保留图像细节和边缘。

通过高斯滤波的计算过程,可以得出中心点像素值226被新值164所替代的结果。具体来说,通过一个简单的矩阵点乘计算,将卷积核与图像中的像素矩阵相乘,得出每个像素的新值。

它的计算过程如下所示:

a=40*1+107*2+5*1+198*2+226*8+223*2+37*1+68*2+193*1
b=a*(1/(1*4+2*4+8))
print(b)

卷积核的大小

前面举的例子是以3x3大小的卷积核为例,这里就详细补充一些有关于卷积核的知识。

卷积核的形状和权重比

卷积核的形状通常是一个矩阵,长和宽可以有所不同,但必须是奇数。在高斯滤波中,卷积核的大小通常是3x3、5x5、7x7等。其中,3x3的卷积核是最常用的,它的中心点权重最大,周围点权重逐渐减小。

 

同一尺寸的卷积核可以有不同的形式的权重比例,这些权重比例会决定卷积核对图像不同区域的关注程度。在高斯滤波中,卷积核的权重比是根据高斯函数计算得出的。高斯函数是一个钟形曲线,它的中心点权重最大,两侧的权重逐渐减小。

卷积核的归一化

在实际使用过程中,往往需要对卷积核进行归一化,以保证滤波效果的正确性。在高斯滤波中,卷积核的所有权重值都需要缩放到相同的范围内,并且总和为1,以保证卷积操作对图像的影响是平衡的,避免某些权重过大或过小导致滤波结果出现偏差。

结论

卷积核是图像处理中非常重要的概念,它可以通过卷积操作实现滤波、边缘检测等功能。在高斯滤波中,卷积核的大小、权重比例和归一化等因素都会影响滤波效果。因此,需要根据实际情况选择合适的卷积核,并对卷积核进行适当的调整,以满足不同的图像处理需求。

Opencv实现高斯滤波

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

在Opencv中,我们可以使用cv2.GaussianBlur()函数来实现高斯滤波。使用该函数时,需要输入原始图像、卷积核的大小、沿着x轴、y轴方向的高斯核标准差以及边界样式等参数。其中sigmaY和borderType是可选参数,sigmaX是必选参数,但是可以将该参数设置为 0,让函数自己去计算 sigmaX 的具体值。

import cv2
import numpy as np
import pyps.pyzjr.utility as zjr
path = 'Images/Colnoiselena.jpg'img = cv2.imread(path)
imgGaussianBlur_1=cv2.GaussianBlur(img,(1,1),0,0)
imgGaussianBlur_3=cv2.GaussianBlur(img,(3,3),0,0)
imgGaussianBlur_5=cv2.GaussianBlur(img,(5,5),0,0)
imgGaussianBlur_7=cv2.GaussianBlur(img,(7,7),0,0)imgStack = zjr.stackImages(0.6, ([imgGaussianBlur_1, imgGaussianBlur_3], [imgGaussianBlur_5, imgGaussianBlur_7]))
cv2.imshow("imges",imgStack)
cv2.waitKey(0)
cv2.destroyAllWindows()

实现效果:

一般情况下,卷积核大小和高斯核标准差是需要根据实际场景进行调整的。如果需要对图像进行更强的模糊处理,可以增加sigma值和卷积核的大小;如果需要对图像进行较弱的模糊处理,可以减小sigma值和卷积核的大小。

Python手写实现高斯滤波

import cv2
import numpy as np
import pyps.pyzjr.utility as zjr
path = 'Images/Colnoiselena.jpg'
img = cv2.imread(path)def gaussian_kernel(size, sigma):kernel = np.zeros((size, size), dtype=np.float32)center = size // 2for i in range(size):for j in range(size):x, y = i - center, j - centerkernel[i, j] = np.exp(-(x**2 + y**2)/(2*sigma**2))kernel /= 2 * np.pi * sigma**2kernel /= np.sum(kernel)return kerneldef Gaussian_Filtering(img, kernel_size, sigma):kernel = gaussian_kernel(kernel_size, sigma)height, width, channels = img.shaperesult = np.zeros_like(img, dtype=np.float32)pad_size = kernel_size // 2img_pad = np.pad(img, [(pad_size, pad_size), (pad_size, pad_size), (0, 0)], mode='constant')for c in range(channels):for i in range(pad_size, height + pad_size):for j in range(pad_size, width + pad_size):result[i - pad_size, j - pad_size, c] = np.sum(kernel * img_pad[i - pad_size:i + pad_size + 1, j - pad_size:j + pad_size + 1, c])return np.uint8(result)imgGaussianBlur_1 = Gaussian_Filtering(img, 1, 1.5)
imgGaussianBlur_3 = Gaussian_Filtering(img, 3, 1.5)
imgGaussianBlur_5 = Gaussian_Filtering(img, 5, 1.5)
imgGaussianBlur_7 = Gaussian_Filtering(img, 7, 1.5)
imgStack = zjr.stackImages(0.6, ([imgGaussianBlur_1, imgGaussianBlur_3], [imgGaussianBlur_5, imgGaussianBlur_7]))
cv2.imshow("imges",imgStack)
cv2.waitKey(0)
cv2.destroyAllWindows()

与手写实现均值滤波的情况大致相同,还是计算速度比较慢的情况,不过这里从效果来看,又是相差不大。

下面是这个函数的具体实现过程:

  • 定义一个高斯核:首先通过 gaussian_kernel() 函数生成一个高斯核,该函数根据输入的 sizesigma 参数生成一个高斯核,其中 size 表示高斯核的大小, sigma 表示高斯核的标准差。

  • 对图像进行补零:由于高斯滤波是在图像的像素周围应用高斯核,因此需要对图像进行补零处理,以便在图像的边缘区域进行高斯卷积时不会出现越界的情况。这里使用 np.pad() 函数来实现对图像的补零操作,其中只对高和宽两个维度进行填充,通道维度不进行填充。

  • 实现高斯卷积:对于每一个像素,将以它为中心的区域和高斯核进行卷积,这里使用嵌套的三重循环对图像进行遍历,其中 c 表示图像的通道数, ij 表示当前像素的位置。

  • 将卷积结果存储在结果矩阵中:将卷积的结果保存在一个结果矩阵中,该矩阵与原始图像具有相同的大小。最后将该结果矩阵转换为uint8格式并返回。

需要注意的是,在对图像进行高斯滤波时,应该对每一个通道分别进行处理,因此在高斯卷积的循环中需要增加一个针对通道的循环。

参考文章

(13条消息) 图像处理:推导五种滤波算法(均值、中值、高斯、双边、引导)_高斯滤波,均值滤波,中值滤波_夏天是冰红茶的博客-CSDN博客

(19条消息) 高斯滤波(Gauss filtering)_半濠春水的博客-CSDN博客

(6条消息) 高斯滤波及其原理_声希Censh的博客-CSDN博客

图像处理:高斯滤波算法相关推荐

  1. FPGA丨高斯滤波算法实现

    参考:小梅哥的<FPGA系统设计与验证实战指南> 一.算法介绍 高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程.通俗的讲,高斯滤波就是对整幅图像进行加权平均的 ...

  2. 图像处理---高斯滤波

    //GaussianBlur(); IplImage* iplImage; cvSmooth(plDestImage, plDestImage, CV_GAUSSIAN, 3, 3, 3 , 3);/ ...

  3. 数字图像处理之高斯滤波加速优化

    在上一篇文章中,我们讲了高斯滤波以及分离高斯滤波的原理与C++实现.本文将在此基础上,分别详细讲解使用SSE指令和CUDA来对分离高斯滤波算法的优化加速. 一.SSE指令优化 我们知道,SSE指令优化 ...

  4. NR基础篇上——均值滤波、高斯滤波、双边滤波、NLM

    人类的世界就是一个信号传输的世界,所以噪声无处不在,图像作为一种信号传输的方式当然也无法幸免.为了尽量减少噪声对图像质量的影响,还原物体的本来状态就提出了一系列降噪的方法,本文就简单介绍几种常见的降噪 ...

  5. 高斯滤波详解 python实现高斯滤波

    一. 高斯滤波 高斯滤波是一种线性平滑滤波器,对于服从正态分布的噪声有很好的抑制作用.在实际场景中,我们通常会假定图像包含的噪声为高斯白噪声,所以在许多实际应用的预处理部分,都会采用高斯滤波抑制噪声. ...

  6. 卷积滤波 英文_图像的卷积(滤波)运算(二)——高斯滤波

    1.高斯滤波原理 根据数学知识,一维高斯函数可以描述为: 在图像处理中,选定X方向上长度为3的窗口,令δ=1,中心坐标为1,由上述公式,其卷积核(Xa,X,Xb)可以如下计算: Xa = exp(-1 ...

  7. 高斯滤波知识点总结——KF、EKF、UKF以及IF、EIF等

    高斯滤波知识点总结--KF.EKF.UKF以及IF.EIF等 1 引言 本文是我在学习<Probabilistic Robotics >这本书中第三章--高斯滤波过程中的一些知识总结.本文 ...

  8. 图像处理:推导五种滤波算法(均值、中值、高斯、双边、引导)

    目录 概论 算法原理 1.均值滤波 2.中值滤波 3.高斯滤波 4.双边滤波 5.引导滤波 手写代码 Opencv代码实现 最后的总结 参考文章 概论 本来打算是分开推导的,但我觉得还是整个合集吧,避 ...

  9. Python 图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波

    作者 | 杨秀璋,责编 | 夕颜 题图  | 视觉中国 出品 | CSDN博客 本篇文章主要讲解Python调用OpenCV实现图像平滑,包括四个算法:均值滤波.方框滤波.高斯滤波和中值滤波.全文均是 ...

最新文章

  1. 《研磨设计模式》chap17 策略模式(1) 简介
  2. SAP MM模块相关透明表收集
  3. 全局唯一递增的id_分布式ID生成方法-趋势有序的全局唯一ID
  4. 编写MyLayer,2 锚点,3 精灵的创建,4 zorder
  5. [ lucene FAQ ] 当磁盘索引被IndexSearcher打开时,为什么优化操作后索引容量翻倍?...
  6. vue-cli 打包
  7. PEACHPIE 0.9.11 版本发布,可以上生产了
  8. 2018-6-19bash编程之循环
  9. python 读写文件 另存为_python读写文件(五)
  10. 数据拟合---使用自定义函数进行非线性拟合 -在Origin。matlab拟合工具箱cftool
  11. html烟花特效,发射粒子特效,爱心特效,动态祝福、节日祝福网页,时间罗盘,黑客帝国代码雨、文字闪烁、表白爱心网页等等(附下载链接)
  12. 阿里巴巴协助征战SARS(简单)
  13. 互联网中的裂变是什么?
  14. 【JS】每日一题:模块化
  15. Aurix 多核链接文件 lsl --- 上篇
  16. 为什么要使用异常及java异常的使用--及js、php、golang的异常机制
  17. c语言变量是直接寻址,直接寻址页变量
  18. 《Python语言程序设计》实验二
  19. Excel自定义排序(可按某一列排序)
  20. Android进程间通信总结

热门文章

  1. 示波器1m和50欧姆示阻抗匹配_示波器的阻抗选择
  2. safari浏览器找不到服务器怎么办,IOS系统中Safari图标不见了怎么办 safari浏览器不见了找回方法图解...
  3. eBay、亚马逊、Lazada、Shopee、速卖通、美客多等跨境电商平台,测评自养号需要满足什么条件?listing如何优化?
  4. c语言kbhit函数6,C语言中kbhit()函数怎么复位
  5. 什么是Heads-up displays(HUD)
  6. 和席慕容《一颗开花的树》
  7. SVN提交报错: txn-current-lock拒绝访问。
  8. 三维点图和三维PCA图
  9. c语言试题及答案解析,C语言期末考试题(卷)(含答案解析).doc
  10. 计算机太卡了怎么解决,电脑太卡怎么办最有效