灰度变换
反色变换
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.family']='SimHei'
#读取RGB图像并转换为灰度图像
image = cv2.cvtColor(cv2.imread('Lena.bmp'), cv2.COLOR_BGR2GRAY)
#对图像进行反色变换
inverted_image = 255 - image
# 显示原始图像和反色变换后的图像
fig, axes = plt.subplots(1, 2)
axes[0].imshow(image, cmap='gray')
axes[0].set_title('原图')
axes[1].imshow(inverted_image, cmap='gray')
axes[1].set_title('反色变换')
plt.show()
对数变换
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family']='SimHei'
#读取RGB图像并转换为灰度图像
image = cv2.imread('Lena.bmp', 0)
#对数变换
c = 1.0 #对数变换常数
log_transformed = c * np.log(1 + image)
# 转换为整数类型(0-255)
log_transformed = np.uint8(log_transformed)
fig, axes = plt.subplots(1, 2)
axes[0].imshow(image, cmap='gray')
axes[0].set_title('原图')
axes[1].imshow(log_transformed, cmap='gray')
axes[1].set_title('对数变换')
plt.show()
伽马变换
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
#读取灰度图像
image = cv2.imread('Lena.bmp', 0)
#伽马变换
gamma = 2 #伽马值
gamma_transformed = np.power(image / 255.0, gamma) * 255.0
# 转换为整数类型(0-255)
gamma_transformed = np.uint8(gamma_transformed)
fig, axes = plt.subplots(1, 2)
axes[0].imshow(image, cmap='gray')
axes[0].set_title('原图')
axes[1].imshow(gamma_transformed, cmap='gray')
axes[1].set_title('伽马变换')
plt.show()
分段线性变换
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
#读取图像
image = cv2.imread('Lena.bmp', 0)
#分段线性变换参数
x_min = 50
x_max = 200
# 分段线性变换函数
def piecewise_linear_transform(pixel_value):
if pixel_value < x_min:
return 0
elif pixel_value > x_max:
return 255
else:
return 255 * (pixel_value - x_min) / (x_max - x_min)
#对图像进行分段线性变换
transformed_image = np.vectorize(piecewise_linear_transform)(image)
#计算原始图像的直方图
hist_original, _ = np.histogram(image.flatten(), bins=256, range=[0, 256])
#计算变换后图像的直方图
hist_transformed, _ = np.histogram(transformed_image.flatten(), bins=256, range=[0, 256])
fig, axes = plt.subplots(2, 2, figsize=(10, 10))
axes[0, 0].imshow(image, cmap='gray')
axes[0, 0].set_title('原始图像')
axes[0, 1].imshow(transformed_image, cmap='gray')
axes[0, 1].set_title('分段线性变换')
axes[1, 0].bar(range(256), hist_original, color='gray', alpha=0.7)
axes[1, 0].set_title('原始图像直方图')
axes[1, 0].set_xlabel('灰度值')
axes[1, 0].set_ylabel('像素数量')
axes[1, 1].bar(range(256), hist_transformed, color='gray', alpha=0.7)
axes[1, 1].set_title('分段线性变换直方图')
axes[1, 1].set_xlabel('灰度值')
axes[1, 1].set_ylabel('像素数量')
plt.show()
直方图均衡化
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
#读取图像
image = cv2.imread('Lena.bmp', 0)
#进行直方图均衡化
equalized_image = cv2.equalizeHist(image)
#计算原始图像的直方图
hist_original, _ = np.histogram(image.flatten(), bins=256, range=[0, 256])
#计算均衡化后图像的直方图
hist_equalized, _ = np.histogram(equalized_image.flatten(), bins=256, range=[0, 256])
fig, axes = plt.subplots(2, 2, figsize=(10, 10))
axes[0, 0].imshow(image, cmap='gray')
axes[0, 0].set_title('原始图像')
axes[0, 1].imshow(equalized_image, cmap='gray')
axes[0, 1].set_title('直方图均衡化')
axes[1, 0].bar(range(256), hist_original, color='gray', alpha=0.7)
axes[1, 0].set_title('原始图像直方图')
axes[1, 0].set_xlabel('灰度值')
axes[1, 0].set_ylabel('像素数量')
axes[1, 1].bar(range(256), hist_equalized, color='gray', alpha=0.7)
axes[1, 1].set_title('直方图均衡化直方图')
axes[1, 1].set_xlabel('灰度值')
axes[1, 1].set_ylabel('像素数量')
plt.show()
评论区