图像处理与分析——实验二-空间域的图像增强

ELecmark VIP

实验目标:

用Python写一段程序,针对提供的图片IMG_2546.jpg,实现:

1.

  • ①查看直方图

  • ②取反,再查看直方图

  • ③使用直方图均衡,再查看直方图

  • ④通过旋转、切割,仅保留“爱丁堡花园”部分

  1. 人脸1.jpg、2.jpg、3.jpg、4.jpg进行滤波等操作实现类似美图秀秀磨皮功能,并对比磨皮前后直方图变化。

  2. 将Sobel算子编码到pytorch卷积核中,并用编码的卷积核对图像100_3228.jpg执行卷积操作,输出结果,理解卷积操作与空间域滤波的关系。

一、

实验要求:

  1. 用Python写一段程序,针对提供的图片IMG_2546.jpg,实现:

①查看直方图

②取反,再查看直方图

③使用直方图均衡,再查看直方图

④通过旋转、切割,仅保留“爱丁堡花园”部分

实验图片路径为: imgs/IMG_2546.jpg

输出路径为:outputs/

请按照exp2_1_i的格式,输出四个结果,比如①的结果保存为:outputs/exp2_1_1.jpg

实验方案:

步骤一:查看原图直方图

  • 首先,加载图片并使用OpenCV库进行读取。
  • 使用Matplotlib绘制图像的直方图,这是通过计算每个颜色通道的像素强度分布来完成的。
  • 保存包含原图和直方图的组合图像为 outputs/exp2_1_1.jpg
1
2
# ①查看原图直方图
save_image_and_histogram(img, 'Original Image', 'Original Histogram', 'exp2_1_1.jpg')

步骤二:取反图像并查看直方图

  • 对原始图像进行取反操作,这意味着将每个像素的颜色值变为其补色。
  • 再次绘制取反后图像的直方图,并保存。
1
2
3
# ②取反并查看直方图
img_neg = cv2.bitwise_not(img)
save_image_and_histogram(img_neg, 'Negative Image', 'Negative Histogram', 'exp2_1_2.jpg')

步骤三:直方图均衡化并查看直方图

  • 将图像从BGR色彩空间转换为YUV色彩空间。
  • 对Y通道(亮度)进行直方图均衡化,这能改善图像的对比度。
  • 再次绘制直方图均衡化后图像的直方图,并保存。
1
2
3
4
5
# ③直方图均衡化并查看直方图
img_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
img_yuv[:,:,0] = cv2.equalizeHist(img_yuv[:,:,0])
img_histeq = cv2.cvtColor(img_yuv, cv2.COLOR_YUV2BGR)
save_image_and_histogram(img_histeq, 'Histogram Equalization', 'Eq Histogram', 'exp2_1_3.jpg')

步骤四:精确提取文本区域

  • 考虑到文本可能因拍摄角度而不完全水平,我应用了一个旋转变换,使文本尽可能地水平以便裁剪。
  • 设置旋转中心为图像中心,并指定旋转角度(在这里是-10度)。这个角度可能需要根据具体图片进行微调。
  • 应用旋转后,根据旋转后的图像内容,手动确定“爱丁堡花园”文本的精确位置并进行裁剪。
  • 最后,将旋转和裁剪后的区域保存为 outputs/exp2_1_4.jpg,这是仅包含目标文本区域的图片。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# ④仅保留“爱丁堡花园”部分
# 获取图像尺寸用于计算旋转中心
rows, cols, _ = img.shape

# 设置旋转矩阵,中心点为图像中心,旋转角度为-10度,缩放因子为1
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), -10, 1)

# 旋转图像
rotated_img = cv2.warpAffine(img, M, (cols, rows))

# 在旋转后的图像中确定“爱丁堡花园”文字的大致位置
img_crop = rotated_img[550:630, 600:910]


# 保存剪裁后的图像
cv2.imwrite(f'{output_dir}exp2_1_4.jpg', img_crop)

实验结果:

①查看直方图

实际输出

②取反,再查看直方图

实际输出

③使用直方图均衡,再查看直方图

实际输出

④通过旋转、切割,仅保留“爱丁堡花园”部分

实际输出

二、

实验要求:

人脸1.jpg、2.jpg、3.jpg、4.jpg进行滤波等操作实现类似美图秀秀磨皮功能,并对比磨皮前后直方图变化。

