图像处理之高斯滤波

news2025/2/3 17:04:50

文章目录

  • 高斯函数
    • 1.一维高斯函数
    • 2. 二维高斯函数
  • 高斯滤波
    • 1.高斯核生成
    • 2.滤波过程

高斯函数

高斯函数广泛应用于统计学领域,用于表述正态分布,在信号处理领域,用于定义高斯滤波器,在图像处理领域,二维高斯核函数常用于高斯模糊Gaussian Blur,在数学领域,主要是用于解决热力方程和扩散方程,以及定义Weiertrass Transform。

1.一维高斯函数

高斯函数,Gaussian Function, 也简称为Gaussian,一维形式如下:
f ( x ) = a e − ( x − b ) 2 2 c 2 f(x)=ae^{- \frac{(x-b)^2}{2c^2}} f(x)=ae2c2(xb)2
函数图像如下:
一维高斯图像
其中

  • a a a表示曲线高度;
  • b ( μ ) b(\mu) b(μ)表示曲线在 x x x轴的中心;
  • c ( σ ) c(\sigma) c(σ)表示半峰宽度有关;

2. 二维高斯函数

二维高斯函数在计算机视觉领域用处广泛,利用0均值的二维高斯函数,可以生成高斯卷积核,用于图像处理中的高斯滤波,实现高斯模糊,可以去除噪声。
公式如下:
G ( x , y ) = 1 2 π σ 2 e − ( x 2 + y 2 ) 2 σ 2 G(x,y)=\frac{1}{2\pi\sigma^2}e^{-\frac{(x^2+y^2)}{2\sigma^2}} G(x,y)=2πσ21e2σ2(x2+y2)
三维立体图:
在这里插入图片描述
等高线图:
在这里插入图片描述
画图代码如下:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 定义二维高斯函数
def Gaussian(x, y, x0, y0, sigma):
    return np.exp(-((x - x0)**2 + (y - y0)**2) / (2.0 * sigma**2))

# 设置参数
sigma = 2
x, y = np.meshgrid(np.linspace(-5, 5), np.linspace(-5, 5))

# 计算高斯函数
z = Gaussian(x, y, 0, 0, sigma)

# 绘制3D图形
fig = plt.figure()
ax = Axes3D(fig)

#plt.get("可选参数如下"),可故意写错,报错可以提醒正确的配色
# 'Accent', 'Accent_r', 'Blues', 'Blues_r', 'BrBG', 'BrBG_r', 'BuGn', 'BuGn_r', 'BuPu', 'BuPu_r', 'CMRmap', 'CMRmap_r', 'Dark2', 'Dark2_r', 'GnBu', 'GnBu_r', 'Greens', 'Greens_r', 'Greys', 'Greys_r', 'OrRd', 'OrRd_r', 'Oranges', 'Oranges_r', 'PRGn', 'PRGn_r', 'Paired', 'Paired_r', 'Pastel1', 'Pastel1_r', 'Pastel2', 'Pastel2_r', 'PiYG', 'PiYG_r', 'PuBu', 'PuBuGn', 'PuBuGn_r', 'PuBu_r', 'PuOr', 'PuOr_r', 'PuRd', 'PuRd_r', 'Purples', 'Purples_r', 'RdBu', 'RdBu_r', 'RdGy', 'RdGy_r', 'RdPu', 'RdPu_r', 'RdYlBu', 'RdYlBu_r', 'RdYlGn', 'RdYlGn_r', 'Reds', 'Reds_r', 'Set1', 'Set1_r', 'Set2', 'Set2_r', 'Set3', 'Set3_r', 'Spectral', 'Spectral_r', 'Wistia', 'Wistia_r', 'YlGn', 'YlGnBu', 'YlGnBu_r', 'YlGn_r', 'YlOrBr', 'YlOrBr_r', 'YlOrRd', 'YlOrRd_r', 'afmhot', 'afmhot_r', 'autumn', 'autumn_r', 'binary', 'binary_r', 'bone', 'bone_r', 'brg', 'brg_r', 'bwr', 'bwr_r', 'cividis', 'cividis_r', 'cool', 'cool_r', 'coolwarm', 'coolwarm_r', 'copper', 'copper_r', 'cubehelix', 'cubehelix_r', 'flag', 'flag_r', 'gist_earth', 'gist_earth_r', 'gist_gray', 'gist_gray_r', 'gist_heat', 'gist_heat_r', 'gist_ncar', 'gist_ncar_r', 'gist_rainbow', 'gist_rainbow_r', 'gist_stern', 'gist_stern_r', 'gist_yarg', 'gist_yarg_r', 'gnuplot', 'gnuplot2', 'gnuplot2_r', 'gnuplot_r', 'gray', 'gray_r', 'hot', 'hot_r', 'hsv', 'hsv_r', 'inferno', 'inferno_r', 'jet', 'jet_r', 'magma', 'magma_r', 'nipy_spectral', 'nipy_spectral_r', 'ocean', 'ocean_r', 'pink', 'pink_r', 'plasma', 'plasma_r', 'prism', 'prism_r', 'rainbow', 'rainbow_r', 'seismic', 'seismic_r', 'spring', 'spring_r', 'summer', 'summer_r', 'tab10', 'tab10_r', 'tab20', 'tab20_r', 'tab20b', 'tab20b_r', 'tab20c', 'tab20c_r', 'terrain', 'terrain_r', 'turbo', 'turbo_r', 'twilight', 'twilight_r', 'twilight_shifted', 'twilight_shifted_r', 'viridis', 'viridis_r', 'winter', 'winter_r'
ax.plot_surface(x, y, z, rstride=2, cstride=2, cmap=plt.get_cmap('BuGn'))
plt.savefig('gaussianFunction.jpg')
plt.show()

