数据科学与图像处理技术

数据科学已经成为一个非常受欢迎且重要的领域。许多大型科技公司都在寻找数据科学家,因为数据是任何组织中非常关键的部分,必须高效处理。数据科学的一个重要方面是图像处理。组织可能拥有文本或图像形式的数据。例如,可能已经使用过谷歌镜头,它允许拍摄照片,并在谷歌搜索中找到与该图像密切相关的类似图像或文章。它们是如何做到这一切的?所有这些都需要图像处理和从中提取数据。让看看使用Python进行图像处理的一些方面:

1. 机器如何查看图像?

在继续之前,需要知道机器实际上是如何处理图像的。机器并不像人类那样查看图像。图像不过是像素。图像在二维矩阵中表示,其中x轴是图像的宽度,y轴是图像的高度。矩阵由像素值组成,每个像素的值范围从0到255。这里像素值等于0意味着黑色,而255意味着白色。通常,矩阵中的每个条目以RGB格式表示。例如,读取一个图像作为‘img’,然后

img[x, y] = (0,0,0)

上述示例显示了‘img’的x和y坐标被分配值为(0,0,0),这是以(r,g,b)格式表示的。不用担心,随着继续前进,事情会变得更加清晰。将在下一节中查看图像处理的基础知识。在此之前,让看一下下面的图像及其像素表示:

[来源:http://hamamatsu.magnet.fsu.edu/articles/digitalimagebasics.html]

2. 如何读取图像?

Python中,可以使用Python库OpenCV将图像读取为2-D矩阵。首先,将看一下OpenCV的介绍。

OpenCV代表开源计算机视觉库,是一个开源的计算机视觉和机器学习软件库,可用于C++、Python、MATLAB和Java等语言。它是数据科学家用于图像处理的最流行的库。它提供了可以应用于图像的各种算法和技术。因此,在本文中,将使用Python中的OpenCV库,有时还会使用sklearn库,它和OpenCV一样有用。

[来源:https://medium.com/syncedreview/opencv-4-0-release-ends-3-5-year-wait-6f3619d156f7]

让使用以下代码安装并导入OpenCV库:

!pip install cv2 import cv2 as cv

一旦安装了cv2库并将其导入到Python代码中,下一步就是使用cv2库读取图像。

import cv2 as cv img=cv.imread('sample.jpg')

[来源:https://chercher.tech/opencv/image-basics-opencv]

3. 图像尺寸调整

当尝试构建模型并需要图像处理时,必须记住所有图像应该是相同的大小。这意味着必须重新调整所有图像尺寸以获得数据集中的一致性。重新调整(或调整大小)图像应该以这样的方式进行,即保持图像的原始纵横比。

可以使用以下cv2库实现:

image = cv2.imread('image.jpg') down_width = 300 down_height = 200 down_points = (down_width, down_height) resized_down = cv2.resize(image, down_points, interpolation=cv2.INTER_LINEAR)

现在,将向介绍一个最重要和最有趣的主题,即二值化。二值化是将灰度图像转换为黑白图像(即0和255像素)。这可以通过称为阈值处理的过程实现。因此,通过阈值处理,可以获得二值图像。现在,阈值处理可以定义为一个过程,其中每个像素转换为0或255,这取决于其值是否大于或小于阈值。如果像素的值大于阈值,则转换为255,否则转换为1。这就是阈值处理的工作方式。

现在有3种不同的阈值处理技术:

在简单阈值处理方法中,必须向函数传递阈值参数。因此,阈值是由程序员在许多尝试和错误之后手动决定的,无论特定值是否适合图像处理。这个阈值对每个像素保持不变,如果其值小于阈值,则转换为0,否则转换为255。这可以使用cv2库实现如下:

import cv2 as cv img = cv.imread('sample.png',) # 读取图像 ret, thresh1 = cv.threshold(img, 127, 255, cv.THRESH_BINARY)

上述代码实现了函数cv.threshold。它接受第一个参数作为应该为灰度的图像。第二个参数应该是用于转换像素的阈值。第三个值是最大值,即上面示例中使用的255。第四个参数是使用的阈值处理类型。

[来源:https://www.researchgate.net/figure/Simple-Thresholding-Based-Segmentation_fig5_296064445]

当图像具有不同的照明条件时,这种方法有时对二值化更有用。在简单阈值处理中,对所有像素使用全局阈值。在自适应阈值处理的情况下,算法将图像划分为更小的区域,并自动确定每个较小区域的阈值。这比全局阈值处理的结果要好得多。它可以使用cv2库实现如下:

import cv2 as cv img = cv.imread('sample.png',) th2 = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 11, 2)

在自适应阈值处理方法中,第一个参数是图像。第二个参数是像素的最大值。在第三个参数中,可以传递2个参数,即cv.ADAPTIVE_THRESH_MEAN_C和cv.ADAPTIVE_THRESH_GAUSSIAN_C。第五个参数是图像的块大小,即图像的较小区域的大小。最后一个参数是常数C。

[来源:https://docs.opencv.org/4.5.1/d7/d4d/tutorial_py_thresholding.html]

Otsu阈值处理技术与简单阈值处理技术类似。唯一的主要区别是这里不需要选择全局阈值,与简单阈值处理不同,后者明确需要阈值。这个算法自动确定阈值,并将其应用于获得最佳结果。它的实现也类似,只是将cv.THRESH_OTSU作为额外参数传递。

ret2, th2 = cv.threshold(img, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)

[来源:https://docs.opencv.org/4.5.1/d7/d4d/tutorial_py_thresholding.html]

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485