图像特征主要有图像的颜色特征、纹理特征、形状特征和空间关系特征。人眼能够看到图像这种视觉信息,但这种信息并不能让计算机“看见”,即计算机并不能处理这种信息。

想要让计算机“看见”,就要求咱们将图像的视觉信息转化成计算机可以识别和处理的定量形式。这就是图像特征提取,传统的特征提取方法分为两个类别,分别是基于结构形态的特征提取与基于几何分布的特征提取。算法

基于结构形态的特征提取

一般状况下,基于结构形态的特征有两类表示方法,一类是轮廓特征,另外一类是区域特征。基于结构形态的特征提取方法主要是将字符图像的结构形态转化为特征向量,主要包括边界特征法、傅里叶特征算子法、形状不变矩法以及几何参数法。

app

边界特征法ide

边界特征法,顾名思义,该方法主要关注的是图像边界部分的特征。其中,霍夫变换法和边界方向直方图法是两种最典型的边界特征法。函数

1. 霍夫变换spa

原始图像坐标系下的一个点对应于参数坐标系中的一条直线,反之,参数坐标系下的一条直线对应于原始图像坐标系下的一个点。而后,将原始图像坐标系下的各个点都投影到参数坐标系以后,会发现有汇集的点,这些汇集的点组成了原始坐标系下的直线。

3d

下面咱们给出一个小例子,经过霍夫变换来检测图片中的直线。code

原始图片orm

具体代码以下:blog

#coding=utf-8import cv2import numpy as npim = cv2.imread('hough.png')edges = cv2.Canny(im, 50, 150, apertureSize=3)result = im.copy()minLineLength = 10maxLineGap = 30lines = cv2.HoughLinesP(edges, 1, np.pi/180, 200, minLineLength, maxLineGap)for x1, y1, x2, y2 in lines[0]:    cv2.line(result, (x1, y1), (x2, y2), (0, 0, 255), 2)cv2.imwrite("hough_result.png", result)

2. 边界方向直方图

首先利用常见的图像边缘检测算子求得图像的边缘,而后作出关于边缘大小和方向的直方图。一般的方法是构造图像灰度梯度方向矩阵。

图像边缘检测。经常使用的边缘检测算子有Laplacian算子、Sobel算子、Prewitt算子、Canny算子等。一幅图像是由不少个离散的像素点组成的,上面提到的这些算子将经过差分的方式来近似偏导数的值。其中,Canny算子是效果较好的一种图像边缘检测算子。它分为两个阶段,首先对图像进行高斯平滑,而后对平滑以后的图像进行Roberts算子运算。

Canny边缘检测算子主要包括如下四个步骤。图片

用高斯滤波器对图像进行平滑处理。

用一阶偏导的有限差分来计算梯度的幅值和方向。

对梯度的幅值进行非极大值抑制处理。

用双阈值算法检测和链接图像的边缘。

如下图(图左为原图,图右为灰度图)所示,给出Canny边缘检测算子的代码。

Canny算子进行图像边缘检测的具体代码:

#coding=utf-8import cv2image = cv2.imread("lena.jpg")image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)#Canny边缘检测canny = cv2.Canny(image, 30, 150)cv2.imwrite("Canny.jpg", canny)

上述代码输出结果如图所示:

傅里叶特征算子法

傅里叶特征算子,又称傅里叶形状描述子,主要做用是经过对目标边界的轮廓进行离散傅里叶变换获得目标边界形状的定量表达。

1. 离散傅里叶变换

离散傅里叶变换是图像处理中经常使用的一种变换手段。经过离散傅里叶变换,咱们能够将图像的信号从时域转换到频域。

2. 傅里叶形状描述子当肯定了图像中的目标区域的起始点以及方向以后,咱们就能够利用一系列的坐标对来描述边界的信息了。假设边界上有个边界点,起始点为,按照顺时针方向能够表示为一个坐标序列:

通常来讲,若是咱们将目标边界当作是从某一个点出发,则沿着该边界顺时针旋转一周的周边长能够用一个复函数来表示。换句话说就是,边界上点的坐标能够用以下复数来表示:

经过这种方式,能够成功地将坐标序列的二维表示转换为一维表示。对于复数

,能够用一个一维离散傅里叶变换系数

来表示:

这里的

是图像边界的傅里叶描述子。同理,若是对

进行傅里叶反变换,则能够获得最开始的坐标序列的表达式(仅选取前

傅里叶变换系数近似):

低阶系数表示的是边界的大体形状,高阶系数表示的是边界的细节特征。傅里叶描述子在描述边界时,对旋转、平移、尺度变化等均不敏感。

下面咱们给出对图左作傅里叶变换,效果如图右:

代码以下:

#coding=utf-8import cv2import numpy as np#直接读为灰度图像img = cv2.imread('fuliye.png', 0)f = np.fft.fft2(img)fshift = np.fft.fftshift(f)#先取绝对值,表示取模。再取对数,将数据范围变小magnitude_spectrum = 20*np.log(np.abs(fshift))cv2.imwrite("original.jpg", img)cv2.imwrite("center.jpg", magnitude_spectrum)