# 绘制等高线图形
plt.contourf(x, y, z, 10, cmap=plt.get_cmap('PuOr'))
plt.savefig('gaussianContourf.jpg')
plt.show()

高斯滤波

1.高斯核生成

若要生成 ( 2 k + 1 ) ∗ ( 2 k + 1 ) (2k+1)*(2k+1) (2k+1)(2k+1)大小的高斯核,生成公式如下:
G [ i , j ] = 1 2 π σ 2 e − ( ( x − k − 1 ) 2 + ( y − k − 1 ) 2 ) 2 σ 2 G[i,j]=\frac{1}{2\pi\sigma^2}e^{-\frac{((x-k-1)^2+(y-k-1)^2)}{2\sigma^2}} G[i,j]=2πσ21e2σ2((xk1)2+(yk1)2)
其中 σ x = σ y = σ \sigma_x=\sigma_y=\sigma σx=σy=σ
G h [ i , j ] = G [ i , j ] s u m G ( 归一化 ) G_h[i,j]=\frac{G[i,j]}{sumG} (归一化) Gh[i,j]=sumGG[i,j](归一化)
其中 s u m G sumG sumG G [ i , j ] G[i,j] G[i,j]的和

2.滤波过程

在这里插入图片描述
图片来自于这里

下面是 5x5 ,σ=25高斯滤波器的实现代码:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import math
import cv2
import imgShow as iS
import random
# 去除噪音 - 使用 5x5 的高斯滤波器
def gaussianSmooth(img_gray):
    # 1.生成高斯滤波器/高斯核
    """
    要生成一个 (2k+1)x(2k+1)的高斯滤波器,滤波器的各个元素计算公式如下:2*k+1=5,k=2,
    H[i, j] = (1/(2\*pi\*sigma\*\*2))\*exp(-1/2\*sigma\*\*2((i-k-1)\*\*2 + (j-k-1)\*\*2))
    """
    sigma = 25
    gau_sum = 0
    gaussian = np.zeros([5, 5])
    for i in range(5):
        for j in range(5):
            gaussian[i, j] = math.exp((-1 / (2 * sigma * sigma)) * (np.square(i - 2) + np.square(j - 2)))
            gau_sum = gau_sum + gaussian[i, j]
    # 2.高斯滤波器归一化处理
    gaussian = gaussian / gau_sum
    print(gaussian)

    # 3.高斯滤波
    W, H = img_gray.shape
    new_gray = np.zeros([W , H])
    for i in range(W):
        for j in range(H):
            if(i<W-5 and j<H-5):
                new_gray[i,j] = np.sum(img_gray[i:i + 5, j:j + 5] * gaussian)
            else:
                new_gray[i,j] =img_gray[i,j]
    return new_gray


def gauss_noise(img, mean=0, sigma=25):
    image = np.array(img / 255, dtype=float)  # 将原始图像的像素值进行归一化
    # 创建一个均值为mean,方差为sigma,呈高斯分布的图像矩阵
    noise = np.random.normal(mean, sigma / 255.0, image.shape)
    out = image + noise  # 将噪声和原始图像进行相加得到加噪后的图像
    res_img = np.clip(out, 0.0, 1.0)
    res_img = np.uint8(res_img * 255.0)
    return res_img


img = cv2.imread('PeppersRGB.tif')
grayImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
noiseImg=gauss_noise(grayImg)
smoothImg = gaussianSmooth(grayImg)
iS.showImagegray(smoothImg, noiseImg, 25, 15, 'smoothImg', 'origin', './GaussianSmooth.jpg')
GaussianBlur_opencv=cv2.GaussianBlur(noiseImg,(5,5),25)
iS.showImagegray(GaussianBlur_opencv,noiseImg , 25, 15, 'GaussianBlur_opencv', 'origin', './GaussianSmooth_Opencv.jpg')

