# 在绘图中显示中文字体,而非乱码
from pylab import mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"]
import cv2
import matplotlib.pyplot as plt
import numpy as np
1 绘制伽马变换的函数图像,并导入一张图像,对其进行伽马变换,简要叙述变换前后图像的变化。
# 第一题代码部分
r = np.arange(0, 1, 0.001)
y = np.array([0.001, 0.01, 0.1, 0.5, 0.9, 1, 5, 10,20]) # 将 y 转换为 numpy 数组
c = 1
s = []
for i in range(9):s_temp =c * (r**y[i]) # 使用 y[i] 而不是 ys.append(s_temp)
# 做出曲线图
fig = plt.figure()
axes = fig.add_subplot()
label_list = ["y=0.001", "y=0.01", "y=0.1", "y=0.5", "y=0.9", "y=1", "y=5", "y=10", "y=1000"]
for i in range(9):axes.plot(r*255, s[i], label=label_list[i])
plt.title('对数变换曲线')
plt.xlabel('变换前灰度值')
plt.ylabel('变换后灰度值')
plt.legend()
plt.grid()
plt.show()
img2 = cv2.imread(图片路径)
img2 = np.array(img2, dtype='float')
img3 = np.zeros(img2.shape)
c = 40
y=3for i in range(img2.shape[0]):for j in range(img2.shape[1]):img3[i][j] = 255.0 / pow(255.0, y) * (img2[i][j]**y)title_list = ["原始图像","γ=3变化后的图像"]
img3 = np.where(img3 > 255.0, 255.0, img3) # 超过255的设置为255
img3 = np.where(img3 < 0.0, 0.0, img3) # 低于0的设置为0
img3 = np.array(img3, dtype='uint8')
img2 = np.array(img2, dtype='uint8')
img_list = [img2, img3]for i in range(2):plt.subplot(1, 2, i+1)plt.imshow(img_list[i], 'gray')plt.title(title_list[i])plt.xticks([])plt.yticks([])
plt.show()
print(2)
第一题文字部分:
γ>1时,图像会变暗,对比度降低,较亮的像素值比较暗的像素值受到更大的影响,适用于较亮的图像,用于降低亮度并增加一些对比度。
γ=1时,图像没有变化。
γ<1时,图像会变亮,对比度增加,特别是暗部细节会变得更加明显,适用于较暗的图像,用于提高亮度并减少对比度。
统计一幅图像的直方图,并对其进行均衡化,展示均衡化前后的图像和对应的直方图。简要叙述图像直方图均衡化的作用。
# 第二题代码部分
# 直方图均衡化
img = cv2.imread(图片路径, cv2.IMREAD_GRAYSCALE)
plt.subplot(2,2,1), plt.imshow(img, 'gray'), plt.title('原始图像'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,2), plt.hist(img.ravel(), 16), plt.title('直方图')
# 均衡化
img_equ = cv2.equalizeHist(img)
plt.subplot(2,2,3), plt.imshow(img_equ, 'gray'), plt.title('均衡化后图像'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,4), plt.hist(img_equ.ravel(), 16)plt.show()
第二题文字部分:
作用:
1.通过重新分配图像的像素值,使得图像的直方图更加均匀,从而提高图像的整体对比度,改善视觉效果。
2.在对比度较低的区域,直方图均衡化可以使像素值相近而难以区分的区域的像素值分布更加分散,使得细节更加清晰。
3.降低强光影响:在光照不均匀的图像中,某些区域可能因为过曝或欠曝而丢失信息。直方图均衡化有助于减少这种光照不均匀造成的影响,使得图像的各个区域都能更好地展现其细节。
3.导入一幅图像,降低其分辨率后,使用两种方法对图像进行插值并展示。
img_ori = cv2.imread(图片路径, cv2.IMREAD_GRAYSCALE)
#降低分辨率
new_x = int(img_ori.shape[0]/16.0)
new_y = int(img_ori.shape[1]/16.0)
img_resize = cv2.resize(img_ori, (new_y, new_x))
img_list = [img_ori, img_resize]
title_list = ["原始图像", "16级空间分辨率降低图像"]
for i in range(2):plt.subplot(1, 2, i+1)plt.imshow(img_list[i], 'gray')plt.title(title_list[i])plt.xticks([])plt.yticks([])
plt.show()
width, height = 200, 200
# 几何插值(面积插值)
resized_img_area = cv2.resize(img_resize, (width, height), interpolation=cv2.INTER_AREA)
# 最近邻插值
resized_img_nearest = cv2.resize(img_resize, (width, height), interpolation=cv2.INTER_NEAREST)
# 双线性插值
resized_img_bilinear = cv2.resize(img_resize, (width, height), interpolation=cv2.INTER_LINEAR)
# 双三次插值
resized_img_cubic = cv2.resize(img_resize, (width, height), interpolation=cv2.INTER_CUBIC)img_list = [img_ori, img_resize,resized_img_area, resized_img_nearest,resized_img_bilinear,resized_img_cubic]
title_list = ["原始图像", "16级空间分辨率降低图像","几何插值","最近邻插值","双线性插值","双三次插值"]
for i in range(6):plt.subplot(3, 2, i+1)plt.imshow(img_list[i], 'gray')plt.title(title_list[i])plt.xticks([])plt.yticks([])
plt.show()
4.导入一幅图像,使用两种方法对其进行平滑。然后,使用拉普拉斯锐化平滑后的两幅图像,并简要叙述图像平滑和拉普拉斯锐化的特点及对图像的影响。
# 第四题代码部分
img = cv2.imread(图片, cv2.IMREAD_GRAYSCALE)
# 邻域滤波
mean_blurred = cv2.blur(img, (5, 5))
# 中值滤波
img_median = cv2.medianBlur(img, 3)
# 拉普拉斯锐化
la = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]])
la_filter = np.float32(la) / -16 # 归一化
laplacian = cv2.filter2D(img, -1, la_filter)
sharpened = cv2.add(img, laplacian)img_list = [img, mean_blurred,img_median, sharpened]
title_list = ["原始图像", "邻域滤波","中值滤波","拉普拉斯锐化"]
for i in range(4):plt.subplot(4, 1, i+1)plt.imshow(img_list[i], 'gray')plt.title(title_list[i])plt.xticks([])plt.yticks([])
plt.show()
第四题文字部分:
图像平滑的特点:减少图像噪声,降低图像分辨率,使图像变得平滑。
拉普拉斯锐化的特点:增强图像的边缘和细节,使图像看起来更清晰图,可能会增强图像噪声。
对图像的影响:平滑可以减少图像噪声,但可能会导致图像细节丢失;拉普拉斯锐化可以增强图像的边缘和细节,使图像更清晰,但可能会引入或增强噪声。
使用opencv的伪彩色增强函数,选取一张图片进行伪彩色增强,并对所使用的伪彩色增强函数进行对应的文档说明(包含参数、返回值和使用说明等,力所能及的情况下,可简要说明相关原理)。
# 第五题代码部分
img_5 = cv2.imread(图片路径, cv2.IMREAD_GRAYSCALE)
img_5_RAINBOW = cv2.applyColorMap(img_5, cv2.COLORMAP_COOL)
img_5_JET = cv2.applyColorMap(img_5, cv2.COLORMAP_HSV)
img_list = [img_5, img_5_RAINBOW,img_5_JET]
title_list = ["原始图像", "COOL伪彩色","HSV伪彩色"]
for i in range(3):plt.subplot(3, 1, i+1)plt.imshow(img_list[i], 'gray')plt.title(title_list[i])plt.xticks([])plt.yticks([])
plt.show()
第五题文字部分:
一、伪彩色增强函数:cv2.applyColorMap(src, colormap[, dst])
二、参数解释:
1.src:输入图像,必须是8位单通道灰度图像(cv2.CV_8UC1)。
src The source image, grayscale or colored of type CV_8UC1 or CV_8UC3. If CV_8UC3, then the CV_8UC1 image is generated internally using cv::COLOR_BGR2GRAY.
2.colormap:颜色映射表,可以是 OpenCV 提供的预定义颜色映射表之一,或者是一个用户自定义的颜色映射表。
colormap The colormap to apply, see ColormapTypes
3.dst:输出图像,它将与源图像 src 具有相同的大小和类型,但会被转换为三通道彩色图像(cv2.CV_8UC3),该字段可以省略。
dst The result is the colormapped source image. Note: Mat::create is called on dst.