形状不变矩法

形状不变矩法的主要思想是将对变换不敏感的、基于区域的几何矩特征做为形状特征。之因此称之为“不变矩”,是由于矩特征在旋转、平移、尺度缩放的环境下都不会发生改变。

1. 矩的定义

对于二维连续函数,阶矩的定义以下:

上式中的和能够取全部的天然数,因此上式构建了一个矩的集合,且集合与函数具备惟一性。

为了更方便地描述物体的形状,咱们假设函数是一个二值函数,即该函数在目标物体上的取值为1,在背景上的取值为0。不区分目标物体内部的灰度,参数称为矩的阶。特别地,当时,获得零阶矩。零阶矩的几何意义是表示物体的面积,即:当时,表示物体上全部点的坐标的总和;当时,表示物体上全部点的坐标的总和,则一个物体的质心坐标为:

接下来,咱们给出中心矩的定义:

若是是离散函数,则中心矩的表达式为:

在此基础上,归一化的中心矩的定义以下:

2. 不变矩

根据归一化以后的中心矩,对旋转、平移、尺度等都不敏感的七个不变矩。下面咱们对同一幅图像,分别进行尺度缩小为原始图像的一半、逆时针旋转5度操做以及垂直镜像变换的操做,分别求出原始图像及变换后的各个图像的七阶矩。能够得出,这七阶矩的值对于尺度、旋转及镜像变换不敏感。程序代码以下:

import cv2from datetime import datetimeimport numpy as npnp.set_printoptions(suppress=True)def my_humoments(img_gray):moments = cv2.moments(img_gray)humoments = cv2.HuMoments(moments)#取对数humoments = np.log(np.abs(humoments))print(humoments)if __name__ == '__main__':t1 = datetime.now()fp = 'lena.jpg'img = cv2.imread(fp)#缩放h,w,_ = img.shapeimg = cv2.resize(img, (h/2, w/2), cv2.INTER_LINEAR)img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)cv2.imwrite("scale.jpg",img_gray)#旋转(h, w) = img.shape[:2]center = (w // 2, h // 2)M = cv2.getRotationMatrix2D(center, 5, 1.0)img = cv2.warpAffine(img, M, (w, h))img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)cv2.imwrite("rotate.jpg", img_gray)#垂直镜像img = cv2.flip(img, 0, dst=None)img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)cv2.imwrite("flip.jpg",img_gray)my_humoments(img_gray)

原始图像(图左为原图,图右为其灰度图):

程序运行后结果以下:

几何参数法

几何参数法主要包括像素与邻域、位置、方向、距离、区域周长和区域面积。

1. 像素与邻域

一幅图像中,位于坐标处的像素有4个相邻的像素,分别位于其上下左右,坐标分别为,以下图所示。

有时咱们不只须要某个像素点周围4个像素的值,并且须要其周围8个像素的值,此时8个点的坐标分别为、、、、、、、,以下图所示。

2. 位置

目标在图片中的位置有两种表达方式,一种叫质心即目标质量的中心,另外一种叫形心即目标形状的中心。对于一个大小的目标,假设其灰度值大小为,则质心公式以下:

形心公式以下:

3. 方向

像圆形这样的图形,很难定义它的方向。通常地,咱们在定义方向的时候,为了保证惟一性,事先假定物体的形状是长方形,它的长边即物体的方向。

4. 距离

在图像处理领域,经常使用的距离公式包括欧几里得距离、4邻域距离以及8邻域距离。假设两个点的坐标分别为、,则AB两点之间的距离公式以下:

欧几里得距离(欧氏距离)

4邻域距离

8邻域距离

5. 区域周长

图像中某个区域的周长的计算方式有三种,具体以下:

区域的周长能够用区域边界所占的面积表示,能够认为是边界的像素点数量。

若是将像素当作是一个个单独的点,那么区域的周长就能够认为是区域的边界8链码的长度。

若是将像素当作是图像中一个个单位面积的小方格,那么可认为区域和背景都是由方格组成的。区域的周长就能够定义为区域和背景的交界线的长度。

6. 区域面积

对于二值图来讲,区域的面积能够简单地定义为目标物所占像素点的数量,即区域的边界内包含的像素点的个数。区域面积的计算公式以下:

基于几何分布的特征提取

基于几何分布的特征提取方法大体能够分为两类,一类是二维直方图投影法,另外一类区域网格统计法。

二维直方图投影法

几何分布特征提取方法的表明之一就是二维直方图投影法,也就是获取水平以及竖直方向上各行、列黑色像素累计分布的结果,以下图所示。

因为图片通过归一化后,长宽相对固定,例如32×36像素的二值字符“3”以下图左所示。通常二维直方图投影法对图像的扫描顺序为从上到下、从左往右,因此获得的对应数字矩阵以下图右所示。