高斯核(归一化)显示结果
在这里插入图片描述

显示子图代码如下:

import matplotlib.pyplot as plt
#图像实际大小为 W*100 * H*100 像素  ,
def showImagegray(newImg,oldImg,W,H,newImgtitle,oldImgtitle,saveImgpath):

    plt.figure(figsize=(W,H))
    plt.subplot(121)
    plt.title(oldImgtitle,fontsize=30)
    plt.axis('off')
    plt.imshow(oldImg, cmap='gray')

    plt.subplot(122)
    plt.title(newImgtitle,fontsize=30)
    plt.axis('off')
    plt.imshow(newImg, cmap='gray')
    # plt.tight_layout()  # 调整整体空白
    plt.savefig(saveImgpath)
    plt.show()

代码效果如下:

在这里插入图片描述
在这里插入图片描述

点击这里整体代码可见github上代码
Opencv实现高斯滤波

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/762132.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

创建一个类Person的简单实例

创建一个类Person的简单实例 创建一个类Person&#xff0c;包含以下属性&#xff1a;姓名&#xff08;name&#xff09;、年龄&#xff08;age&#xff09;、朋友&#xff08;friends数组&#xff09;、问候&#xff08;sayhi方法&#xff0c;输出问候语&#xff0c;例如&#…

将TXT转化为PDF的软件,分享两个简单的方法!

在数字化时代&#xff0c;文档的传递和共享已经成为我们日常工作中的一部分。然而&#xff0c;有时我们可能需要将文本文件&#xff08;如TXT格式&#xff09;转换为PDF格式&#xff0c;以便更方便地共享、打印或存档。PDF格式的文件具有普遍的兼容性&#xff0c;可以在不同的设…

ESP32-C3 VSCode开发环境搭建

之前的文章 ESP32MicroPython开发环境的搭建 介绍了ESP32 MicroPython开发环境的搭建&#xff0c;此次计划采用ESP32-C3做小飞机主控&#xff0c;不太适合用MicroPython&#xff0c;要用ESP-IDF原生框架&#xff0c;因为平时一直用vs code编辑器&#xff0c;所以就选了vs code做…

数据库的扩展策略

了解不同的数据库扩展技术可以帮助我们选择适合我们需求和目的的合适策略。 因此&#xff0c;在本文中&#xff0c;我们将展示不同的解决方案和技术&#xff0c;用于扩展数据库服务器。它们分为读取和写入策略。 读取/加载 有时我们的应用程序承受着巨大的负载。为了解决这个…

1.1基于stc89c51系例单片机的空气温湿度检测报警系统

基于STC89C51系列单片机的空气温湿度检测报警系统 文章目录 基于STC89C51系列单片机的空气温湿度检测报警系统概述项目背景硬件设计1. STC89C51单片机2. DHT11温湿度模块3. LCD1602显示模块4. 人机交互模块5. 电源模块 软件设计1. 硬件初始化2. DHT11数据读取3. 数据显示4. 报警…

浅读-《深入浅出Nodejs》

这次算是重读 深入浅出Nodejs&#xff0c;了解到很多之前忽略的细节&#xff0c;收获蛮多&#xff0c;这次顺便将其记录分享&#xff0c;对学习和了解Nodejs有及其大的帮助。 1.Nodejs 事件驱动、非阻塞IO&#xff0c;一个开源和跨平台的 JavaScript 运行时环境&#xff1b;异…

手机直播app源码部署搭建:带货潮流,商城功能!

随着互联网时代的迅猛发展&#xff0c;手机直播app源码平台早已成为了人们获取资讯、娱乐放松等方式的主要载体&#xff0c;手机直播app源码平台的日益火爆&#xff0c;也让商人们有了一个新兴的想法出现&#xff1a;直播app平台如此火爆&#xff0c;平台的用户也如此庞大&…

perl输出中文乱码【win10】

perl输出中文乱码 运行的时候输出的内容变成了中文乱码&#xff0c;原因首先来查找一下自己的perl的模块里面是否有Encode-CN。请运行打开你的cmd并输入perldoc -l Encode::CN 如果出现了地址 则就是有&#xff0c;如果没有需要进行该模块的安装。 安装方式有很多种&#xff0…

Three.js——十二、MeshPhysicalMaterial清漆层、粗糙度、物理材质透光率以及折射率(结尾附代码)

