空域图像增强

         一、目标

        将图片灰度处理,实现图像变暗、图像变亮、降低对比度、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)

         六、结语

        图像处理还有很多其他的处理,我只是简单的列举了一些来简单实现一下,如果可以帮助到你,我将会感到高兴。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

꧁是小阿狸꧂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值