在水平方向和竖直方向分别对原图进行投影,而后分别按照行列方向统计黑色像素的值且进行归一化,最终获得特征向量。以图3-24a的二值字符“3”为例,能够获得68维的特征向量值,以下表所示。

区域网格统计法区域网格统计法是另外一种常见的基于几何分布的特征提取方法。其主要思想是先利用一个的网格将原图进行分割,而后按从上至下、从左至右的顺序依次统计每个网格中“1”的个数,从而获得最终的特征向量。以上面的二值字符“3”为例,咱们用一个3×4的网格对其进行分割,获得的结果以下图所示。

最终获得的96维特征向量以下表所示。

php 提取图片的特征,让机器“看见”:图像数据的特征提取方法相关推荐

  1. 让机器“看见”:图像数据的特征提取方法

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:谢雨飞,趣头条算法工程师 图像特征主要有图像的颜色特征.纹理特征. ...

  2. c++读取图片_Pytorch读取,加载图像数据(一)

    Pytorch读取,加载图像数据(一) 在学习Pytorch的时候,先学会如何正确创建或者加载数据,至关重要. 有了数据,很多函数,操作的效果就变得很直观. 本文主要用其他库读取图像文件(学会这个,你 ...

  3. 图像数据的特征提取方法

    图像特征主要有图像的颜色特征.纹理特征.形状特征和空间特征.传统的特征提取方法分为两个类别,分别是基于结构形态的特征提取与基于几何分布的特征提取. 1.Canny算子 Canny算子是效果较好的一种图 ...

  4. 提取图像数据的特征,让机器“看见”

    来源:Datawhale 本文约3600字,建议阅读7分钟 本文介绍图像特征提取的两种方法,基于结构形态的特征提取与基于几何分布的特征提取. [ 导语 ] 人眼可以看到图像的视觉信息,包括颜色特征.纹 ...

  5. python提取图片感兴趣区域_Python+OpenCV感兴趣区域ROI提取方法

    方法一:使用轮廓 步骤1 """src为原图""" ROI = np.zeros(src.shape, np.uint8) #感兴趣区域RO ...

  6. 特征工程系列(一):特征工程的概念/特征的处理

    1 特征工程的概念 所谓数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限.那么特征工程到底是什么呢?其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用. 2 特征 ...

  7. Hadoop:大数据的特征4V

    (一)大数据特征 目前来说,大数据的特征还存在一定的争议.但按照普遍被接受的4V,即规模性(volume).多样性(variety).价值密度(value)和 高速性(velocity)进行描述. 1 ...

  8. 图像金字塔和特征金字塔

    图像金字塔 图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构.一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合.其通过梯次向下 ...

  9. 【MATLAB】机器学习:图像数据的提取与随机划分

    1.实验内容 1.根据ABERDEEN人脸数据库,FERET人脸数据库中的部分人脸图像,完成图像数据的提取,并将其随机划分为训练样本Xtrain与测试样本Xtest,同时给出训练样本的标签Xlabel ...

最新文章

  1. keepalived(2)——配置文件
  2. python 发送邮件附件及文字信息
  3. 完美运营牛帮任务平台源码 仿悬赏猫支持封装APP
  4. java 全排列 可重复_java 用递归方法求n个数的无重复全排列
  5. 【less-3】sqli-labs靶场第三关
  6. SpringBoot以jar包部署需要注意的thymeleaf页面映射问题
  7. 计算机毕业设计之java+springboot基于vue的4S店车辆管理系统
  8. SpringBoot项目:抽奖精灵
  9. DHCP报文单播/广播分析
  10. 关于局域网的一点个人理解及如何建立一个局域网的步骤
  11. 请求的操作需要提升 win10
  12. 春节入境澳门旅客料增1成 景点拥挤须提高警惕
  13. No module named 'gensim'
  14. wps在线预览接口_开发文档 - WPS在线预览 - view.wps.cn
  15. S60v5 编程环境的搭建(2)
  16. HDMI 2.1的traning流程
  17. 计算机控制系统的品质指标,过程控制系统的品质指标.PPT
  18. 程序员装机必备的十款软件
  19. 淘宝京东拼多多抖音1688苏宁淘特等关键词搜索商品API接口(关键词搜索商品API接口,关键词搜索商品列表接口,分类ID搜索商品列表接口,关键词搜索商品销量接口)
  20. 【观察】联想HPC:冠军之路,永不止步

热门文章

  1. 计算机word文例试题及答案,大学计算机考试word试题及答案
  2. 大数据hive篇_group seting解决业务问题
  3. AOP中的切点、切面、通知等
  4. JAVA手机验证码的生成简单实现
  5. Java File文件操作
  6. php无限极分类整理
  7. 【论文阅读】ICRA2021: VDB-EDT An Efficient Euclidean Distance Transform Algorithm Based on VDB Data Struct
  8. libGDX的启动类和配置
  9. 武田公布2019财年第一季度强劲业绩并上调全年指引
  10. 千万级并发实现的秘密:内核不是解决方案而是问题所在!