↑↑↑关注后"星标"Datawhale
每日干货 & 每月组队学习,不错过
Datawhale干货
作者:谢雨飞,趣头条算法工程师
图像特征主要有图像的颜色特征、纹理特征、形状特征和空间关系特征。人眼可以看到图像这种视觉信息,但这种信息并不能让计算机“看见”,即计算机并不能处理这种信息。
想要让计算机“看见”,就要求我们将图像的视觉信息转化成计算机能够识别和处理的定量形式。这就是图像特征提取,传统的特征提取方法分为两个类别,分别是基于结构形态的特征提取与基于几何分布的特征提取。
基于结构形态的特征提取
通常情况下,基于结构形态的特征有两类表示方法,一类是轮廓特征,另一类是区域特征。基于结构形态的特征提取方法主要是将字符图像的结构形态转化为特征向量,主要包括边界特征法、傅里叶特征算子法、形状不变矩法以及几何参数法。
边界特征法
边界特征法,顾名思义,该方法主要关注的是图像边界部分的特征。其中,霍夫变换法和边界方向直方图法是两种最典型的边界特征法。
1. 霍夫变换
原始图像坐标系下的一个点对应于参数坐标系中的一条直线,反之,参数坐标系下的一条直线对应于原始图像坐标系下的一个点。然后,将原始图像坐标系下的各个点都投影到参数坐标系之后,会发现有聚集的点,这些聚集的点组成了原始坐标系下的直线。
下面我们给出一个小例子,通过霍夫变换来检测图片中的直线。
原始图片
具体代码如下:
#coding=utf-8
import cv2
import numpy as np
im = cv2.imread('hough.png')
edges = cv2.Canny(im, 50, 150, apertureSize=3)
result = im.copy()
minLineLength = 10
maxLineGap = 30
lines = 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-8
import cv2
image = 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. 傅里叶形状描述子
当确定了图像中的目标区域的起始点以及方向之后,我们就可以利用一系列的坐标对来描述边界的信息了。假设边界上有 个边界点,起始点为 ,按照顺时针方向可以表示为一个坐标序列:
一般来说,如果我们将目标边界看成是从某一个点出发,则沿着该边界顺时针旋转一周的周边长可以用一个复函数来表示。换句话说就是,边界上点的坐标可以用如下复数来表示:
通过这种方式,可以成功地将坐标序列的二维表示转换为一维表示。对于复数 ,可以用一个一维离散傅里叶变换系数 来表示:
这里的 是图像边界的傅里叶描述子。同理,如果对