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

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

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

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

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

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

目录

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

2.在Python中读取图像数据

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

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

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

机器是如何存储图像的?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

用Python读取图像数据

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

import pandas as pdimport numpy as npimport matplotlib.pyplot as plt%matplotlib inlinefrom skimage.io import imread, imshowimage = imread('image_8_original.png', as_gray=True)imshow(image)
#checking image shape image.shape, image

(28,28)

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

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

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

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

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

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

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

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

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

(650,450)

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

#pixel featuresfeatures = np.reshape(image, (660*450))features.shape, features

(297000,)

array([0.96470588, 0.96470588, 0.96470588, ..., 0.96862745, 0.96470588,

0.96470588])

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

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

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

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

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

(660, 450, 3)

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

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

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

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

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

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,)

方法#3:提取边缘特征

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

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

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

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

假设图像矩阵如下:

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

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

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

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

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

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

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

#importing the required librariesimport numpy as npfrom skimage.io import imread, imshowfrom skimage.filters import prewitt_h,prewitt_vimport matplotlib.pyplot as plt%matplotlib inline#reading the image image = imread('puppy.jpeg',as_gray=True)#calculating horizontal edges using prewitt kerneledges_prewitt_horizontal = prewitt_h(image)#calculating vertical edges using prewitt kerneledges_prewitt_vertical = prewitt_v(image)imshow(edges_prewitt_vertical, cmap='gray')

留言 点赞 关注

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

编译组:李世琛、余书敏

相关链接:

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

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

halcon边缘提取颜色相近_初学者福利!三种用Python从图像数据中提取特征的技术...相关推荐

  1. python处理表格数据教程_代码详解:使用Python从不同表格中提取数据

    常用的表格数据存储文件格式--CSV,Microsoft Excel,Google Excel . Python通常称为粘合语言.这个名称归因于人们逐渐开发出的大量接口库和特征,也得益于广泛的使用和良 ...

  2. 爬动漫网站数据_通过这三种动漫爱上数据科学和技术

    爬动漫网站数据 Yes, it might seem weird to mention anime, data science, and technology in the same breath. ...

  3. arduino开关控制RGB三色小灯程序,按一下亮一个颜色,松开熄灭,三种不同颜色,程序代码,以及连线图。

    arduino 接线 代码: int redPin= 9; int greenPin = 10; int bluePin = 11; int button = 2; // 定义按键位管脚 int bu ...

  4. python批处理栅格转点_三种利用Python批量处理地理数据的方法——以栅格数据投影转换为例...

    时至今日,笔者已经总结了三种用Python语言结合ArcGIS10.2提供的接口去批量处理地理数据的方法.即: 1. 用IDLE.Python Tools for Visual Studio等去编写独 ...

  5. 三种最典型的大数据存储技术路线

    三种最典型的大数据存储技术路线 近期由中关村大数据产业联盟举办的"大数据100分"线上研讨会中,南大通用的CTO.资深业界专家武新博士同众多网友分享了底层数据处理技术的发展趋势和正 ...

  6. 【ArcGIS遇上Python】三种利用Python批量处理地理数据的方法——以栅格数据投影转换为例

    时至今日,笔者已经总结了三种用Python语言结合ArcGIS10.x提供的接口去批量处理地理空间数据的方法.即: 1. 用IDLE.Python Tools for Visual Studio等去编 ...

  7. 高光谱数据集_文献选读|从地面和空间高光谱数据中提取红边位置参数,以估算水稻冠层叶氮含量...

    点击蓝字 关注我们 为了实现水稻施肥的精确管理,对作物氮素状态进行无损实时监测,我们从地面和空间数据中对红边区域的反射光谱进行了表征,并对红边位置之间的关系进行了量化(REP)来自不同算法和田间水稻( ...

  8. python判断字符串合法,详解Python判定IP地址合法性的三种方法 python中判断一个字符串是否是IP地址...

    html 中 鼠标放在标签上会显示小手状,其它标签在其他标签上,美工给加了一些样式,鼠标放上去也显示小手状.有哪位大手状样式 有什么不懂的前端问题可以去菜鸟驿站.全都是泡沫,只一刹的花火,所谓的友情, ...

  9. 怎么从pdf中提取图片?三招告诉你如何从pdf中提取图片

    众所周知,PDF的格式对于一些重要文件的保存,以及隐私文件的保护来说都是非常好用的.同时,如果要将PDF格式的文件转换成其它格式的文件也挺方便的.因此,PDF格式在日常办公中具有较高的使用率.那么我们 ...

最新文章

  1. 【Android】Android程序自己主动更新
  2. 第18届浙江大学校赛 Mergeable Stack
  3. 电子科大专科c语言作业1,电子科大15春《C语言(专科)》在线作业试卷.docx
  4. JAVA出现空指针异常(初学者)
  5. ASP.NET Web API中的返回值
  6. ionic 安卓apk签名_安卓 APP 三代加壳方案的研究报告
  7. 【C】define宏展开 typedef类型重命名
  8. Ansible文件内容修改lineinfile模块(学习笔记五)
  9. 敏感词库 包含中英文
  10. GIS中的矢量数据、栅格数据
  11. 微信小程序轮子 - 外卖点餐左右联动界面完整源码(类似美团饿了么点餐界面)
  12. Vue基础知识总结 13:从零开始搭建Vue项目
  13. token干什么用_什么是Token?Token有什么用处?为什么使用它?Token认证又是什么?...
  14. 英语音标、发音技巧、浊化规则
  15. 如何获取量化交易历史复权数据?
  16. dataframe新增一列的方法
  17. java filter 重定向_在Filter的doFilter中进行重定向 出现异常
  18. fx5u怎么与计算机通讯,两个FX5U系列PLC如何用RS485进行通信幻灯片
  19. 我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。 现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素
  20. 拉格朗日松弛与拉格朗日分解 lagrangian relaxation

热门文章

  1. texshop 使用技巧
  2. Ubuntu16.04 安装有道词典
  3. Windows下VC++显示UTF-8编码中文
  4. Android:自定义标题栏
  5. 痛苦的vsftpd配置
  6. (转)初识suse——linux
  7. SAP中Search help的使用
  8. 三种跨线程控件访问方法
  9. Django+Scrapy结合使用并爬取数据入库
  10. 在使用springMVC时,页面报的404异常