图像处理技术与应用入门
椒盐噪声
椒盐噪声,也称为脉冲噪声,是一种常见的数字图像噪声。它通常表现为图像中随机出现的白色(椒)或黑色(盐)像素点,这些像素点在图像上呈现为黑白杂点。椒盐噪声的成因多种多样,包括图像传感器故障、传输信道错误、解码处理问题等。在图像处理中,椒盐噪声会对图像分割、特征提取、图像识别等操作造成直接影响
去除椒盐噪声的常用方法包括中值滤波、自适应中值滤波、基于小波变换和阈值处理的去噪算法等。这些算法旨在降低噪声对图像质量的影响,同时尽量保留图像的原始细节和特征。
以下是生成椒盐噪声和使用中值滤波器和高斯模糊去除椒盐噪声的代码示例:
from skimage import io, data
import numpy as np
img = data.hubble_deep_field()
# 随机生成5000个椒盐
rows, cols, dims = img.shape
for i in range(5000):
x = np.random.randint(0, rows)
y = np.random.randint(0, cols)
img[x,y,:] = 255
io.imshow(img)
io.imsave('C:/Users/14919/OneDrive/Desktop/图像处理-工坊/22.jpg',img)
rows, cols, dims = img.shape
for i in range(5000):
x = np.random.randint(0, rows)
y = np.random.randint(0, cols)
img[x,y,:] = 255
在给定的图像 img 上随机选择 5000 个像素点,并将这些像素点的所有颜色通道(红、绿、蓝)的值设置为 255,即白色。产生一种类似于噪声或散点图的效果。
中值滤波
import cv2
# 读取带有椒盐噪声的图像
img = cv2.imread('22.jpg')
# 使用中值滤波器去除椒盐噪声
median_img = cv2.medianBlur(img, 5)
# 显示去噪后的图像
cv2.imshow('Denoised Image', median_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
应用中值滤波器去除椒盐噪声。medianBlur函数的参数5表示滤波器的核大小,即滤波窗口的宽度和高度都是5像素。
中值滤波器会遍历图像的每个像素,并用该像素周围5x5区域内的中值替换它的值。这种方法对于去除随机分布的噪声点非常有效。
高斯模糊
import cv2
image = cv2.imread('22.jpg')
blurred_image = cv2.GaussianBlur(image, (5, 5), 0)
cv2.imshow('Blurred Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
调用GaussianBlur函数对加载的图像应用高斯模糊。
高斯模糊是一种图像平滑技术,可以减少图像噪声和降低细节层次。
这里的(5, 5)是一个高斯核的尺寸,表示模糊窗口的宽度和高度都是5像素。参数0表示自动计算高斯核的标准差。
随机噪声
随机噪声是一种在时间上随机产生,其值在给定瞬间内无法预测的噪声。
这种噪声的特点是其幅度、波形及相位在任何一个时刻都是随机的,并且是一种前后独立的平衡随机过程。随机噪声通常服从于一定的统计分布规律,并且可以是多种类型的,包括脉冲噪声(如椒盐噪声)、窄带噪声(单频噪声)和起伏噪声(高斯噪声)等。脉冲噪声是突发性地产生、幅度大、持续时间短、间隔时间长的干扰;窄带噪声通常来自相邻电台或其他电子设备,看做是一种非所需的连续的已调正弦波;起伏噪声则在时域和频域内普遍存在,是通信系统中最基本的噪声源。
此外,随机噪声在数据集中表现为无规律的波动,且在数字滤波器和快速傅里叶变换的计算中,由于运算字长的限制,可能会产生有限字长效应,这种效应产生的噪声也可视为随机噪声。
以下是生成随机噪声和使用中值滤波器和高斯模糊去除随机噪声的代码示例:
添加随机噪声
import numpy as np
import cv2
import matplotlib.pyplot as plt
from skimage.io import imsave
# 读取彩色图像
image = cv2.imread('cc.jpg')
# 设置噪声的均值和标准差
mean = 0
std_dev = 80
# 生成随机噪声
noise = np.random.normal(mean, std_dev, image.shape).astype(np.float32)
# 向原始图像添加噪声
noisy_image = image + noise
# 裁剪噪声图像,确保数值在0-255之间
noisy_image = np.clip(noisy_image, 0, 255).astype(np.uint8)
# 显示原始图像和添加噪声后的图像
plt.subplot(1, 2, 1)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('Original Image')
plt.axis('off')
plt.subplot(1, 2, 2)
plt.imshow(cv2.cvtColor(noisy_image, cv2.COLOR_BGR2RGB))
plt.title('Noisy Image')
plt.axis('off')
plt.show()
# 保存添加噪声后的图片
imsave('C:/Users/14919/OneDrive/Desktop/33.jpg',img)
红色文字段生成随机噪声并将其添加到原始图像中,然后对结果图像进行裁剪,以确保所有的像素值都在0到255的范围内,这是8位图像的标准像素值范围。
高斯滤波器
import numpy as np
import cv2
import matplotlib.pyplot as plt
# 读取彩色图像
image = cv2.imread('33.jpg')
# 设置高斯噪声的均值和标准差
mean = 0
std_dev = 80
# 生成随机高斯噪声
noise = np.random.normal(mean, std_dev, image.shape).astype(np.float32)
# 向原始图像添加噪声
noisy_image = image + noise
# 裁剪噪声图像,确保数值在0-255之间
noisy_image = np.clip(noisy_image, 0, 255).astype(np.uint8)
# 使用高斯滤波器对噪声图像进行降噪处理
# ksize是高斯核的大小,sigmaX是高斯核在X方向的标准差
denoised_image = cv2.GaussianBlur(noisy_image, (5, 5), sigmaX=0)
# 显示原始图像、添加噪声后的图像和降噪后的图像
plt.subplot(1, 3, 1)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('Original Image')
plt.axis('off')
plt.subplot(1, 3, 2)
plt.imshow(cv2.cvtColor(noisy_image, cv2.COLOR_BGR2RGB))
plt.title('Noisy Image')
plt.axis('off')
plt.subplot(1, 3, 3)
plt.imshow(cv2.cvtColor(denoised_image, cv2.COLOR_BGR2RGB))
plt.title('Denoised Image')
plt.axis('off')
plt.show()
红色文字段置高斯噪声的参数:均值 mean 为 0,标准差 std_dev 为 50。
生成一个与原始图像 image 大小相同的高斯噪声数组 noise,其中包含随机采样的值,这些值服从均值为 mean,标准差为 std_dev 的正态分布。噪声数组的数据类型被转换为 np.float32 以保持计算精度。
将生成的噪声 noise 与原始图像 image 相加,得到一个带有噪声的图像 noisy_image。
使用 np.clip 函数将 noisy_image 的像素值限制在 0 到 255 的范围内,并转换其数据类型为 np.uint8,以确保图像的像素值有效且适合显示。
通过应用高斯滤波器对 noisy_image 进行降噪处理,得到 denoised_image。高斯滤波器的核大小设置为 5x5,且在 X 方向上的标准差 sigmaX 设置为 0(这将自动计算为核大小的一半,即 sigmaX = 0.3 * (ksize - 1) + 0.8)。