OpenCV-去噪效果和评估指标方法
实验前言
噪音类型
opencv常见噪音类型有
-
高斯噪音:高斯噪音是一种随机噪音,其数值服从正态分布。图像受到高斯噪音的影响时,像素值的变化类似于白噪音,但是噪音的强度会随像素值的变化而变化。
-
椒盐噪音:椒盐噪音是指在图像中随机出现黑点和白点,其强度和数量不确定。这种噪音通常是由图像损坏或传输过程中的数据错误引起的。
-
毛刺噪音:毛刺噪音是在图像中出现的一些明显的、非细节部分的异常像素,通常由于图像缺失或电磁干扰等原因造成。
-
泊松噪音:泊松噪音通常是在低亮度条件下拍摄时出现的。这种噪音的产生是由于图像的弱信号在成像过程中受到波动,导致像素值的随机变化。
-
光斑噪音:光斑噪音是在相机成像时出现的一些类似黑点的噪音,通常是由图像传感器中照明部分的坏点或粒子杂质造成的。
去噪方法
-
均值滤波(Mean Filter):将像素值替换为周围像素的平均值。适用于轻度噪音去除,但会模糊图像细节。
-
中值滤波(Median Filter):将像素值替换为周围像素值的中值。适用于去除椒盐噪音和毛刺噪音,并保留边缘信息。
-
高斯滤波(Gaussian Filter):使用高斯核对图像进行滤波,模糊图像并去除高斯噪音。
-
双边滤波(Bilateral Filter):结合空域和灰度信息,可以有效地去除噪音,并保持边缘的清晰度。
-
非局部均值滤波(Non-local Means Denoising):通过基于相似性的像素块来估计每个像素的值,适用于去除多种噪音。
-
K近邻平均滤波(K-nearest Neighborhood Averaging Filter):通过计算K个最相似像素的平均值来去噪,适用于去除椒盐噪音。
-
快速傅里叶变换(Fast Fourier Transform, FFT):通过将图像转换到频域进行滤波,可以有效去除周期性噪音。
除了上述方法外,OpenCV 还支持其他一些高级的去噪算法,如小波变换去噪(Wavelet Denoising)、总变差去噪(Total Variation Denoising)等。这些算法都有不同的适用场景和去噪效果,根据具体的需求和噪音类型,选择合适的方法能获得更好的去噪效果。
实验设计
选取二张彩色图像,对其中的每一张彩色图像进行灰度化再分别加入高斯噪音、椒盐噪音共二种噪音,改变噪音的参数查看效果。
去噪处理时用到高斯滤波、双边滤波、均值滤波和中值滤波共4种滤波和去噪方法。对高斯噪音使用高斯滤波、双边滤波和中值滤波进行去噪;对椒盐噪音使用K近邻平均滤波、均值滤波进行去噪;
一共5组实验,对于每组实验的去噪效果使用2种评估方法:峰值信噪比(Peak Signal-to-Noise Ratio, PSNR)、 结构相似性指标(英文:structural similarity index measure,SSIM)进行评估。
评估方法
PSNR
简介
Peak signal-to-noise ratio(简称PSNR)是一个工程术语,表示信号的最大可能功率与影响信号表示精度的干扰噪声功率之间的比值。由于许多信号都有非常宽的动态范围,峰值讯噪比常用对数分贝单位来表示。
定义
它常简单地通过均方误差(MSE)进行定义。两个 m × n m×nm×n 单色图像 I II 和 K KK , I II 为一无噪声的原始图像,K KK 为 I II 的噪声近似(例: I II 为未压缩的原始图像,K KK为 I II 经过压缩后的图像),那么它们的的均方误差定义为:
则PSNR可定义为(针对灰度图):
其中MAXI为图像的最大像素值,PSNR的单位为dB。若每个像素由8位二进制表示,则其值为2^8-1=255。
更为通用的表示是,如果每个采样点用 B 位线性脉冲编码调制表示,那么MAXI 就是
对于每点有RGB三个值的彩色图像来说,峰值信噪比的定义类似。除了横轴、纵轴 m mm 和 n nn 以外,还要考虑它的颜色组成RGB。我们需要分别对每个颜色处理其MSE,因为有3个颜色通道,所以MSE需再除以3。
彩色图像的峰值讯噪比定义为:
意义
-
PSNR接近 50dB ,代表压缩后的图像仅有些许非常小的误差。
-
PSNR大于 30dB ,人眼很难查觉压缩后和原始影像的差异。
-
PSNR介于 20dB 到 30dB 之间,人眼就可以察觉出图像的差异。
-
PSNR介于 10dB 到 20dB 之间,人眼还是可以用肉眼看出这个图像原始的结构,且直观上会判断两张图像不存在很大的差异。
-
PSNR低于 10dB,人类很难用肉眼去判断两个图像是否为相同,一个图像是否为另一个图像的压缩结果。
实现
我们可以调用第三方库skimage
实现,里面有封装好的计算PSNR
的代码,具体调用方式如下:
from skimage.metrics import peak_signal_noise_ratio as psnr
from PIL import Image
import numpy as npimg1 = np.array(Image.open('original.jpg'))
img2 = np.array(Image.open('compress.jpg'))if __name__ == "__main__":print(psnr(img1, img2))
SSIM(结构相似性)
简介
结构相似性指标(英文:structural similarity index measure,简称SSIM)是一种用以衡量两张数位影像相似程度的指标。当两张影像其中一张为无失真影像,另一张为失真后的影像,二者的结构相似性可以看成是失真影像的影像品质衡量指标。相较于传统所使用的影像品质衡量指标,像是峰值信噪比(英语:PSNR),结构相似性在影像品质的衡量上更能符合人眼对影像品质的判断。
定义
给定两个信号 x {\displaystyle \mathbf {x} }x 和 y {\displaystyle \mathbf {y} }y,两者的结构相似性定义为:
其中l(x,y)比较x和y的亮度,c(x,y)比较x和y的对比度,s(x,y)比较x和y的结构,α>0,β>0,γ>0,为调整l(x,y),c(x,y),s(x,y)相对重要性的参数,μx及μy,σx及σy分别为x和y的平均值和标准差,σxy为x和y的协方差,C1,C2,C3皆为常数,用以维持l(x,y)、c(x,y)、s(x,y)的稳定。
结构相似性指标的值越大,代表两个信号的相似性越高。
使用
实际使用时,简化起见,一般会将参数设为α = β = γ = 1 及C3=C2/2,得到:
在计算两张影像的结构相似性指标时,会开一个局部性的视窗,一般为N × N N×NN×N的小区块,计算出视窗内信号的结构相似性指标,每次以像素为单位移动视窗,直到整张影像每个位置的局部结构相似性指标都计算完毕。将全部的局部结构相似性指标平均起来即为两张影像的结构相似性指标。
实现
我们可以调用第三方库skimage
实现,里面有封装好的计算ssim
的代码,具体调用方式如下:
from skimage.metrics import structural_similarity as ssim
from PIL import Image
import numpy as npimg1 = np.array(Image.open('original.jpg'))
img2 = np.array(Image.open('compress.jpg'))if __name__ == "__main__":# If the input is a multichannel (color) image, set multichannel=True.print(ssim(img1, img2, multichannel=True))
备注:skimage的大名叫scikit-image,安装请用pip install scikit-image。
实验
高斯噪音
一.高斯噪声不同参数对于图像的影响
调参代码
# 彩色图像添加高斯噪音
noise = np.random.normal(0, 50, color_img.shape)
noise_img = color_img + noise.astype('uint8')# 灰度化图像添加高斯噪音
noise = np.random.normal(0, 50, gray_img.shape)
img_noise = gray_img + noise.astype('uint8')
通过对应的loc和sacle,代码中分别的0,50的值进行调节,来进行噪声的添加
(0,50)的图像
(0,10)的图像
(5,10)的图像
结果分析
-
loc参数:
- loc参数表示高斯噪声的均值,即噪声分布的中心。
- 增加loc参数的值会导致噪声分布整体偏移。如果设置较大的loc值,则图片中的像素值会整体增加。相反,如果设置较小的loc值,则图片中的像素值会整体减小。
- 较大的loc值会导致图像明亮度的增加,而较小的loc值则会导致图像明亮度的降低。
-
scale参数:
- scale参数表示高斯噪声的标准差,即噪声分布的扩散程度。
- 增加scale参数的值会导致噪声分布更加宽广,即噪声的振幅变大,使得像素值的变动更加明显。
- 较大的scale值会导致图像中的噪声更加明显,使图像看起来更加模糊和粗糙。相反,较小的scale值则会产生更细微、不易察觉的噪声。
需要注意的是,适当选择合适的loc和scale参数对于产生逼真的高斯噪声既重要又具有挑战。理想情况下,参数选择应该与图像的特性和实际需要相匹配。在实际应用中,通过实验和观察来调整和优化loc和scale参数,以达到满足噪声处理的需求并保持图像质量的最佳结果。
二.高斯噪音使用高斯滤波去噪实验
代码
#高斯噪音使用高斯滤波去噪实验
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.metrics import structural_similarity as ssim
#读取图像
# 读取彩色图像
color_img = cv2.imread('image.jpg')#图像替换image2.jpg# 读取灰度图像
gray_img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)#添加噪音
# 彩色图像添加高斯噪音
noise = np.random.normal(0, 50, color_img.shape)
noise_img = color_img + noise.astype('uint8')# 灰度化图像添加高斯噪音
noise = np.random.normal(0, 50, gray_img.shape)
img_noise = gray_img + noise.astype('uint8')#进行去噪处理
# 彩色图像进行高斯滤波去噪处理
denoised_img = cv2.GaussianBlur(noise_img, (5,5), 0)# 灰度化图像进行高斯滤波去噪处理
img_denoised = cv2.GaussianBlur(img_noise, (5,5), 0)#显示结果
# 彩色图像显示结果
plt.subplot(231)
plt.imshow(cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB))
plt.title('Original color_img')plt.subplot(232)
plt.imshow(cv2.cvtColor(noise_img, cv2.COLOR_BGR2RGB))
plt.title('Noisy color_img')plt.subplot(233)
plt.imshow(cv2.cvtColor(denoised_img , cv2.COLOR_BGR2RGB))
plt.title('Denoised color_img')
# 灰度化图像显示结果
plt.subplot(234)
plt.imshow(gray_img, cmap='gray')
plt.title('Original gray_img')plt.subplot(235)
plt.imshow(img_noise, cmap='gray')
plt.title('Noisy gray_img')plt.subplot(236)
plt.imshow(img_denoised, cmap='gray')
plt.title('Denoised gray_img')plt.show()#评估结果
print("评估结果:")
print("彩色图像评估结果:")
# 计算均方误差
mse = np.mean((color_img - denoised_img )**2)# 计算差分图像
diff_image = denoised_img .astype(np.float64) - color_img.astype(np.float64)# 计算均方根误差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 计算峰值信噪比
mse = np.mean((color_img - denoised_img )**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)
print('结构相似性 SSIM',ssim(color_img, denoised_img, channel_axis=2))print("灰度化图像评估结果:")
# 计算均方误差
mse = np.mean((gray_img - img_denoised)**2)# 计算差分图像
diff_image = img_denoised.astype(np.float64) - gray_img.astype(np.float64)# 计算均方根误差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 计算峰值信噪比
mse = np.mean((gray_img - img_denoised)**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)
print('结构相似性 SSIM:',ssim(gray_img, img_denoised, channel_axis=1))
效果展示1
效果展示2
功能说明
对彩色图像以及其的灰度图添加高斯噪音,并分别使用高斯滤波去噪,输出原图像和添加噪音的图像以及去噪后的图像,最后计算SSIM和PSNR对彩色图像和灰度图像的去噪效果进行评估,并输出相应数值。
结论
该代码展示了使用高斯滤波器对图像进行平滑处理以去除高斯噪声。通过观察SSIM以及PSNR的值,其实高斯滤波对应高斯噪声有一定的过滤功能但是效果有限。
高斯滤波是一种线性平滑滤波器,根据像素周围邻域的加权平均值对像素进行平滑处理。该滤波器利用高斯函数来计算每个邻域像素的权重,使得距离中心像素越远的像素权重越低。这样可以在平滑图像的同时保留图像的边缘和细节。
通过调整高斯滤波器的核大小和标准差,可以控制滤波效果。较大的核大小和较小的标准差可以平滑更多的噪声,但可能会导致图像变模糊;较小的核大小和较大的标准差可以保留更多的细节,但可能无法完全去除所有噪声。
三.高斯噪音使用双边滤波去噪实验
代码
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.metrics import structural_similarity as ssim#读取图像
# 读取彩色图像
color_img = cv2.imread('image2.jpg')#图像替换image2.jpg# 读取灰度图像
gray_img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)#添加噪音
# 彩色图像添加高斯噪音
noise = np.random.normal(0, 50, color_img.shape)
noise_img = color_img + noise.astype('uint8')# 灰度化图像添加高斯噪音
noise = np.random.normal(0, 50, gray_img.shape)
img_noise = gray_img + noise.astype('uint8')#进行去噪处理
# 彩色图像进行双边滤波去噪处理
denoised_img = cv2.bilateralFilter(color_img, 9, 30, 60)# 灰度化图像进行双边滤波去噪处理
img_denoised = cv2.bilateralFilter(gray_img, 9, 30, 60)#显示结果
# 彩色图像显示结果
plt.subplot(231)
plt.imshow(cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB))
plt.title('Original color_img')plt.subplot(232)
plt.imshow(cv2.cvtColor(noise_img, cv2.COLOR_BGR2RGB))
plt.title('Noisy color_img')plt.subplot(233)
plt.imshow(cv2.cvtColor(denoised_img , cv2.COLOR_BGR2RGB))
plt.title('Denoised color_img')# 灰度化图像显示结果
plt.subplot(234)
plt.imshow(gray_img, cmap='gray')
plt.title('Original gray_img')plt.subplot(235)
plt.imshow(img_noise, cmap='gray')
plt.title('Noisy gray_img')plt.subplot(236)
plt.imshow(img_denoised, cmap='gray')
plt.title('Denoised gray_img')plt.show()#评估结果
print("评估结果:")
print("彩色图像评估结果:")
# 计算均方误差
mse = np.mean((color_img - denoised_img )**2)# 计算差分图像
diff_image = denoised_img .astype(np.float64) - color_img.astype(np.float64)# 计算均方根误差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 计算峰值信噪比
mse = np.mean((color_img - denoised_img )**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)
print('结构相似性 SSIM',ssim(color_img, denoised_img, channel_axis=2))
print("灰度化图像评估结果:")
# 计算均方误差
mse = np.mean((gray_img - img_denoised)**2)# 计算差分图像
diff_image = img_denoised.astype(np.float64) - gray_img.astype(np.float64)# 计算均方根误差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 计算峰值信噪比
mse = np.mean((gray_img - img_denoised)**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)print('结构相似性 SSIM:',ssim(gray_img, img_denoised, channel_axis=1))
效果展示1
效果展示2
功能说明
对彩色图像以及其的灰度图添加高斯噪音,并分别使用双边滤波去噪,输出原图像和添加噪音的图像以及去噪后的图像,最后计算SSIM和PSNR对彩色图像和灰度图像的去噪效果进行评估,并输出相应数值。
结论
该代码展示了使用双边滤波器对图像进行平滑处理以去除高斯噪声。通过比较对应的PSNR和SSIM,可以得出,双边滤波对于高斯噪声有很好的去处效果。
双边滤波器是一种非线性滤波器,对图像中的每个像素同时考虑空间距离和像素值相似性,以计算每个像素的权重。在计算加权平均值时,空间距离权重和像素值相似性权重都起到了作用。这使得双边滤波器能够在平滑图像的同时,保留边缘和细节。
相比于其他平滑滤波器,双边滤波器能更好地保留图像的细节,并且对消除高斯噪声有较好的效果。它通过调整空间距离权重和像素值相似性权重这两个参数,可以控制滤波效果。较大的空间距离权重可以保留更多的边缘信息,较大的像素值相似性权重可以减少噪声。
综上所述,使用双边滤波去除高斯噪声是一种有效的图像降噪方法。它能够在平滑图像的同时保留细节,对于去除高斯噪声和保持图像质量具有良好的效果。
四.高斯噪音使用中值滤波去噪实验
代码
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.metrics import structural_similarity as ssim#读取图像
# 读取彩色图像
color_img = cv2.imread('image2.jpg')#图像替换image2.jpg# 读取灰度图像
gray_img = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE)#添加噪音
# 彩色图像添加高斯噪音
noise = np.random.normal(0, 50, color_img.shape)
noise_img = color_img + noise.astype('uint8')# 灰度化图像添加高斯噪音
noise = np.random.normal(0, 50, gray_img.shape)
img_noise = gray_img + noise.astype('uint8')#进行去噪处理
# 彩色图像进行中值滤波去噪处理
denoised_img = cv2.medianBlur(color_img, 5)# 灰度化图像进行中值滤波去噪处理
img_denoised = cv2.medianBlur(gray_img, 5)#显示结果
# 彩色图像显示结果
plt.subplot(231)
plt.imshow(cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB))
plt.title('Original color_img')plt.subplot(232)
plt.imshow(cv2.cvtColor(noise_img, cv2.COLOR_BGR2RGB))
plt.title('Noisy color_img')plt.subplot(233)
plt.imshow(cv2.cvtColor(denoised_img , cv2.COLOR_BGR2RGB))
plt.title('Denoised color_img')
# 灰度化图像显示结果
plt.subplot(234)
plt.imshow(gray_img, cmap='gray')
plt.title('Original gray_img')plt.subplot(235)
plt.imshow(img_noise, cmap='gray')
plt.title('Noisy gray_img')plt.subplot(236)
plt.imshow(img_denoised, cmap='gray')
plt.title('Denoised gray_img')plt.show()#评估结果
print("评估结果:")
print("彩色图像评估结果:")
# 计算均方误差
mse = np.mean((color_img - denoised_img )**2)# 计算差分图像
diff_image = denoised_img .astype(np.float64) - color_img.astype(np.float64)# 计算均方根误差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 计算峰值信噪比
mse = np.mean((color_img - denoised_img )**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)
print('结构相似性 SSIM',ssim(color_img, denoised_img, channel_axis=2))
print("灰度化图像评估结果:")
# 计算均方误差
mse = np.mean((gray_img - img_denoised)**2)# 计算差分图像
diff_image = img_denoised.astype(np.float64) - gray_img.astype(np.float64)# 计算均方根误差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 计算峰值信噪比
mse = np.mean((gray_img - img_denoised)**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)print('结构相似性 SSIM:',ssim(gray_img, img_denoised, channel_axis=1))
效果展示1
效果展示2
功能说明
对彩色图像以及其的灰度图添加高斯噪音,并分别使用中值滤波去噪,输出原图像和添加噪音的图像以及去噪后的图像,最后计算SSIM和PSNR对彩色图像和灰度图像的去噪效果进行评估,并输出相应数值。
结论
该代码展示了使用中值滤波器对图像进行平滑处理以去除高斯噪声。通过对应的PSNR和SSIM,通过对图像应用中值滤波器,可以有效地滤除高斯噪声。
中值滤波器是一种非线性滤波器,它将每个像素的值替换为邻域窗口中所有像素值的中值。相比于线性滤波器,中值滤波器能够更好地抑制噪声,特别是对于椒盐噪声和高斯噪声等具有随机性的噪声类型。中值滤波器利用邻域像素值的排序统计特性,能够将噪声像素值与周围正常像素值进行区分。通过计算邻域窗口中像素值的中值并将其作为原像素值的替代,中值滤波器能够有效地平滑图像,并保持图像的边缘和细节。
相比于平均滤波器或高斯滤波器,中值滤波器更适用于去除高斯噪声。由于高斯噪声具有随机分布的特点,中值滤波器能够在不对图像进行过度平滑的情况下,将噪声像素正确地排除。
综上所述,使用中值滤波器对高斯噪声进行去除是一种简单而有效的方法。通过选择适当的邻域窗口大小,中值滤波器能够在保留图像细节的同时,有效地滤除高斯噪声。
椒盐噪音
一.高斯噪声不同参数对于图像的影响
调参代码
#添加噪音
# 彩色图像添加椒盐噪音
noise_img = np.zeros(color_img.shape, np.uint8)
probability = 0.05 # 噪音点的概率for i in range(color_img.shape[0]):for j in range(color_img.shape[1]):random = np.random.random()if random < probability/2:# 添加盐噪音noise_img[i, j] =(255, 255, 255)elif random < probability:# 添加椒噪音noise_img[i, j] = (0, 0, 0)else:noise_img[i, j] = color_img[i, j]# 灰度化图像添加椒盐噪音
img_noise = np.zeros(gray_img.shape, np.uint8)
probability = 0.05 # 噪音点的概率for i in range(gray_img.shape[0]):for j in range(gray_img.shape[1]):random = np.random.random()if random < probability/2:# 添加盐噪音img_noise[i, j] = 255elif random < probability:# 添加椒噪音img_noise[i, j] = 0else:img_noise[i, j] = gray_img[i, j]
主要通过改变噪音点的频率来达成调参
probability = 0.05 时
probability = 0.01 时
probability = 0.10 时
结论
其实椒盐噪声很简单,就是通过随机数和概率的比较来给图像随机添加噪声像素点,概率越大,对应噪声像素点出现概率越高。
二.椒盐噪音使用K近邻平均滤波去噪实验
代码
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.metrics import structural_similarity as ssim#读取图像
# 读取彩色图像
color_img = cv2.imread('image2.jpg')#图像替换image2.jpg# 读取灰度图像
gray_img = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE)#添加噪音
# 彩色图像添加椒盐噪音
noise_img = np.zeros(color_img.shape, np.uint8)
probability = 0.05 # 噪音点的概率for i in range(color_img.shape[0]):for j in range(color_img.shape[1]):random = np.random.random()if random < probability/2:# 添加盐噪音noise_img[i, j] =(255, 255, 255)elif random < probability:# 添加椒噪音noise_img[i, j] = (0, 0, 0)else:noise_img[i, j] = color_img[i, j]# 灰度化图像添加椒盐噪音
img_noise = np.zeros(gray_img.shape, np.uint8)
probability = 0.05 # 噪音点的概率for i in range(gray_img.shape[0]):for j in range(gray_img.shape[1]):random = np.random.random()if random < probability/2:# 添加盐噪音img_noise[i, j] = 255elif random < probability:# 添加椒噪音img_noise[i, j] = 0else:img_noise[i, j] = gray_img[i, j]#进行去噪处理
# 添加边缘
K = 3 # 取 K=3
border = K // 2
border_img = cv2.copyMakeBorder(color_img, border, border, border, border, cv2.BORDER_REFLECT)
img_border = cv2.copyMakeBorder(gray_img, border, border, border, border, cv2.BORDER_REFLECT)# 彩色图像进行K近邻平均滤波去噪处理
denoised_img = np.zeros(color_img.shape, np.uint8)
for i in range(border, border + color_img.shape[0]):for j in range(border, border + color_img.shape[1]):block = border_img[i-border:i+border+1, j-border:j+border+1]pixels = np.zeros((K**2, 3), np.uint8)for k in range(K):for l in range(K):pixels[k*K+l] = block[k][l]filtered_pixel = np.mean(pixels, axis=0)denoised_img [i-border, j-border] = filtered_pixel.astype(np.uint8)# 灰度化图像进行K近邻平均滤波去噪处理
img_denoised =np.zeros(gray_img.shape, np.uint8)
for i in range(border, border + gray_img.shape[0]):for j in range(border, border + gray_img.shape[1]):block = img_border[i-border:i+border+1, j-border:j+border+1]pixels = block.flatten()pixels = sorted(pixels)img_denoised [i-border, j-border] = np.mean(pixels[:K])#显示结果
# 彩色图像显示结果
plt.subplot(231)
plt.imshow(cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB))
plt.title('Original color_img')plt.subplot(232)
plt.imshow(cv2.cvtColor(noise_img, cv2.COLOR_BGR2RGB))
plt.title('Noisy color_img')plt.subplot(233)
plt.imshow(cv2.cvtColor(denoised_img , cv2.COLOR_BGR2RGB))
plt.title('Denoised color_img')
# 灰度化图像显示结果
plt.subplot(234)
plt.imshow(gray_img, cmap='gray')
plt.title('Original gray_img')plt.subplot(235)
plt.imshow(img_noise, cmap='gray')
plt.title('Noisy gray_img')plt.subplot(236)
plt.imshow(img_denoised, cmap='gray')
plt.title('Denoised gray_img')plt.show()#评估结果
print("评估结果:")
print("彩色图像评估结果:")
# 计算均方误差
mse = np.mean((color_img - denoised_img )**2)# 计算差分图像
diff_image = denoised_img .astype(np.float64) - color_img.astype(np.float64)# 计算均方根误差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 计算峰值信噪比
mse = np.mean((color_img - denoised_img )**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)print('结构相似性 SSIM',ssim(color_img, denoised_img, channel_axis=2))print("灰度化图像评估结果:")
# 计算均方误差
mse = np.mean((gray_img - img_denoised)**2)# 计算差分图像
diff_image = img_denoised.astype(np.float64) - gray_img.astype(np.float64)# 计算均方根误差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 计算峰值信噪比
mse = np.mean((gray_img - img_denoised)**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)print('结构相似性 SSIM:',ssim(gray_img, img_denoised, channel_axis=1))
效果展示1
效果展示2
功能说明
对彩色图像以及其的灰度图添加椒盐噪音,并分别使用K近邻平均滤波去噪,输出原图像和添加噪音的图像以及去噪后的图像,最后计算SSIM和PSNR对彩色图像和灰度图像的去噪效果进行评估,并输出相应数值。
结论
经过实验测试,使用K近邻平均滤波器对图像进行去噪处理可以有效地减少椒盐噪声。通过观察两个图像处理完成后的实验1和实验2我们可以发现image1的图像psnr以及ssim明显比image2实验结果的大,证明其去噪效果更好。
椒盐噪声是一种随机出现的噪声,会导致图像中出现明显的黑白像素点。K近邻平均滤波器通过计算邻域窗口中的像素值的平均值,将中心像素的值替换为平均值,从而实现去噪的效果。
在实验中,我们选择适当的邻域窗口大小和K值,根据图像的噪声程度和细节要求,进行去噪处理。适当选择较大的邻域窗口可以平滑图像并降低噪声,同时保留图像的细节。较大的K值可以更好地抑制椒盐噪声。
总的来说,椒盐噪声是一种常见的噪声类型,而K近邻平均滤波器是一种简单而有效的滤波方法。通过调整邻域窗口大小和K值,可以在一定程度上去除椒盐噪声并改善图像质量。然而,使用K近邻平均滤波器可能会导致图像细节的损失,因此在应用时需要权衡去噪效果和细节保留的需求。
三.椒盐噪音使用均值滤波去噪实验
代码
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.metrics import structural_similarity as ssim# 读取图像
# 读取彩色图像
color_img = cv2.imread('image.jpg') # 图像替换image2.jpg
# 读取灰度图像
gray_img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 添加噪音
# 彩色图像添加椒盐噪音
noise_img = np.zeros(color_img.shape, np.uint8)
probability = 0.20 # 噪音点的概率for i in range(color_img.shape[0]):for j in range(color_img.shape[1]):random = np.random.random()if random < probability / 2:# 添加盐噪音noise_img[i, j] = (255, 255, 255)elif random < probability:# 添加椒噪音noise_img[i, j] = (0, 0, 0)else:noise_img[i, j] = color_img[i, j]# 灰度化图像添加椒盐噪音
img_noise = np.zeros(gray_img.shape, np.uint8)
probability = 0.20 # 噪音点的概率
for i in range(gray_img.shape[0]):for j in range(gray_img.shape[1]):random = np.random.random()if random < probability/2:# 添加盐噪音img_noise[i, j] = 255elif random < probability:# 添加椒噪音img_noise[i, j] = 0else:img_noise[i, j] = gray_img[i, j]
# 进行去噪处理
# 彩色图像进行均值滤波去噪处理
denoised_img = cv2.blur(noise_img, (5, 5), 0)# 灰度化图像进行均值滤波去噪处理
img_denoised = cv2.blur(img_noise, (5, 5), 0)# 显示结果
# 彩色图像显示结果
plt.subplot(231)
plt.imshow(cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB))
plt.title('Original color_img')plt.subplot(232)
plt.imshow(cv2.cvtColor(noise_img, cv2.COLOR_BGR2RGB))
plt.title('Noisy color_img')plt.subplot(233)
plt.imshow(cv2.cvtColor(denoised_img, cv2.COLOR_BGR2RGB))
plt.title('Denoised color_img')
# 灰度化图像显示结果
plt.subplot(234)
plt.imshow(gray_img, cmap='gray')
plt.title('Original gray_img')plt.subplot(235)
plt.imshow(img_noise, cmap='gray')
plt.title('Noisy gray_img')plt.subplot(236)
plt.imshow(img_denoised, cmap='gray')
plt.title('Denoised gray_img')plt.show()# 评估结果
print("评估结果:")
print("彩色图像评估结果:")
# 计算均方误差
mse = np.mean((color_img - denoised_img) ** 2)# 计算差分图像
diff_image = denoised_img.astype(np.float64) - color_img.astype(np.float64)# 计算均方根误差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 计算峰值信噪比
mse = np.mean((color_img - denoised_img) ** 2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)
print('结构相似性 SSIM',ssim(color_img, denoised_img, channel_axis=2))print("灰度化图像评估结果:")
# 计算均方误差
mse = np.mean((gray_img - img_denoised) ** 2)# 计算差分图像
diff_image = img_denoised.astype(np.float64) - gray_img.astype(np.float64)# 计算均方根误差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 计算峰值信噪比
mse = np.mean((gray_img - img_denoised) ** 2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)print('结构相似性 SSIM:',ssim(gray_img, img_denoised, channel_axis=1))
效果展示1
效果展示2
功能说明
对彩色图像以及其的灰度图添加椒盐噪音,并分别使用均值滤波去噪,输出原图像和添加噪音的图像以及去噪后的图像,最后SSIM和PSNR对彩色图像和灰度图像的去噪效果进行评估,并输出相应数值。
结论
经过实验测试,通过观察对应的PSNR和SSIM,使用均值滤波器对图像进行去噪处理对椒盐噪声的效果有限。
椒盐噪声是一种随机性的噪声,会在图像中产生黑色和白色的孤立像素。均值滤波器是一种线性滤波器,它通过计算邻域窗口中像素值的平均值来实现平滑效果。
然而,均值滤波器对于椒盐噪声的处理并不理想。由于椒盐噪声的随机性,黑白像素点的分布不均匀,使得均值滤波器在平均处理时受到噪声像素的干扰,导致去噪效果不佳。均值滤波器在处理椒盐噪声时可能会模糊图像细节并不能完全去除噪声。
因此,在处理椒盐噪声时,推荐使用其他更适合的滤波器,如中值滤波器或K近邻平均滤波器。这些滤波器对于椒盐噪声有更好的去噪效果,并能够保留图像的细节。均值滤波器可能更适合去除均匀分布的噪声,而不是椒盐噪声。
毛刺噪音
一.毛刺噪音不同参数对于图像的影响
调参代码
# 彩色图像添加毛刺噪音
noise_img = np.copy(color_img)
noise_level = 0.20 # 噪音水平,可以根据需要调整
# 每个像素根据噪音水平随机扰动
for i in range(noise_img.shape[0]):for j in range(noise_img.shape[1]):r = np.random.uniform(0, 1)if r < noise_level:noise_img[i, j] = [np.random.randint(0, 256), np.random.randint(0, 256), np.random.randint(0, 256)]
# 灰度化图像添加毛刺噪音
img_noise = np.copy(gray_img)
level_noise = 0.20 # 噪音水平,可以根据需要调整
# 每个像素根据噪音水平随机扰动
for i in range(img_noise.shape[0]):for j in range(img_noise.shape[1]):r = np.random.uniform(0, 1)if r < level_noise:img_noise[i, j] = np.random.randint(0, 256)
噪音水平为0.05时
噪音水平为0.10时
噪音水平为0.20时
结论
密度参数表示在图像中添加噪音的频率。较高的密度值会导致更多的毛刺噪音点出现在图像中,增加图像的复杂度。
噪声水平越高,噪声像素点出现的概率越高
代码中使用的是遍历每一个像素点,如果对应的随机值小于出现噪音的概率就会添加噪音。
二.毛刺噪音使用中值滤波去噪实验
代码
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.metrics import structural_similarity as ssim
#读取图像
# 读取彩色图像
color_img = cv2.imread('image.jpg')#图像替换image2.jpg# 读取灰度图像
gray_img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)#添加噪音
# 彩色图像添加毛刺噪音
noise_img = np.copy(color_img)
noise_level = 0.20 # 噪音水平,可以根据需要调整# 每个像素根据噪音水平随机扰动
for i in range(noise_img.shape[0]):for j in range(noise_img.shape[1]):r = np.random.uniform(0, 1)if r < noise_level:noise_img[i, j] = [np.random.randint(0, 256), np.random.randint(0, 256), np.random.randint(0, 256)]# 灰度化图像添加毛刺噪音
img_noise = np.copy(gray_img)
level_noise = 0.20 # 噪音水平,可以根据需要调整# 每个像素根据噪音水平随机扰动
for i in range(img_noise.shape[0]):for j in range(img_noise.shape[1]):r = np.random.uniform(0, 1)if r < level_noise:img_noise[i, j] = np.random.randint(0, 256)#进行去噪处理
# 彩色图像进行中值滤波去噪处理
denoised_img = cv2.medianBlur(color_img, 5)# 灰度化图像进行中值滤波去噪处理
img_denoised = cv2.medianBlur(gray_img, 5)#显示结果
# 彩色图像显示结果
plt.subplot(231)
plt.imshow(cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB))
plt.title('Original color_img')plt.subplot(232)
plt.imshow(cv2.cvtColor(noise_img, cv2.COLOR_BGR2RGB))
plt.title('Noisy color_img')plt.subplot(233)
plt.imshow(cv2.cvtColor(denoised_img , cv2.COLOR_BGR2RGB))
plt.title('Denoised color_img')
# 灰度化图像显示结果
plt.subplot(234)
plt.imshow(gray_img, cmap='gray')
plt.title('Original gray_img')plt.subplot(235)
plt.imshow(img_noise, cmap='gray')
plt.title('Noisy gray_img')plt.subplot(236)
plt.imshow(img_denoised, cmap='gray')
plt.title('Denoised gray_img')plt.show()#评估结果
print("评估结果:")
print("彩色图像评估结果:")
# 计算均方误差
mse = np.mean((color_img - denoised_img )**2)# 计算差分图像
diff_image = denoised_img .astype(np.float64) - color_img.astype(np.float64)# 计算均方根误差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 计算峰值信噪比
mse = np.mean((color_img - denoised_img )**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)print('结构相似性 SSIM',ssim(color_img, denoised_img, channel_axis=2))print("灰度化图像评估结果:")
# 计算均方误差
mse = np.mean((gray_img - img_denoised)**2)# 计算差分图像
diff_image = img_denoised.astype(np.float64) - gray_img.astype(np.float64)# 计算均方根误差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 计算峰值信噪比
mse = np.mean((gray_img - img_denoised)**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)print('结构相似性 SSIM:',ssim(gray_img, img_denoised, channel_axis=1))
效果展示1
效果展示2
功能说明
对彩色图像以及其的灰度图添加毛刺噪音,并分别使用中值滤波去噪,输出原图像和添加噪音的图像以及去噪后的图像,最后计算SSIM和PSNR对彩色图像和灰度图像的去噪效果进行评估,并输出相应数值。
结论
中值滤波器是一种非线性滤波器,它将每个像素的值替换为邻域窗口中所有像素值的中值。相比于线性滤波器,中值滤波器能够更好地抑制噪声,特别是对于椒盐噪声和高斯噪声等具有随机性的噪声类型,同样也应用于毛刺噪音。中值滤波器利用邻域像素值的排序统计特性,能够将噪声像素值与周围正常像素值进行区分。通过计算邻域窗口中像素值的中值并将其作为原像素值的替代,中值滤波器能够有效地平滑图像,并保持图像的边缘和细节。
使用中值滤波器对毛刺噪声进行去除是一种简单而有效的方法。通过选择适当的邻域窗口大小,中值滤波器能够在保留图像细节的同时,有效地滤除高斯噪声。
三.毛刺噪音使用均值滤波去噪实验
代码
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.metrics import structural_similarity as ssim#读取图像
# 读取彩色图像
color_img = cv2.imread('image2.jpg')#图像替换image2.jpg# 读取灰度图像
gray_img = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE)#添加噪音
# 彩色图像添加毛刺噪音
noise_img = np.copy(color_img)
noise_level = 0.20# 噪音水平,可以根据需要调整# 每个像素根据噪音水平随机扰动
for i in range(noise_img.shape[0]):for j in range(noise_img.shape[1]):r = np.random.uniform(0, 1)if r < noise_level:noise_img[i, j] = [np.random.randint(0, 256), np.random.randint(0, 256), np.random.randint(0, 256)]# 灰度化图像添加毛刺噪音
img_noise = np.copy(gray_img)
level_noise = 0.20 # 噪音水平,可以根据需要调整# 每个像素根据噪音水平随机扰动
for i in range(img_noise.shape[0]):for j in range(img_noise.shape[1]):r = np.random.uniform(0, 1)if r < level_noise:img_noise[i, j] = np.random.randint(0, 256)#进行去噪处理
# 彩色图像进行均值滤波去噪处理
denoised_img = cv2.blur(noise_img, (5,5), 0)# 灰度化图像进行均值滤波去噪处理
img_denoised = cv2.blur(img_noise, (5, 5), 0)#显示结果
# 彩色图像显示结果
plt.subplot(231)
plt.imshow(cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB))
plt.title('Original color_img')plt.subplot(232)
plt.imshow(cv2.cvtColor(noise_img, cv2.COLOR_BGR2RGB))
plt.title('Noisy color_img')plt.subplot(233)
plt.imshow(cv2.cvtColor(denoised_img , cv2.COLOR_BGR2RGB))
plt.title('Denoised color_img')
# 灰度化图像显示结果
plt.subplot(234)
plt.imshow(gray_img, cmap='gray')
plt.title('Original gray_img')plt.subplot(235)
plt.imshow(img_noise, cmap='gray')
plt.title('Noisy gray_img')plt.subplot(236)
plt.imshow(img_denoised, cmap='gray')
plt.title('Denoised gray_img')plt.show()#评估结果
print("评估结果:")
print("彩色图像评估结果:")
# 计算均方误差
mse = np.mean((color_img - denoised_img )**2)
# 计算差分图像
diff_image = denoised_img .astype(np.float64) - color_img.astype(np.float64)# 计算均方根误差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 计算峰值信噪比
mse = np.mean((color_img - denoised_img )**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)
print('结构相似性 SSIM',ssim(color_img, denoised_img, channel_axis=2))print("灰度化图像评估结果:")
# 计算均方误差
mse = np.mean((gray_img - img_denoised)**2)# 计算差分图像
diff_image = img_denoised.astype(np.float64) - gray_img.astype(np.float64)# 计算均方根误差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 计算峰值信噪比
mse = np.mean((gray_img - img_denoised)**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)print('结构相似性 SSIM:',ssim(gray_img, img_denoised, channel_axis=1))
效果展示1
效果展示2
功能说明
对彩色图像以及其的灰度图添加毛刺噪音,并分别使用均值滤波去噪,输出原图像和添加噪音的图像以及去噪后的图像,最后计算SSIM和PSNR对彩色图像和灰度图像的去噪效果进行评估,并输出相应数值。
结论
经过实验测试,通过观察对应的PSNR和SSIM,使用均值滤波器对图像进行去噪处理对毛刺噪声的效果有限。
均值滤波器对于椒盐噪声的处理并不理想。由于毛刺噪声的随机性,黑白像素点的分布不均匀,使得均值滤波器在平均处理时受到噪声像素的干扰,导致去噪效果不佳。均值滤波器在处理毛刺噪声时可能会模糊图像细节并不能完全去除噪声。
因此,在处理毛刺噪声时,推荐使用其他更适合的滤波器,如中值滤波器或K近邻平均滤波器。