一、目标
将图片灰度处理,实现图像变暗、图像变亮、降低对比度、gamma变换,使用滤波核对图像进行滤波,对图像添加椒盐噪声或高斯噪声,然后对加噪图像进行均值滤波、中值滤波和高斯滤波。且应具有可视化输出。
二、准备工作
首先,你需要准备一张或者n张图片。
其次,需要在你的python环境中安装这些库(不会下载的请翻我第二篇文章)。
最后,我分为三部分来实现。
import cv2
import numpy as np
import matplotlib.pyplot as plt
三、图像变暗、图像变亮、降低对比度、gamma变换
3.1 读取图像
image = cv2.imread(r'your_picture', cv2.IMREAD_GRAYSCALE)
使用OpenCV开源的库读取图像并将图像灰度处理。
3.2 图像的变亮与变暗
# 灰度变换:图像变暗
darkened_image = (0.5 * image).astype(np.uint8)
# 灰度变换:图像变亮
brightened_image = (1.2 * image).astype(np.uint8)
这是将图片的灰度值乘以相应的倍率从而实现变亮变暗,你可以修改成你需要的情况。然后使用numpy库来将其转为8位无符号整数类型。
3.3 图像对比度的降低
# 降低对比度
contrast_reduced_image = np.clip((0.5 * image + 100), 0, 255).astype(np.uint8)
numpy库的clip函数确保修改后的值的范围能在(0,255)之间,当然你也可以根据实际情况将后面的(0,255)修改成你需要的范围(但需要修改后方numpy转换的类型合适)。
3.4 图像的Gamma变换
Gamma变换是一种对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系。
具体来说,Gamma变换的公式为g(x, y) = c * f(x, y)^γ,其中f(x, y)表示输入图像的像素值,g(x, y)表示输出图像的像素值,c是常数,γ是调节参数。
当γ值小于1时,图像的整体亮度值得到提升,同时低灰度处的对比度得到增加;当γ值大于1时,可以扩增暗区的对比度;当γ值等于1时,实现恒等变换。
更加具体的信息请咨询相关专业人士(诶嘿)。
# Gamma变换
gamma = 1.5 # 调整gamma值
normalized_image = image / 255.0 # 归一化到[0,1]范围
gamma_corrected_image = np.power(normalized_image, gamma)
gamma_corrected_image = (gamma_corrected_image * 255).astype(np.uint8)
在这里我将gamma值调整为1.5,你可以根据实际情况修改。
3.5 保存图像(没有需求可以忽略这一步)
# 保存处理后的图像
cv2.imwrite('darkened_image.jpg', darkened_image)
cv2.imwrite('brightened_image.jpg', brightened_image)
cv2.imwrite('contrast_reduced_image.jpg', contrast_reduced_image)
cv2.imwrite('gamma_corrected_image.jpg', gamma_corrected_image)
3.6 可视化
plt.subplot(2, 2, 1)
plt.imshow(darkened_image, cmap='gray')
plt.title('Darkened Image')
plt.subplot(2, 2, 2)
plt.imshow(brightened_image, cmap='gray')
plt.title('Brightened Image')
plt.subplot(2, 2, 3)
plt.imshow(contrast_reduced_image, cmap = 'gray')
plt.title('Contrast Reduced Image')
plt.subplot(2, 2, 4)
plt.imshow(gamma_corrected_image, cmap='gray')
plt.title('Gamma Corrected Image')
# 调整子图之间的水平间距和垂直间距
plt.subplots_adjust(wspace=0.5, hspace=0.5)
# 显示图像
plt.show()
我是因为只有这几张图片,因此使用了一个2 * 2 的方式显示图像,并使其上下左右间隔为0.5。实际根据你自己的情况做一些修改。
四、使用滤波核对图像进行滤波
4.1 准备滤波核
4.1.1 转换图像个格式
在此之前转换一波图像格式(当然不转也可以,但是结果会看的很别扭):
在OpenCV中,默认的图像格式是BGR,而大多数其他图像处理库(如PIL、matplotlib等)则使用RGB作为默认的图像格式。
img = cv2.imread(r'your_picture')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
4.1.2 设置滤波核
我这里使用了三个滤波核以便可以有更明显的对比。
# 设置滤波核
kernel1 = 1 / 9 * np.array([[1, 1, 1],[1, 1, 1],[1, 1, 1]])
kernel2 = 1 / 10 * np.array([[1, 1, 1], [1, 2, 1], [1, 1, 1]])
kernel3 = np.array([[-1, -1, -1], [-1, 9, -1], [-1, -1, -1]])
4.2 计算
# 使用OpenCV的卷积函数
ImgSmoothed1 = cv2.filter2D(img, -1, kernel1, borderType=cv2.BORDER_DEFAULT)
ImgSmoothed2 = cv2.filter2D(img, -1, kernel2, borderType=cv2.BORDER_DEFAULT)
ImgSmoothed3 = cv2.filter2D(img, -1, kernel3, borderType=cv2.BORDER_DEFAULT)
borderType定义了图像边缘的像素如何与滤波核进行卷积。此处我是用的是默认填充方式,即当图像边缘的像素被滤波核覆盖时,会使用边缘像素的复制来填充。可以根据实际情况修改。
4.3 可视化
plt.subplot(2, 2, 1)
plt.imshow(img)
plt.title('Original Image')
plt.subplot(2, 2, 2)
plt.imshow(ImgSmoothed1)
plt.title('ImgSmothed1')
plt.subplot(2, 2, 3)
plt.imshow(ImgSmoothed2)
plt.title('ImgSmothed2')
plt.subplot(2, 2, 4)
plt.imshow(ImgSmoothed3)
plt.title('ImgSmothed3')
plt.subplots_adjust(wspace=0.5, hspace=0.5)
plt.show()
五、对图像添加椒盐噪声或高斯噪声,然后对加噪图像进行均值滤波、中值滤波和高斯滤波
5.1 读取图像
image = cv2.imread(r'your_picture', cv2.IMREAD_GRAYSCALE)
5.2 添加椒盐噪声
# 添加椒盐噪声
def add_salt_and_pepper_noise(image, salt_prob, pepper_prob):
noisy_image = np.copy(image)
total_pixels = image.size
salt_pixels = int(total_pixels * salt_prob)
pepper_pixels = int(total_pixels * pepper_prob)
# 添加盐噪声
salt_coords = [np.random.randint(0, i - 1, salt_pixels) for i in image.shape]
noisy_image[tuple(salt_coords)] = 255
# 添加椒噪声
pepper_coords = [np.random.randint(0, i - 1, pepper_pixels) for i in image.shape]
noisy_image[tuple(pepper_coords)] = 0
return noisy_image
noisy_image = add_salt_and_pepper_noise(image, salt_prob=0.01, pepper_prob=0.01)
5.3 添加高斯噪声
# 添加高斯噪声
def add_gaussian_noise(image, mean=0, std=25):
noisy_image = np.copy(image)
noise = np.random.normal(mean, std, image.shape).astype(np.uint8)
noisy_image = cv2.add(image, noise)
return noisy_image
noisy_image = add_gaussian_noise(image, mean=0, std=25)
5.4 添加均值滤波、中值滤波、高斯滤波(我以椒盐噪声为例,高斯噪声改一下参数就行)
# 均值滤波
mean_filtered_image = cv2.blur(noisy_image, (3, 3))
# 中值滤波
median_filtered_image = cv2.medianBlur(noisy_image, 3)
# 高斯滤波
gaussian_filtered_image = cv2.GaussianBlur(noisy_image, (3, 3), 0)
5.5 可视化(椒盐噪声为例)
plt.subplot(231)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.subplot(232)
plt.imshow(noisy_image, cmap='gray')
plt.title('Noisy Image')
plt.subplot(233)
plt.imshow(mean_filtered_image, cmap='gray')
plt.title('Mean Filtered')
plt.subplot(234)
plt.imshow(median_filtered_image, cmap='gray')
plt.title('Median Filtered')
plt.subplot(235)
plt.imshow(gaussian_filtered_image, cmap='gray')
plt.title('Gaussian Filtered')
plt.subplots_adjust(wspace = 0.5,hspace = 0.5)
六、结语
图像处理还有很多其他的处理,我只是简单的列举了一些来简单实现一下,如果可以帮助到你,我将会感到高兴。