图像平滑处理

news2024/12/23 22:47:37

  平滑处理是指在某些数学和统计分析中,对于原始数据做出拟合,并生成更平滑的数据。这通常是为了抑制原始数据中的离群点或噪声,使得数据更具可读性和可解释性。

  在图像处理中常用于模糊处理和降低噪声。平滑滤波器使用给定邻域内的像素平均灰度值或逻辑运算值代替原始图像中像素的灰度值,这种处理降低了图像灰度的“尖锐”变化。但图像边缘也是图像灰度尖锐变化带来的特性,因此平滑空间滤波器有边缘模糊化的负面效应。

  平滑滤波器可分为平滑线性滤波器和平滑非线性滤波器。

平滑线性空间滤波器

  平滑线性空间滤波器的优点是,它们可以在保留图像细节的同时去除噪声。但是,这种方法也有一个缺点,就是它可能会模糊图像中的细节。因此,在使用平滑线性空间滤波器时,需要权衡保留图像细节和去除噪声之间的平衡。平滑线性空间滤波器的输出是给定邻域像素灰度值的简单平均或加权值。

  

  平滑线性空间滤波器 又称均值滤波器。主要降低图像中噪声,同时去除不相关细节,使不相关细节与背景糅合在一起,从而使感兴趣目标更易于检测,此时模板大小与不相关细节的尺寸有关。(举个栗子:将一滴白色颜料滴入一桶黑色颜料中,搅拌搅拌,虽然颜色可能稍微有点变淡,却依然是黑色颜料。白色颜料在黑色颜料桶中产生的影响无足轻重)。

   如上图,3*3盒状滤波器模板。滤波器响应式:

                                                     R=\frac{1}{mn}\sum_{i=1}^{mn}z_{i}

  R是由m*n大小模板定义的均值滤波器响应,模板中所有系数均为1/mn,这种滤波器叫盒状滤波器,是最简单的均值滤波器。

  下面是盒状滤波器代码,使用不同盒状滤波器对图像进行滤波:

import numpy as np
from scipy import signal
from skimage import io
from matplotlib import pyplot as plt


# 定义二维灰度图像空间滤波函数:
def filter2d(img, window):
    s = signal.correlate2d(img, window, mode='same', boundary='fill')  # fill 滤波前用常值填充图像边缘,默认为0
    return s.astype(np.uint8)  # 可以将数组的数据类型转换为无符号 8 位整


img = io.imread("demo.jpg")
# 3*3盒装模型
win1 = np.ones((3, 3)) / (3 ** 2)
# 5*5
win2 = np.ones((5, 5)) / (5 ** 2)
# 9*9
win3 = np.ones((9, 9)) / (9 ** 2)
# 生成滤波结果
img1 = filter2d(img, win1)
img2 = filter2d(img, win2)
img3 = filter2d(img, win3)
# 显示图像
plt.subplot(121)
plt.title("gray")
plt.imshow(img, cmap='gray')
plt.subplot(122)
plt.title("3*3")
plt.imshow(img1, cmap='gray')
plt.show()
plt.subplot(121)
plt.title("5*5")
plt.imshow(img2, cmap='gray')
plt.subplot(122)
plt.title("9*9")
plt.imshow(img3, cmap='gray')
plt.show()

 

 

  观察图像,发现3*3滤波结果比原始灰度图的花瓣更加平滑。与原始灰度图相比,5*5也使得花瓣变平滑,但背景稍微有点模糊,9*9滤波结果更模糊。随着滤波模板的增大,将图像的花瓣和任务也模糊化了。

  常用的均值滤波器是加权平均的,距离越近的像素点权重越大,越远的像素点权重越小。高斯分布显然是一种可取的权重配模式。高斯分布是一种钟形曲线,越接近中心,却只越大,越远离中心,取值越小。高斯滤波器是一类根据高斯函数的形状选择权重的线性平滑滤波器。高斯平滑滤波器对抑制服从正态分布的噪声非常有效。

二维高斯函数

 

import numpy as np
import matplotlib.pyplot as plt

# 创建x,y轴值
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)

# 计算高斯方程
mu = np.array([0, 0])  # 平均
sigma = np.array([[1, 0], [0, 1]])  # 方差矩阵
Z = np.exp(-0.5 * np.sum((np.dstack([X, Y]) - mu) @ np.linalg.inv(sigma) * (np.dstack([X, Y]) - mu), axis=2))


plt.imshow(Z, extent=(-5, 5, -5, 5))
plt.colorbar()
plt.show()