实验图片路径为: imgs/1.jpg imgs/2.jpg imgs/3.jpg imgs/4.jpg

输出路径为:outputs/

请按照exp2_2_i的格式,输出四个结果,比如结果保存为:outputs/exp2_2_1.jpg

实验方案:

通过应用双边滤波器对给定的人脸图像进行磨皮处理,然后对比处理前后图像的直方图变化。双边滤波器是一种非线性的滤波方法,它可以在平滑图像噪声的同时保留边缘信息,因此特别适合于图像美化处理。在Python中,可以使用OpenCV库中的bilateralFilter函数来实现这一操作。

1
2
# 使用双边滤波器进行磨皮
smoothed = cv2.bilateralFilter(image, d=9, sigmaColor=75, sigmaSpace=75)

其中,d表示滤波器的直径,sigmaColor表示颜色空间的标准差,sigmaSpace表示坐标空间的标准差。这些参数决定了滤波器平滑图像的程度。

直方图的对比通过计算原图像和磨皮后图像的颜色直方图,并用不同颜色的线表示出来。这一过程可以直观地观察磨皮效果对图像色彩分布的影响。

1
2
3
4
5
6
7
# 计算直方图并绘制
hist_original = cv2.calcHist([original], [0], None, [256], [0, 256])
hist_smoothed = cv2.calcHist([smoothed], [0], None, [256], [0, 256])

plt.figure(figsize=(10, 5))
plt.plot(hist_original, color='blue', label='Original')
plt.plot(hist_smoothed, color='red', label='Smoothed')

实验结果:

实际输出

实际输出

实际输出

图1的分析

原始图像和经过双边滤波处理后的图像在直方图上差别不大。这表明图像的磨皮效果较为自然,没有过度平滑,同时保持了原图的色彩特征。

实际输出

实际输出

实际输出

图2的分析

可以看到在某些颜色通道中,经过滤波处理后的直方图在峰值附近略微平滑,但整体色彩分布的变化不是特别显著。

实际输出

实际输出

实际输出

图3的分析

滤波后图像的直方图在低亮度区域有了平滑,说明磨皮处理降低了图像中的暗部噪声。

实际输出

实际输出

实际输出

图4的分析

图像的直方图曲线在整体上变得更加平滑,尤其是在亮度较高区域的变化更为明显。这可能意味着图像亮部的细节被稍微抑制,从而减少了噪声并增强了整体的视觉效果。

三、

实验要求:

将Sobel算子编码到pytorch卷积核中,并用编码的卷积核对图像100_3228.jpg执行卷积操作,输出结果(水平梯度图像、垂直梯度图像和梯度幅值图像),理解卷积操作与空间域滤波的关系。

实验图片路径为: imgs/100_3228.jpg

输出路径为:outputs/

请按照exp2_3_i的格式,输出结果 比如结果保存为:outputs/exp2_3_1.jpg

实验方案:

步骤一:读取和预处理图像

  • 读取图像100_3228.jpg
  • 将图像转换为灰度格式以准备进行Sobel边缘检测。
1
2
image = Image.open(img_path)
img = transform(image)

步骤二:定义Sobel卷积核

  • 定义Sobel卷积核sobel_xsobel_y以检测水平和垂直边缘。
  • 这些卷积核分别能够捕捉图像在水平和垂直方向上的梯度信息。
1
2
sobel_x = torch.Tensor([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]).unsqueeze(0).unsqueeze(0)
sobel_y = torch.Tensor([[-1, -2, -1], [0, 0, 0], [1, 2, 1]]).unsqueeze(0).unsqueeze(0)

步骤三:配置卷积层并执行卷积

  • 配置卷积层以使用Sobel算子。
  • 不使用偏置,因为在这种滤波操作中不需要。
1
2
3
4
conv_x = nn.Conv2d(1, 1, kernel_size=3, padding=1, bias=False)
conv_y = nn.Conv2d(1, 1, kernel_size=3, padding=1, bias=False)
conv_x.weight.data = sobel_x
conv_y.weight.data = sobel_y
  • 应用Sobel算子于图像以得到水平和垂直梯度。
1
2
img_x = conv_x(Variable(img.unsqueeze(0)))
img_y = conv_y(Variable(img.unsqueeze(0)))