环境贴图作用测试 MeshPhysicalMaterial清漆层 MeshPhysicalMaterial和MeshStandarMaterial都是拥有金属度metalness、粗糙度roughness属性的PBR材质&#xff0c;MeshPhysicalMaterial是MeshStandarMaterial的子集&#xff0c;除了继承了他的这些属性以外&#xff0c;还新增了…

NDK OpenGL实现美颜功能

NDK​系列之OpenGL实现美颜特效&#xff0c;本节主要是在上一节大眼萌的特效视上增加美颜特效。 OpenGL视频特效系列&#xff1a; NDK OpenGL渲染画面效果 NDK OpenGL离屏渲染与工程代码整合 NDK OpenGL仿抖音极快极慢录制特效视频 NDK OpenGL与OpenCV实现大眼萌特效 NDK…

java并发编程 11:JUC之ReentrantLock使用与原理

目录 使用可重入可打断锁超时公平锁条件变量 原理非公平锁实现原理源码流程 锁重入原理可打断原理与不可打断原理公平锁原理条件变量原理await流程signal流程 使用 ReentrantLock是可冲入锁&#xff0c;与 synchronized 一样&#xff0c;都支持可重入。但是相对于 synchronize…

kafka第三课-可视化工具、生产环境问题总结以及性能优化

一、可视化工具 https://pan.baidu.com/s/1qYifoa4 密码&#xff1a;el4o 下载解压之后&#xff0c;编辑该文件&#xff0c;修改zookeeper地址&#xff0c;也就是kafka注册的zookeeper的地址&#xff0c;如果是zookeeper集群&#xff0c;以逗号分开 vi conf/application.conf 启…

如何刻录光盘

如何刻录光盘 1 、将光盘放入光驱&#xff0c;选择“用于CD/DVD播放机” &#xff0c;该模式下&#xff0c;刻录在光盘的文件无法进行编辑和删除 2 、将需要刻录的文件拷贝至光盘内&#xff0c;则会在“准备好写入光盘中的文件”下显示拷贝进去的文件&#xff0c;此时文件还没…

EDI 工作流操作指南

一个完整的EDI工作流中&#xff0c;起始端为通常为文件传输端口&#xff1a;如AS2、OFTP等&#xff0c;末端为数据库端口。此前的文章中我们对AS2端口以及数据库端口已做了详细介绍&#xff0c;本文主要介绍 EDI 文件的格式转换以及映射。 如下图所示&#xff0c;工作流界面中…

安装blissOS重启后无法进入图形化界面

重启blissOS 重启时&#xff0c;按e键两下 进入 上图是一个可编辑页面&#xff0c;不要删除修改前面的内容&#xff0c;移动光标前往quiet&#xff0c;然后删除quiet输入“ nomodeset xforceseva ”&#xff0c;然后按下回车 然后按回车&#xff0c;按b键进入系统 在set-…

class组件constructor方法

class组件constructor方法 https://blog.csdn.net/m0_37557930/article/details/116228217 https://blog.csdn.net/qq_39207948/article/details/113143131 ​ 为何我们使用子类继承父类&#xff0c;就必须在 constructor( ) 方法中调用 super( ) 方法&#xff0c;否则新建实…

【C】文件操作详解

这里写目录标题 文件操作什么是文件文件名文件类型文本文件二进制文件 文件缓冲区文件指针文件的打开和关闭fopenfclose 文件的顺序读写fgetcfputcfgetsfputcfscanffprintffwritefread比较scanf/fscanf/sscanfsscanf 比较printf/fprintf/sprintfsprintf 文件的随机读写fseekfte…

周考一之重做

输入一个学生的成绩&#xff0c;如果学习成绩>90分的同学用A表示&#xff0c;60-89分之间用B表示&#xff0c;60分以下的用C表示(10) public static void main(String[] args){ Scanner scanner new Scanner(System.in); System.out.println(“请输入学生成绩&#xff1a;…

linux图形界面总结---X、Xorg、WM、QT、GTK、KDE、GNOME的区别与联系

文章目录 一、 linux图形界面二、X协议三、Xfree86 Xorg四、WM(window manager:窗口管理器)五、X协议的Client端实现六、KDE、GNOME、QT和GTK直接关系七、参考&#xff1a; 一、 linux图形界面 linux本身没有图形界面&#xff0c;linux现在的图形界面的实现只是linux下的应用程…

值类型与引用类型

常见的值类型&#xff1a;int&#xff0c;long&#xff0c; short&#xff0c; float&#xff0c; double&#xff0c; byte&#xff0c; char&#xff0c; enum&#xff0c; struct...... 常见的引用类型&#xff1a;字符串&#xff0c; 数组&#xff0c; 类...... 区别&…