初学者福利!三种用Python从图像数据中提取特征的技术


640?wx_fmt=jpeg


全文共4073字,预计学习时长8分钟


640?wx_fmt=jpeg


你之前是否使用过图像数据?也许你想建立自己的物体检测模型,或者仅仅是想统计走进某栋建筑物的人数,使用计算机视觉技术处理图像拥有无穷无尽的可能性。


但数据科学家最近有这样一种研究趋势,他们坚信,在处理非结构化数据(尤其是图像数据)时,深度学习模型是不断向前发展的。毫无疑问,深度学习技术表现得非常好,但这是处理图像的唯一方法吗?


并非所有人都拥有像Google和Facebook等大型技术巨头那样无限的资源,那么,如果不透过深度学习,要如何处理图像数据呢?


640?wx_fmt=png


可以利用机器学习的力量!没错,可以使用简单的机器学习模型,如决策树或支持向量机( SVM )。如果能提供正确的数据和功能,这些机器学习模型可以充分发挥作用,甚至可以用作基准解决方案。


所以在这篇适合初学者的文章中,你将了解到从图像中生成特征的不同方法,而后,可以将这些方法应用到自己喜欢的机器学习算法中。


640?wx_fmt=jpeg

目录


1.机器是如何存储图像的?


2.在Python中读取图像数据


3.从图像数据中提取特征的方法#1:灰度像素值特征


4.从图像数据中提取特征的方法#2:通道的平均像素值


5.从图像数据中提取特征的方法#3:提取边缘


640?wx_fmt=jpeg

机器是如何存储图像的?


请从这些基础开始。在查看其他任何内容前,了解如何在计算机上读取与存储图像非常重要。考虑针对图像的‘pd.read_’函数。


笔者将举一个简单的例子。请看下图:


640?wx_fmt=png


这是一张数字8的图像,仔细观察就会发现,图像是由小方格组成的。这些小方格被称为像素。


但是要注意,人们是以视觉的形式观察图像的,可以轻松区分边缘和颜色,从而识别图片中的内容。然而机器很难做到这一点,它们以数字的形式存储图像。请看下图:


640?wx_fmt=png


机器以数字矩阵的形式储存图像,矩阵大小取决于任意给定图像的像素数。


假设图像的尺寸为180 x 200或n x m,这些尺寸基本上是图像中的像素数(高x宽)。


这些数字或像素值表示像素的强度或亮度,较小的数字(接近0)表示黑色,较大的数字(接近255)表示白色。通过分析下面的图像,读者就会弄懂到目前为止所学到的知识。


下图的尺寸为22 x 16,读者可以通过计算像素数来验证:


640?wx_fmt=png

图片源于机器学习应用课程


刚才讨论的例子是黑白图像,如果是生活中更为普遍的彩色呢?你是否认为彩色图像也以2D矩阵的形式存储?


彩色图像通常由多种颜色组成,几乎所有颜色都可以从三原色(红色,绿色和蓝色)生成。


因此,如果是彩色图像,则要用到三个矩阵(或通道)——红、绿、蓝。每个矩阵值介于0到255之间,表示该像素的颜色强度。观察下图来理解这个概念:


640?wx_fmt=png
图片源于机器学习应用课程


左边有一幅彩色图像(人类可以看到),而在右边,红绿蓝三个颜色通道对应三个矩阵,叠加三个通道以形成彩色图像。


请注意,由于原始矩阵非常大且可视化难度较高,因此这些不是给定图像的原始像素值。此外,还可以用各种其他的格式来存储图像,RGB是最受欢迎的,所以笔者放到这里。读者可以在此处阅读更多关于其他流行格式的信息。


640?wx_fmt=jpeg

用Python读取图像数据


下面开始将理论知识付诸实践。启动Python并加载图像以观察矩阵:


 
   
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from skimage.io import imread, imshow
image = imread('image_8_original.png', as_gray=True)
imshow(image)


640?wx_fmt=png


 
   
#checking image shape 
image.shape, image


(28,28)


640?wx_fmt=png


矩阵有784个值,而且这只是整个矩阵的一小部分。用一个LIVE编码窗口,不用离开本文就可以运行上述所有代码并查看结果。


下面来深入探讨本文背后的核心思想,并探索使用像素值作为特征的各种方法。


640?wx_fmt=jpeg

方法#1:灰度像素值特征


从图像创建特征最简单的方法就是将原始的像素用作单独的特征。


考虑相同的示例,就是上面那张图(数字‘8’),图像尺寸为28×28。


能猜出这张图片的特征数量吗?答案是与像素数相同!也就是有784个。


那么问题来了,如何安排这784个像素作为特征呢?这样,可以简单地依次追加每个像素值从而生成特征向量。如下图所示:


640?wx_fmt=png


下面来用Python绘制图像,并为该图像创建这些特征:


 
   

image = imread('puppy.jpeg', as_gray=True) 

image.shape, imshow(image)


(650,450)


640?wx_fmt=png


该图像尺寸为650×450,因此特征数量应为297,000。可以使用NumPy中的reshape函数生成,在其中指定图像尺寸:


 
   
#pixel features


features = np.reshape(image, (660*450))


features.shape, features


(297000,)
array([0.96470588, 0.96470588, 0.96470588, ..., 0.96862745, 0.96470588,
       0.96470588])


这里就得到了特征——长度为297,000的一维数组。很简单吧?在实时编码窗口中尝试使用此方法提取特征。


但结果只有一个通道或灰度图像,对于彩色图像是否也可以这样呢?来看看吧!


640?wx_fmt=jpeg

方法#2:通道的平均像素值

在读取上一节中的图像时,设置了参数‘as_gray = True’,因此在图像中只有一个通道,可以轻松附加像素值。下面删除参数并再次加载图像:


 
   
image = imread('puppy.jpeg') 
image.shape


(660, 450, 3)


这次,图像尺寸为(660,450,3),其中3为通道数量。可以像之前一样继续创建特征,此时特征数量将是660*450*3 = 891,000。


或者,可以使用另一种方法:


生成一个新矩阵,这个矩阵具有来自三个通道的像素平均值,而不是分别使用三个通道中的像素值。


下图可以让读者更清楚地了解这一思路:


640?wx_fmt=png


这样一来,特征数量保持不变,并且还能考虑来自图像全部三个通道的像素值。


 
   
image = imread('puppy.jpeg')
feature_matrix = np.zeros((660,450)) 
feature_matrix.shape


(660, 450)


现有一个尺寸为(660×450×3)的三维矩阵,其中660为高度,450为宽度,3是通道数。为获取平均像素值,要使用for循环:


 
   
for i in range(0,iimage.shape[0]):
    for j in range(0,image.shape[1]):
        feature_matrix[i][j] = ((int(image[i,j,0]) + int(image[i,j,1]) + int(image[i,j,2]))/3)


新矩阵具有相同的高度和宽度,但只有一个通道。现在,可以按照与上一节相同的步骤进行操作。依次附加像素值以获得一维数组:


 
   
features = np.reshape(feature_matrix, (660*450)) 
features.shape


(297000,)


640?wx_fmt=jpeg

方法#3:提取边缘特征


请思考,在下图中,如何识别其中存在的对象:


640?wx_fmt=png


识别出图中的对象很容易——狗、汽车、还有猫,那么在区分的时候要考虑哪些特征呢?形状是一个重要因素,其次是颜色,或者大小。如果机器也能像这样识别形状会怎么样?


类似的想法是提取边缘作为特征并将其作为模型的输入。稍微考虑一下,要如何识别图像中的边缘呢?边缘一般都是颜色急剧变化的地方,请看下图:


640?wx_fmt=png


笔者在这里突出了两个边缘。这两处边缘之所以可以被识别是因为在图中,可以分别看到颜色从白色变为棕色,或者由棕色变为黑色。如你所知,图像以数字的形式表示,因此就要寻找哪些像素值发生了剧烈变化。


假设图像矩阵如下:


640?wx_fmt=png
图片源于机器学习应用课程


该像素两侧的像素值差异很大,于是可以得出结论,该像素处存在显著的转变,因此其为边缘。现在问题又来了,是否一定要手动执行此步骤?


当然不!有各种可用于突出显示图像边缘的内核,刚才讨论的方法也可以使用Prewitt内核(在x方向上)来实现。以下是Prewitt内核:


640?wx_fmt=png


获取所选像素周围的值,并将其与所选内核(Prewitt内核)相乘,然后可以添加结果值以获得最终值。由于±1已经分别存在于两列之中,因此添加这些值就相当于获取差异。


640?wx_fmt=png


还有其他各种内核,下面是四种最常用的内核:


640?wx_fmt=png
图片源于机器学习应用课程


现在回到笔记本,为同一图像生成边缘特征:


 
   
#importing the required libraries
import numpy as np
from skimage.io import imread, imshow
from skimage.filters import prewitt_h,prewitt_v
import matplotlib.pyplot as plt
%matplotlib inline


#reading the image 
image = imread('puppy.jpeg',as_gray=True)


#calculating horizontal edges using prewitt kernel
edges_prewitt_horizontal = prewitt_h(image)
#calculating vertical edges using prewitt kernel
edges_prewitt_vertical = prewitt_v(image)


imshow(edges_prewitt_vertical, cmap='gray')


640?wx_fmt=png

640?wx_fmt=jpeg

推荐阅读专题


640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png


640?wx_fmt=jpeg

留言 点赞 发个朋友圈

我们一起分享AI学习与发展的干货


编译组:李世琛、余书敏

相关链接:

https://www.analyticsvidhya.com/blog/2019/08/3-techniques-extract-features-from-image-data-machine-learning-python/

如需转载,请后台留言,遵守转载规范


推荐文章阅读



长按识别二维码可添加关注

读芯君爱你


640?wx_fmt=gif

  • 20
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像特征提取是指从图像数据提取出具有代表性的特征,以便用于机器学习和计算机视觉任务。在Python,有多种技术可以用于图像特征提取。 一种常用的技术是使用卷积神经网络(Convolutional Neural Networks,CNN)。CNN可以通过多层卷积和池化操作来提取图像的局部特征,并通过全连接层将这些特征组合起来形成最终的特征表示。你可以使用Python的深度学习库,如TensorFlow或PyTorch,来构建和训练CNN模型。 另一种常用的技术是使用传统的图像处理方法,如边缘检测、颜色直方图、纹理特征等。你可以使用Python图像处理库,如OpenCV或scikit-image,来实现这些方法。 还有一种技术是使用预训练的卷积神经网络模型,如VGG、ResNet或Inception等。这些模型已经在大规模图像数据上进行了训练,并且可以提取出具有较高表达能力的特征。你可以使用Python的深度学习库来加载这些预训练模型,并使用它们提取图像特征。 总之,图像特征提取是一个重要的任务,可以帮助我们从图像数据提取出有用的信息。在Python,你可以使用CNN、传统的图像处理方法或预训练的卷积神经网络模型来实现图像特征提取。 #### 引用[.reference_title] - *1* [利用python图像数据提取特征三种技术](https://blog.csdn.net/cmdxly/article/details/108862464)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [初学者福利三种Python图像数据提取特征技术](https://blog.csdn.net/duxinshuxiaobian/article/details/102386986)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值