使用 Python 从图像数据构建特征
介绍
随着计算机视觉的广泛应用,了解如何处理图像变得非常重要。图像中存储了大量信息,对其进行预处理有助于提取有用的信息。这有助于图像增强、图像检索、图像识别和可视化。
在本指南中,您将学习使用 Python 从图像中提取特征的技术。这可应用于医学图像分析、地理空间计算、机器人视觉和人工智能。
加载图像
在本指南中,您将使用功能强大的scikit-image库来处理图像。scikit -image包专用于图像处理,并使用原生numpy数组作为对象来理解和存储图像。包中有许多内置图像,您将在本指南中使用它们。
下面的前两行代码导入了scikit-image包和内置数据集。最后两行代码绘制了图像。
import skimage
from skimage import data, io
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
加载所需的库后,下一步是加载一些图像。您将绘制的第一幅图像是火箭的图像。这是通过以下代码完成的。
rocket = data.rocket()
io.imshow(rocket)
plt.show()
您还将使用以下代码加载硬币的图像。
coins = data.coins()
io.imshow(coins)
plt.show()
您已加载上面的图像,接下来将学习几个重要的转换。
颜色变换
有时你需要将图像颜色转换为灰度。这可以通过skimage的color模块完成。下面的代码使用color.rgb2gray()模块对火箭图像执行此转换。
from skimage import color
grayscale = color.rgb2gray(rocket)
io.imshow(grayscale)
plt.show()
翻转
您可能还想翻转图像。np.fluidup()函数可用于垂直翻转。 以下代码执行此任务。
# Flip the image in up direction
verticalflip = np.flipud(rocket)
io.imshow(verticalflip)
plt.show()
在这种情况下,图像是反转的,但在许多情况下,您会收到反转的图像并需要翻转它。 此功能在这些情况下会很方便。
特征提取:灰度像素值
图像由像素表示,这意味着创建图像特征的最简单方法是使用这些原始像素值作为单独的特征。首先打印硬币图像的形状。
coins.shape
输出:
(303, 384)
特征的数量将与像素的数量相同,在本例中是 303 乘以 384,即 116,352。
要将这些像素排列为特征,您将使用numpy 中的reshape()函数。第一行代码使用 reshape 函数创建特征对象,该函数将图像及其尺寸作为输入。第二行打印形状和特征。
features = np.reshape(coins, (303*384))
features.shape, features
输出:
((116352,), array([ 47, 123, 133, ..., 4, 10, 7], dtype=uint8))
上面的输出表明您具有该特征,它是一个长度为 116,352 的一维数组。
阈值
阈值处理是一种将图像划分为前景和背景的技术。这是最简单的图像分割方法,其中对图像像素值应用截止值来分割背景。要了解其工作原理,请先使用以下代码加载相机图像。
camera = data.camera()
io.imshow(camera)
plt.show()
下一步是应用阈值来分割图像。这是通过下面的代码完成的。第一行任意分配阈值 100。第二行将其应用于图像像素值。最后四行代码显示原始图像和阈值图像以显示差异。
threshold_value = 100
camera_threholded = camera > threshold_value
# Show the original image
io.imshow(camera)
plt.show()
# Show the thresholded image
io.imshow(camera_threholded)
plt.show()
下面的例子说明了选择阈值的重要性,其中阈值保持在200。
threshold_value = 200
camera_threholded = camera > threshold_value
io.imshow(camera)
plt.show()
io.imshow(camera_threholded)
plt.show()
显然,选择错误的阈值会扭曲图像,使其变得毫无用处。
解决方案是,您可以使用Otsu方法而不是任意阈值,该方法使用简单的启发式方法来查找最佳阈值。
为此,第一步是导入threshold_otsu模块,该模块在下面的第一行代码中完成。第二行使用threshold_otsu ()函数获取最佳阈值,而第三行将其应用于图像。最后四行代码显示原始图像和阈值图像以显示差异。
from skimage.filters import threshold_otsu
threshold_value = threshold_otsu(camera)
camera_threholded = camera > threshold_value
# Show the original image
io.imshow(camera)
plt.show()
# Show the thresholded image
io.imshow(camera_threholded)
plt.show()
边缘检测
高级图像处理应用之一是一种称为边缘检测的技术,其目的是识别图像中亮度急剧变化或不连续的点。这些点被组织成一组称为边缘的曲线段。您将使用硬币图像来探索这种技术,使用 Canny 边缘检测技术,该技术被广泛认为是边缘检测技术的标准。
第一行代码从功能模块导入 Canny 边缘检测器。第二行将图像转换为灰度,这是 Canny 检测器的要求。第三行将 Canny 边缘检测器模块应用于硬币图像。最后四行代码绘制原始图像和带有边缘的结果图像。
from skimage.feature import canny
coins = color.rgb2gray(coins)
# Apply Canny detector
coins_edges = canny(coins)
io.imshow(coins)
plt.show()
io.imshow(coins_edges)
plt.show()
在上图中,你现在可以更清楚地看到边缘。边缘检测广泛应用于人脸检测、指纹匹配和医疗诊断等应用。
结论
在本指南中,您学习了如何使用 Python 从图像数据构建特征。您学习了包括图像转换、阈值处理、特征提取和边缘检测在内的技术。最后,您学习了如何使用 Python 中流行且功能强大的scikit-image库执行这些任务。
要了解有关使用 Python 进行数据科学的更多信息,请参阅以下指南。
<a href="https://www-pluralsight-com.translate.goog/resources/blog/guides/data-science-be
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~