步骤四:计算梯度幅值

  • 结合水平和垂直梯度以计算梯度幅值,这能够显示图像中边缘的整体强度。
1
img_magnitude = torch.sqrt(img_x**2 + img_y**2)

步骤五:执行阈值化处理

  • 通过设置阈值,去除噪声并突出边缘。
  • 阈值化后的结果只保留较强的边缘。
1
threshold = img_magnitude.mean() * 0.5

步骤六:可视化与保存结果

  • 保存水平和垂直梯度图像,以及梯度幅值图像。
  • 使用matplotlib对图像进行可视化。
1
2
3
visualize_and_save(img_x_thresholded, 'Horizontal Gradient', 'outputs/exp2_3_1.jpg')
visualize_and_save(img_y_thresholded, 'Vertical Gradient', 'outputs/exp2_3_2.jpg')
visualize_and_save(img_magnitude, 'Gradient Magnitude', 'outputs/exp2_3_3.jpg')

实验结果:

实际输出

实际输出

实际输出

实际输出

  1. 水平梯度图像: 这张图像展示了原始图像中沿水平方向边缘的强度。在水平梯度图中,垂直边缘(如山和建筑物尖顶的轮廓)被突出显示。由于Sobel算子在水平方向上捕捉垂直边缘,所以图像中明显的垂直线条和特征在这里以较亮的像素显示出来,而水平边缘则不明显或显得较暗。
  2. 垂直梯度图像: 与水平梯度图相对,这张图显示了沿垂直方向的边缘强度。在垂直梯度图中,水平边缘(如屋顶的边缘,建筑物所在地平缓处等等)更为明显。Sobel算子在垂直方向上识别水平边缘,因此图像中水平线条和特征在这张图上以亮像素呈现。
  3. 梯度幅度图像: 此图像结合了水平和垂直梯度的信息,提供了边缘总体强度的视图。在梯度幅度图中,所有边缘,无论其方向如何,都以亮度的形式展现,其中亮度越强表示梯度幅度越大。这张图是通过计算水平梯度和垂直梯度在每个像素点的矢量和的幅度得到的。它提供了关于图像边缘强度最完整的视图,显示了所有明显边缘的位置。

实验总结:

在本次实验中,我利用Python探索了图像处理中的空间域增强技术。实验的目标是通过对特定图像进行处理,以理解和应用直方图分析、图像取反、直方图均衡化以及卷积操作在图像增强和边缘检测中的作用。以下是本实验的关键发现和总结:

直方图分析和图像取反

  • 我观察了原始图像的直方图,并通过图像取反来了解亮度分布的变化。取反操作将图像中的亮区域变暗,暗区域变亮,直方图也相应地发生反转。

直方图均衡化

  • 通过将图像转换到YUV色彩空间并对Y通道应用直方图均衡化,我显著提高了图像的对比度。直方图均衡化后的结果使得亮度分布更加均匀,从而增强了图像中的细节。

图像旋转和裁剪

  • 通过旋转和裁剪操作,我成功地提取了图像中“爱丁堡花园”部分。这个过程涉及到对图像的几何变换,展示了图像处理中的区域选择技术。

滤波和磨皮效果

  • 我对人脸图像应用了双边滤波器,实现了类似美图秀秀的磨皮效果。磨皮处理后,图像的直方图在低亮度区域变得更加平滑,显示了噪声的减少和肤色的均匀性提升。

Sobel边缘检测

  • 将Sobel算子编码进PyTorch卷积核中并对图像进行处理,我得到了水平和垂直梯度图像以及梯度幅值图。这一过程说明了卷积操作如何作为空间域滤波器来检测图像中的边缘,是图像处理中边缘检测技术的一个经典例子。

通过以上实验步骤,我加深了对图像增强技术的理解,特别是在如何利用不同的空间域滤波技术来改善视觉效果方面。实验结果表明,这些技术不仅可以增强图像的视觉质量,还可以为后续的图像分析工作提供更好的基础。

  • Title: 图像处理与分析——实验二-空间域的图像增强
  • Author: ELecmark
  • Created at : 2024-04-10 11:31:01
  • Updated at : 2024-04-29 19:29:08
  • Link: https://elecmark.github.io/2024/04/10/图像处理与分析——实验二-空间域的图像增强/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments