在数字摄影时代,很少思考这些图片是如何存储在内存中,或者照片中的各种变换是如何实现的。本文将带了解图像处理的一些基本特征,其最终目标始终是特征提取,但在这里需要更深入的数据清洗。数据清洗通常在数据集、表格、文本等上进行,那么在图像上是如何实现的呢?将探讨图像是如何存储在磁盘上的,以及如何利用这些底层数据来操纵图像。
在Python中导入图像是非常容易的。以下代码将帮助在Python中导入图像:
import cv2
image = cv2.imread("path_to_image.jpg")
理解底层数据结构对于图像处理至关重要。图像由多种颜色和许多像素组成。要可视化图像是如何存储的,可以将每个像素视为矩阵中的一个单元格。这个单元格包含三种不同的强度信息,分别对应红色、绿色和蓝色。因此,一个RGB图像就变成了一个3D矩阵,每个数字代表红色、蓝色和绿色的颜色强度。
如上所述,通过操作第三维度来实现图像变换。黄色不是字典中直接可用的颜色,而是作为红色和绿色的组合出现。通过将其他颜色的强度设置为零来实现这种变换。
有时候处理图像的第三维度可能会变得复杂且多余。在特征提取中,如果将图像压缩为2D矩阵,事情会变得更简单。这可以通过灰度化或二值化来实现。灰度化比二值化更丰富,因为它显示了不同灰度强度的组合。而二值化则简单地构建了一个充满0和1的矩阵。
import cv2
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
如所见,图像的维度已经被减少到了两个维度。然而,特征在两张图像中同样可见。这就是为什么灰度图像在存储时占用的空间要小得多。现在让尝试将这个灰度图像二值化。这是通过找到一个阈值并标记灰度图像的像素来完成的。在本文中,使用了Otsu方法来找到阈值。Otsu方法通过最大化两个类别像素之间的方差来计算一个“最优”阈值,这两个类别由阈值分隔。
import cv2
_, binary_image = cv2.threshold(gray_image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
本文最后一部分将介绍与特征提取更相关的技术:图像模糊。灰度或二值图像有时捕捉到的信息比所需的多,模糊处理在这种情况下非常有用。例如,如果鞋子比铁路轨道的关注度低,模糊处理将增加很多价值。从这个例子中可以清楚地看到这一点。模糊算法采用邻近像素的加权平均值,将周围的颜色融入每个像素。
import cv2
blurred_image = cv2.GaussianBlur(gray_image, (21, 21), 0)
在上述图片中,模糊处理后,清楚地看到鞋子的强度水平与铁路轨道相同。因此,这种技术在许多图像处理场景中都非常有用。
让来看一个这样的应用实例。希望计算一张城镇照片中的人数。但这张图片中也有一些建筑物。现在,建筑物后面的人的颜色强度会比建筑物本身低。因此,很难计算这些人。在这种情况下,模糊处理可以用来平衡图像中建筑物和人的强度。
以下是完整的代码示例:
import cv2
image = cv2.imread("path_to_image.jpg")
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred_image = cv2.GaussianBlur(gray_image, (21, 21), 0)
cv2.imshow("Original", image)
cv2.imshow("Gray", gray_image)
cv2.imshow("Blurred", blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()