🔥博客主页:真的睡不醒
🚀系列专栏:深度学习环境搭建、环境配置问题解决、自然语言处理、语音信号处理、项目开发
💘每日语录:你若喜爱你本身的价值,那么你就得给世界创造价值。。
🎉感谢大家点赞👍收藏⭐指正✍️
目录
🚀🚀🚀感谢关注我的CSDN博客,更多自然语言处理技巧和应用,请持续关注!
一、图像的灰度变换、Gamma变换
1.1 灰度变换
灰度变换是一种数字图像处理技术,它用于改变图像的灰度级别,从而调整图像的对比度和亮度。灰度变换通常用于增强图像,使它更容易分析或更适合特定的应用。在数字图像中,每个像素都有一个灰度级别,通常在0到255之间,0代表黑色,255代表白色。灰度变换通过对每个像素的灰度级别进行调整来改变图像的外观。灰度变换是通过改变图像的像素值来实现的。
1.2 常见的灰度变换函数
1.2.1 线性变换
线性灰度变换是一种最简单的灰度变换方法,它通过一个线性函数来映射输入灰度级别到输出灰度级别。这个函数通常表示为:
其中,I 是输入灰度级别,O 是输出灰度级别,a 和 b 是调整参数。通过调整 a 和 b 的值,可以改变图像的对比度和亮度。
1.2.2 对数变换
对数变换是一种非线性灰度变换,它用于增强图像中的低灰度级别细节。对数变换的函数表达式为:
其中,I 是输入灰度级别,O 是输出灰度级别,c 是调整参数。对数变换可以增强图像中的暗部细节,使它们更容易观察。
1.3 Gamma变换
Gamma变换是一种非线性灰度变换,它用于调整图像的对比度。Gamma变换的函数表达式为:
其中,I 是输入灰度级别,O 是输出灰度级别,\gamma 是调整参数,通常在0.1到5之间。较小的 \gamma 值可以降低对比度,而较大的 \gamma 值可以增加对比度。Gamma变换通常用于校正显示器的亮度响应,以使图像在屏幕上显示更准确。
1.4 实验
本章内容中实现了图像变暗、图像变亮、降低对比度、gamma变换。
(1) 前三个处理可通过灰度值增加或减少一个常数值、全局线性变换等实现。
全局线性变换:如果要将灰度范围从[a,b]更改为[c,d],则:
s=((d-c)/(b-a))(r-a)+c
如果扩展到最大灰度范围[0,255],则:
s=(255/(b-a))(r-a)
其中,r是输入灰度,s是输出灰度,斜率小于1,则灰度范围压缩。
(2) 在gamma变换中,首先将灰度值先归一化到[0,1]之间,然后执行gamma变换,最后再还原回[0,255]之间。
1.4 代码
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 图像变暗
def darken_image(image, factor):
darkened_image = np.clip(image * factor, 0, 255).astype(np.uint8)
return darkened_image
# 图像变亮
def brighten_image(image, factor):
brightened_image = np.clip(image * factor, 0, 255).astype(np.uint8)
return brightened_image
# 降低对比度
def reduce_contrast(image, factor):
reduced_contrast_image = np.clip(image + (image - 128) * factor, 0, 255).astype(np.uint8)
return reduced_contrast_image
# Gamma变换
def gamma_correction(image, gamma):
gamma_corrected_image = np.power(image / 255.0, gamma)
gamma_corrected_image = np.uint8(255 * gamma_corrected_image)
return gamma_corrected_image
# 读取图像
image = cv2.imread('iris.jpg', cv2.IMREAD_GRAYSCALE)
# 归一化到[0, 1]之间
normalized_image = image / 255.0
# Gamma变换参数
gamma_value = 0.25
# 执行图像处理
darkened = darken_image(image, 0.5)
brightened = brighten_image(image, 2.0)
low_contrast = reduce_contrast(image, 0.5)
gamma_corrected = gamma_correction(normalized_image, gamma_value)
# 还原到[0, 255]之间
gamma_corrected = np.uint8(255 * gamma_corrected)
# 显示原始图像和处理后的图像
plt.figure(figsize=(12, 6))
plt.subplot(2, 3, 1), plt.imshow(image, cmap='gray'), plt.title('Original')
plt.subplot(2, 3, 2), plt.imshow(darkened, cmap='gray'), plt.title('Darkened')
plt.subplot(2, 3, 3), plt.imshow(brightened, cmap='gray'), plt.title('Brightened')
plt.subplot(2, 3, 4), plt.imshow(low_contrast, cmap='gray'), plt.title('Low Contrast')
plt.subplot(2, 3, 5), plt.imshow(gamma_corrected, cmap='gray'), plt.title('Gamma Corrected')
plt.show()
1.5 结果
二、 图像的空域滤波、拉普拉斯空域锐化
2.1 空域滤波
2.1.1 基本概念
空域滤波是一种数字图像处理技术,用于通过卷积运算来改变图像中的像素值。卷积操作涉及将一个滤波器(也称为卷积核)与输入图像的每个像素进行相乘,然后将结果求和以生成输出图像的每个像素。空域滤波通常用于平滑图像、去噪或检测图像中的特征。
2.1.2 常见的空域滤波器
-
均值滤波器(Mean Filter): 均值滤波器使用一个小的卷积核来计算图像中每个像素周围区域的平均灰度值。这有助于去除噪声和平滑图像。
[1/9 1/9 1/9] [1/9 1/9 1/9] [1/9 1/9 1/9]
-
高斯滤波器(Gaussian Filter): 高斯滤波器使用高斯函数作为卷积核来进行加权平均,更重视中心像素。它用于去除高斯噪声和平滑图像。
[1 4 7 4 1] [4 16 26 16 4] [7 26 41 26 7] [4 16 26 16 4] [1 4 7 4 1]
-
中值滤波器(Median Filter): 中值滤波器使用像素值的中位数来替代中心像素的值。它对于去除椒盐噪声(白点和黑点)非常有效。中值滤波器不使用固定的滤波核,而是在每个像素的邻域内计算中值。通常,它采用3x3或5x5的邻域来计算中值。
-
Sobel滤波器(Sobel Filter): 边缘检测滤波器可以帮助检测图像中的边缘和轮廓。常见的边缘检测滤波器包括Sobel、Prewitt和Canny等。
# Sobel水平边缘检测核: [-1 0 1] [-2 0 2] [-1 0 1] # Sobel垂直边缘检测核: [-1 -2 -1] [ 0 0 0] [ 1 2 1]
5.Prewitt滤波器(Prewitt Filter):类似于Sobel滤波器,Prewitt滤波器也用于边缘检测。它有两个滤波核,一个用于水平边缘检测,另一个用于垂直边缘检测。
# Prewitt水平边缘检测核: [-1 0 1] [-1 0 1] [-1 0 1] # Prewitt垂直边缘检测核: [-1 -1 -1] [ 0 0 0] [ 1 1 1]
2.2 拉普拉斯空域锐化
拉普拉斯空域锐化是一种图像增强技术,用于突出图像中的细节和边缘。它通过在原始图像上应用拉普拉斯滤波器来增加像素值的差异,从而增强了图像的对比度和锐度。
拉普拉斯滤波器通常表示为以下卷积核:
# 拉普拉斯锐化滤波核
[ 0 1 0 ]
[ 1 -4 1 ]
[ 0 1 0 ]
# 拉普拉斯增强滤波核
[ 0 -1 0 ]
[ -1 5 -1 ]
[ 0 -1 0 ]
应用这个滤波器后,图像中的边缘和细节将得到增强,使它们更加突出。然而,拉普拉斯滤波器可能会增加噪声,因此在应用之前通常需要先对图像进行平滑处理,然后再应用拉普拉斯滤波器。
2.3 代码
# 在这里编辑拉普拉斯锐化和拉普拉斯锐化增强的代码
# 使用OpenCV的Laplacian函数进行锐化
import matplotlib.pyplot as plt
import cv2
import numpy as np
# 读取图像
img = cv2.imread("/home/aistudio/work/img/kennysmall.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
laplacian = cv2.Laplacian(img, cv2.CV_64F)
laplacian_abs = cv2.convertScaleAbs(laplacian) # 转换为无符号整数
plt.figure(figsize=(10, 5))
plt.subplot(1, 3, 1)
plt.imshow(img)
plt.title('origin Image')
# 显示Laplacian锐化后的图像
plt.figure(figsize=(10, 5))
plt.subplot(1, 3, 2)
plt.imshow(laplacian_abs, cmap='gray')
plt.title('Sharpened Image')
# Laplacian锐化增强
sharpened_image = cv2.addWeighted(img, 1.5, laplacian_abs, -0.5, 0) # 增强锐化
plt.subplot(1, 3, 3)
plt.imshow(sharpened_image)
plt.title('Sharpened Enhanced Image')
plt.show()
2.4 结果
三、添加和抑制噪声
3.1 代码
首先对图像添加椒盐噪声或高斯噪声,然后对加噪图像进行均值滤波、中值滤波和高斯滤波,查看并分析滤波效果。
import cv2
import numpy as np
import random
import matplotlib.pyplot as plt
# 读取图像
image = cv2.imread('work/img/paopao.jpg', cv2.IMREAD_GRAYSCALE)
# 给图像添加椒盐噪声
def addSaltAndPepper(src, percentage):
NoiseImg = src.copy()
NoiseNum = int(percentage * src.shape[0] * src.shape[1])
for i in range(NoiseNum):
randX = random.randint(0, src.shape[0] - 1)
randY = random.randint(0, src.shape[1] - 1)
if random.randint(0, 1) == 0:
NoiseImg[randX, randY] = 0 # 椒噪声,设置为黑色
else:
NoiseImg[randX, randY] = 255 # 盐噪声,设置为白色
return NoiseImg
# 给图像添加高斯噪声
def addGaussianNoise(src, mean, sigma):
NoiseImg = src.copy() / 255.0 # 归一化到[0, 1]范围
rows, cols = NoiseImg.shape
gauss = np.random.normal(mean, sigma, (rows, cols)) # 生成高斯噪声
gauss = gauss.reshape(rows, cols)
NoiseImg = NoiseImg + gauss
NoiseImg = np.clip(NoiseImg, 0, 1) # 防止像素值超出[0, 1]范围
NoiseImg = (NoiseImg * 255).astype(np.uint8) # 还原到[0, 255]范围
return NoiseImg
# 添加椒盐噪声
salt_pepper_noisy_image = addSaltAndPepper(image, 0.05)
# 添加高斯噪声
gaussian_noisy_image = addGaussianNoise(image, 0, 25)
# 定义滤波核大小
kernel_size = 3
# 均值滤波
mean_filtered_salt_pepper = cv2.blur(salt_pepper_noisy_image, (kernel_size, kernel_size))
mean_filtered_gaussian = cv2.blur(gaussian_noisy_image, (kernel_size, kernel_size))
# 中值滤波
median_filtered_salt_pepper = cv2.medianBlur(salt_pepper_noisy_image, kernel_size)
median_filtered_gaussian = cv2.medianBlur(gaussian_noisy_image, kernel_size)
# 高斯滤波
gaussian_filtered_salt_pepper = cv2.GaussianBlur(salt_pepper_noisy_image, (kernel_size, kernel_size), 1)
gaussian_filtered_gaussian = cv2.GaussianBlur(gaussian_noisy_image, (kernel_size, kernel_size), 1)
# 显示结果图像
plt.figure(figsize=(12, 12))
# 原始椒盐噪声图像
plt.subplot(3, 2, 1)
plt.imshow(salt_pepper_noisy_image, cmap='gray')
plt.title('Salt and Pepper Noisy Image')
# 原始高斯噪声图像
plt.subplot(3, 2, 2)
plt.imshow(gaussian_noisy_image, cmap='gray')
plt.title('Gaussian Noisy Image')
# 均值滤波后的椒盐噪声图像
plt.subplot(3, 2, 3)
plt.imshow(mean_filtered_salt_pepper, cmap='gray')
plt.title('Mean Filtered (Salt and Pepper Noise)')
# 均值滤波后的高斯噪声图像
plt.subplot(3, 2, 4)
plt.imshow(mean_filtered_gaussian, cmap='gray')
plt.title('Mean Filtered (Gaussian Noise)')
# 中值滤波后的椒盐噪声图像
plt.subplot(3, 2, 5)
plt.imshow(median_filtered_salt_pepper, cmap='gray')
plt.title('Median Filtered (Salt and Pepper Noise)')
# 中值滤波后的高斯噪声图像
plt.subplot(3, 2, 6)
plt.imshow(median_filtered_gaussian, cmap='gray')
plt.title('Median Filtered (Gaussian Noise)')
plt.tight_layout()
plt.show()