目录
一、图像平滑基础 :
- 图像平滑是图像处理中的一项基本技术,用于减少图像噪声或细节,从而使图像看起来更加平滑。图像平滑可以通过线性滤波和非线性滤波两种主要方法实现。
- 图像平滑通常指的是通过滤波器来处理图像,目的是降低噪声或细节,使得图像看起来更加平滑。平滑操作通常涉及到卷积运算,即用一个卷积核(或称滤波器、模板)在图像上滑动,并用核覆盖的图像区域的像素值与核中的权重相乘后求和,得到的结果用来替换中心像素的值。
(1)线性滤波:
线性滤波是图像平滑中的一种方法,其特点是输出是输入的线性函数。线性滤波器的输出像素值是输入像素值的加权和。常见的线性滤波方法包括:
- 均值滤波:通过计算像素及其邻域内像素值的平均值来平滑图像。这种方法简单但会模糊图像细节。
- 高斯滤波:使用高斯函数作为权重的滤波器,对图像进行加权平均,适用于去除高斯噪声,同时较好地保留图像细节。
- 方框滤波:与均值滤波类似,但权重可能不同,通常用于实现更复杂的滤波效果。
(2)非线性滤波:
非线性滤波的输出不是输入的线性函数,它在处理像素值时会考虑像素之间的关系。常见的非线性滤波方法包括:
- 中值滤波:将每个像素值替换为其邻域内像素值的中位数,特别有效于去除椒盐噪声,同时保持边缘清晰。
- 双边滤波:在平滑图像的同时保持边缘,它考虑了像素值的空间邻近度和像素值的相似度。
(3)方法和公式:
均值滤波公式:,其中 f 是原始图像,g 是滤波后的图像,k 是邻域内像素的数量。
高斯滤波公式:,其中 h 是高斯核,其值由高斯分布决定。
中值滤波:在像素的邻域内,将所有像素值排序后取中间值作为该像素的值。
双边滤波:,其中 G 是空间高斯函数,H 是灰度值相似度高斯函数,W 是归一化因子。
(4)示例代码:
使用OpenCV进行图像平滑的简单示例:
import cv2
import numpy as np
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 应用均值滤波
blurred_image = cv2.blur(image, (5, 5))
# 应用高斯滤波
gaussian_blur = cv2.GaussianBlur(image, (5, 5), 0)
# 应用中值滤波
median_blur = cv2.medianBlur(image, 5)
# 应用双边滤波
bilateral_filter = cv2.bilateralFilter(image, 9, 75, 75)
# 显示结果
cv2.imshow('Original', image)
cv2.imshow('Blurred', blurred_image)
cv2.imshow('Gaussian Blur', gaussian_blur)
cv2.imshow('Median Blur', median_blur)
cv2.imshow('Bilateral Filter', bilateral_filter)
cv2.waitKey(0)
cv2.destroyAllWindows()
二、线性滤波:
(1)归一化方框滤波器:
归一化方框滤波器(Normalized Box Filter)是一种常用的图像滤波技术,它属于线性滤波的范畴。在图像处理中,方框滤波器通过将每个像素的邻域内的像素值进行求和,然后根据邻域的大小进行归一化处理,以达到平滑图像的效果。
基本原理:
- 方框滤波器的基本原理是将图像中的每个像素替换为该像素邻域内所有像素值的总和,或者这个总和除以邻域内像素的数量(归一化)。如果选择进行归一化处理,那么滤波后的像素值将是邻域内像素值的平均值;如果不进行归一化处理,则是邻域内像素值的总和。
函数语法:
在OpenCV中,方框滤波可以通过 cv2.boxFilter()
函数实现,其基本语法如下:
dst = cv2.boxFilter(src, ddepth, ksize, anchor=(-1, -1),
normalize=True, borderType=BORDER_DEFAULT)
src
:输入图像。ddepth
:输出图像的深度,如果设置为-1,则与输入图像相同。ksize
:滤波核的大小,如(3, 3)或(5, 5)。anchor
:锚点,默认为(-1, -1),表示核的中心。normalize
:布尔值,指定是否进行归一化处理。如果设置为True,则进行归一化,即计算邻域内像素值的平均值;如果设置为False,则不进行归一化,直接使用邻域内像素值的总和。borderType
:边界处理方式,默认为BORDER_DEFAULT
。
示例代码:
使用OpenCV进行归一化方框滤波的示例:
import cv2
import numpy as np
# 读取图像
image = cv2.imread("C:\\Users\\86173\\Desktop\\TI\\faves.png")
# 应用归一化方框滤波
normalized_box_filtered = cv2.boxFilter(image, -1, (5, 5), normalize=True)
# 应用非归一化方框滤波
non_normalized_box_filtered = cv2.boxFilter(image, -1, (5, 5), normalize=False)
# 显示结果
cv2.imshow('Original', image)
cv2.imshow('Normalized Box Filter', normalized_box_filtered)
cv2.imshow('Non-Normalized Box Filter', non_normalized_box_filtered)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 由于图像的亮度本身就很高,使用非归一化方框滤波器后,许多区域的像素值相加可能会超过255,导致输出图像的这些区域呈现为白色。
- 归一化方框滤波器常用于图像去噪、模糊处理、特征提取等场景。由于其简单高效,它在实时图像处理系统中尤为常见。
- 归一化方框滤波可能会导致图像细节的丢失,尤其是在使用较大的滤波核时。
- 在选择是否进行归一化处理时,需要根据具体的应用场景和需求来决定。
(2)均值滤波:
均值滤波(Mean Filtering)是一种简单的线性滤波技术,通常用于去除图像中的噪声,特别是椒盐噪声。它通过用像素周围的平均值来替换每个像素值,从而实现图像的平滑效果。均值滤波不会改变图像的亮度,但可能会导致图像细节的丢失,因为它模糊了图像的边缘。
基本原理:
- 均值滤波的基本原理是将图像中的每个像素值替换为其邻域内所有像素值的平均值。邻域通常是一个正方形或圆形窗口,称为滤波器或卷积核。
均值滤波器的数学表达:
对于图像中的每个像素 p(i,j),均值滤波的输出g(i,j) 可以通过以下公式计算: 其中:
- f(i+x,j+y)是原始图像在位置 (i+x,j+y) 的像素值。
- g(i,j)是滤波后的图像在位置 (i,j)的像素值。
- a 和 b 是定义邻域范围的整数,通常由滤波器的大小决定。
- N 是邻域内像素的总数,即 (2a+1)×(2b+1)。
均值滤波的实现:
- 在Python中,可以使用OpenCV库中的
cv2.blur()
或cv2.boxFilter()
函数来实现均值滤波。当cv2.boxFilter()
的normalize
参数设置为True
时,它的行为与cv2.blur()
相同,后