二维高斯图像:

  

  上式中,\sigma标准差,二维高斯滤波模板,模板系数和为1,滤波器系数为:

W(i,j)=\frac{1}{\sum_{i=-1}^{a}\sum_{j=-b}^{b}G(i,j)}*G(i,j)

import math

import numpy as np
from scipy import signal
from skimage import io
from matplotlib import pyplot as plt


# 定义二维灰度图像空间滤波函数:
def filter2d(img, window):
    s = signal.correlate2d(img, window, mode='same', boundary='fill')  # fill 滤波前用常值填充图像边缘,默认为0
    return s.astype(np.uint8)  # 可以将数组的数据类型转换为无符号 8 位整


# 定义二维高斯函数
def gauss(i, j, sigma):
    return 1 / (2 * math.pi * sigma ** 2) * math.exp(-(i ** 2 + j ** 2) / (2 * sigma ** 2))


# 定义r*r高斯模板
def gauss_win(r, sigma):
    win = np.zeros((r * 2 + 1, r * 2 + 1))
    for i in range(-r, r + 1):
        for j in range(-r, r + 1):
            win[i + r][j + r] = gauss(i, j, sigma)
    return win / np.sum(win)


img = io.imread("demo.jpg")

# 3*3高斯平滑模型
win1 = gauss_win(3, 1.0)
# 5*5
win2 = gauss_win(5, 1.0)
# 9*9
win3 = gauss_win(9, 1.0)
# 生成滤波结果
img1 = filter2d(img, win1)
img2 = filter2d(img, win2)
img3 = filter2d(img, win3)
# 显示图像
plt.subplot(121)
plt.title("gray")
plt.imshow(img, cmap='gray')
plt.subplot(122)
plt.title("3*3")
plt.imshow(img1, cmap='gray')
plt.show()
plt.subplot(121)
plt.title("5*5")
plt.imshow(img2, cmap='gray')
plt.subplot(122)
plt.title("9*9")
plt.imshow(img3, cmap='gray')
plt.show()

主要理解思想,代码理解即可。

 

  随着高斯滤波模板增大,滤波结果越来越平滑。与盒状滤波模板相比,高斯滤波平滑效果更加柔和,不容易产生模糊效果。

  您也可以使用skimage自带库函数:

from skimage import filters,io

# 读取图像
image = io.imread("demo.jpg")

# 高斯滤波,标准差为 1.0
filtered_image = filters.gaussian(image, sigma=1.0)

# 保存滤波后的图像
io.imsave("filtered_image.jpg", filtered_image)

统计排序滤波器

  

  统计排序滤波器是一种非线性的图像滤波器,它的工作原理是对图像的每个像素周围的像素值进行排序,然后选择一个中间值(通常是中位数)作为输出像素的值(中值滤波)。

这种方法可以有效地去除图像中的噪声,因为噪声的值通常不会在图像的像素值分布中心,所以选择中位数可以有效地把噪声排除在外。

统计排序滤波器常用于去除椒盐噪声。椒盐噪声是一种很常见的图像噪声,它是由若干个随机的黑点或白点组成的,这些点的值通常比周围的像素值要大或小得多。

  中值滤波使图像中突出的亮点(暗点)更像周围的值,以消除孤立的亮点(暗点),达到平滑的目的。

中值滤波:

from scipy import ndimage
from skimage import io, util
import matplotlib.pyplot as plt

img = io.imread("demo.jpg")
# 加入椒盐噪声
noise = util.random_noise(img, mode='s&p', seed=None, clip=True)
# 中值滤波
n = 3
new_img = ndimage.median_filter(noise, (n, n))
# 显示图像
plt.figure()
plt.imshow(img, cmap='gray')
plt.figure()
plt.imshow(noise, cmap='gray')
plt.figure()
plt.imshow(new_img, cmap='gray')
plt.show()

 原图:

加噪:

 

中值滤波:

   也可以对彩色图像进行空间滤波。对RGB图像空间滤波相当于分别对R,G,B三通道图像进行空间滤波。

 

import numpy as np
from skimage import util ,io
from matplotlib import pyplot as plt
from scipy import ndimage as ndi
#原始RGB
img=io.imread("D1.jpg")
noise=np.zeros(img.shape)
img1=np.zeros(img.shape)
for i in range(3):
    gray=img[:,:,i]
    #加噪
    noise[:,:,i]=util.random_noise(gray,mode='s&p',seed=None,clip=True)
    #中值滤波
    n=3
    img1[:,:,i]=ndi.median_filter(noise[:,:,i],(n,n))

plt.figure()
plt.imshow(img)
plt.show()
plt.figure()
plt.imshow(noise)
plt.show()
plt.figure()
plt.imshow(img1)
plt.show()

原图:

加噪:

 

 滤波:

  

  排序滤波器里还有最大值滤波器和最小值滤波器。最大值滤波器和最小值滤波器是图像处理和计算机视觉中经常使用的操作。

最大值滤波器会在输入图像的每个像素周围的一个区域中找到最大值,并将这个最大值赋给输入图像的对应像素。这个区域通常被称为滤波器的窗口或内核。

最小值滤波器也是类似的,它会在输入图像的每个像素周围的一个区域中找到最小值,并将这个最小值赋给输入图像的对应像素。

最大值滤波器和最小值滤波器通常用于去除图像噪声或者提升图像对比度。它们也可以用于找到图像中的边缘或者关键点。

下面是最大值和最小值滤波结果:


from skimage import util, io
from matplotlib import pyplot as plt
from scipy import ndimage as ndi

# 原始RGB
img = io.imread("D1.jpg")[:, :, 0]
# 加入胡椒噪声
pepper = util.random_noise(img, mode='pepper', seed=None, clip=True)
# 加入盐粒噪声
salt = util.random_noise(img, mode='salt', seed=None, clip=True)
n = 3
# 最大值滤波
max_img = ndi.maximum_filter(pepper, (n, n))
# 最小值滤波
min_img = ndi.minimum_filter(salt, (n, n))
# 显示
plt.subplot(121)
plt.title("demo")
plt.imshow(img, cmap='gray')
plt.subplot(122)
plt.title("pepper")
plt.imshow(pepper, cmap='gray')
plt.show()
plt.subplot(121)
plt.title("salt")
plt.imshow(salt, cmap='gray')
plt.subplot(122)
plt.title("max")
plt.imshow(max_img, cmap='gray')
plt.show()
plt.figure()
plt.title("min")
plt.imshow(min_img, cmap='gray')
plt.show()

 原图和加胡椒噪声图像:

加盐粒噪声图像和最大值滤波图像:

最小值滤波图像:

 

 

   观察上述图像,可以看到最大值滤波图像比原图更亮,最小最滤波图像比原图更暗。最大值滤波对去除胡椒噪声非常有效,最小值滤波对去除盐粒噪声很有效。

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

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

相关文章

Word处理控件Aspose.Words功能演示:在 C# .NET 中将 Word 转换为 PDF - 完整指南

Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。此外, Aspose API支持流行文件格式处…

JS面试题--JavaScript基础

1. new操作符的实现原理 创建一个对象将构造函数的作用域赋给新对象(也就是将对象的__proto__属性指向构造函数的prototype属性)指向构造函数中的代码,构造函数中的this指向该对象(也就是为这个对象添加属性和方法)返…

Arthas tt -t , tt -i 以及 watch相关使用理解 解析入参和结果等

Arthas tt 系列作用 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测 一、 tt -t 作用和一般用法 tt -t 一般用于监控某一个方法的调用记录,如果调用多此会出现多条记录,一…

怎么申请icp备案?怎么查询icp备案是否申请成功

什么是icp备案号? 简单来说,icp备案号,就是你网站的备案号码。icp备案号就是当你的网站提交备案资料,经工业信息化产业部(及各地通信管理局)审核通过后,会通过电子邮箱发送一个备案号码给你…

JVM内存结构及内存溢出OOM

JVM内存结构JVM的内存结构大致分为五个部分,分别是程序计数器、虚拟机栈、本地方法栈、堆和方法区。除此之外,还有由堆中引用的JVM外的直接内存。下面将展开讲解这五个部分。程序计数器程序计数器(Program Counter Register),用于记录下一条J…

券商接口关闭的情况下怎么做到实时量化买入?通达信破解接口可以吗?

现在券商接口关闭的情况下怎么做到实时量化买入?量化买入有一些第三方软件是可以破解券商接口的。像通达信破解接口它有一个什么机构版还是什么,他可以同时几个券商一起买入,当然这个你需要用手工输入。像其他的像一些A计划,它就是…

【 java 集合】List接口常用实现类对比以及ArrayList和LinkedList源码分析

📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言&#x1f4d…

绿控传动冲刺科创板上市:连年亏损,现金流紧张,计划募资11亿元

近日,苏州绿控传动科技股份有限公司(下称“绿控传动”)在上海证券交易所递交招股书,准备在科创板上市。 本次冲刺上市,绿控传动计划募资10.72亿元,其中7.16亿元用于年产新能源商用车电驱动系统10万套项目&a…

泛微特色政务应用:对内协同办公、对外高效服务,推动政务数字化

近年来,国家不断深入建设“数字化政府”,政务服务“网上办”、“掌上办”、“一网通办”已经成为政务服务新方向。 泛微数字化运营平台为各级政府机关、行政事业单位,打造覆盖各级市、区、县、乡镇街道、村及各级社区部门的网上协同办公平台…

Qt编译CTK

文章目录一、CTK简介二、CTK下载三、CTK编译一、CTK简介 CTK是什么 CTK 为支持生物医学图像计算的公共开发包,其全称为 Common Toolkit CTK 提供了什么 当前,CTK 工作的主要范围包括: DICOM:提供了从 PACS 和本地数据库中查询和…

基础数据结构——链表

目录 一、链表 1、数组的缺点 2、链表 3、单向链表 4、双向链表 5、Python链表的实现 二、例题 一、链表 1、数组的缺点 1)需要占用连续的空间 若某个数组很大,可能没有这么大的连续空间给它用。 2)不方便删除和插入 例如删除数组…

MySQL如何查看未提交的事务SQL

点击上方蓝字关注我MySQL中经常遇到事务中的SQL正在执行或执行完成后未提交,如何找出对应的SQL?1. 查看正在执行的SQL查看事务中正在执行的SQL方式有多种,例如1.1 通过processlist查看会话1:执行1个SQLmysql> begin; Query OK…

AC7811-BLDC无感控制代码调试与测试记录

接线注意 供电 对于 AC781x 电机 Demo 板,其 MCU 控制板和功率板的 12V 输入只需接一路即可,如果电机额定电压为 12V,那么将功率板中的功率管供电模式选择跳点(靠近 D5)短接即可,不需要再额外供电;如果电机的额定电压…

配置磁盘多路径聚合

一 安装多路径软件 yum install -y device-mapper device-mapper-multipath 二 配置多路径聚合 在每个节点上都需要配置下多路径聚合。 /* 注意事项: 新添加盘后要扫描下,才能识别到(如果已经看到盘了,即执行multipath -ll能看到&#…

《收获,不止Oracle》读书笔记之性能提升千倍

体系学习让SQL语句性能提升千倍 未优化前,单车速度 drop table t purge; create table t(x int);create or replace procedure proc1 as beginfor i in 1..100000loopexecute immediateinsert into t values (||i||);commit;end loop; end; / /*这里要记得预先执行…

linux下常用调试技巧

1 linux下如何查看静态库和动态库都链接了那些库 1.1 静态库.a是没有指令可以看到其在生成过程中链接了那些库的 1.2 动态库.so可以通过ldd指令查看其在生成过程中链接了那些库 还有一种简单直观的方法,我们可以在编译过程中看到所生成的二进制文件,链接了那些库: 平时编译…

[阶段4 企业开发进阶] 7. 微服务--SpringCloud Alibaba

文章目录1 服务注册和配置中心Nacos1.1 Nacos简介1.2 Nacos作为服务注册中心服务提供者注册服务消费者注册和负载服务注册中心对比1.3 Nacos作为服务配置中心基础配置分类配置DataID方案配置Group方案配置Namespace方案配置1.4 Nacos集群和持久化配置2 服务熔断和限流SentinelS…

指针仪表读数识别系统 yolov7

指针仪表读数识别系统通过 yolov7opencv计算机视觉分析技术,利用现场摄像头可以自动识别指针型仪表读数并将读数回传给平台节省人工巡检读表的时间。YOLOv7 在 5 FPS 到 160 FPS 范围内,速度和精度都超过了所有已知的目标检测器,并在V100 上,…

【日常系列】LeetCode《24·贪心1》

数据规模->时间复杂度 <10^4 &#x1f62e;(n^2) <10^7:o(nlogn) <10^8:o(n) 10^8<:o(logn),o(1) 内容 lc 455 &#xff1a;分发饼干 - 贪心思想 https://leetcode.cn/problems/assign-cookies/ 提示&#xff1a; 1 < g.length < 3 * 10^4 0 < s.len…

配置双网卡聚合

一 服务器多网卡聚合的意义 1、多网卡聚合&#xff0c;可以起到网络链路冗余作用&#xff0c;当故障发生时&#xff0c;网络自动切换&#xff0c;保证业务数据不中断。 2、多网卡聚合成一条虚拟链路&#xff0c;可实现网络带宽提升&#xff0c;如2个1000Mbps的网卡聚合&#…