图像表示与描述
目标
- 掌握常见的基于轮廓特征的描述
- 掌握常见的图像区域特征描述
对目标特征的测量是要利用分割结果进一步从图像中获取有用信息,为达到这个目的需要解决两个关键问题:
- 选用什么特征来描述目标(定性)
- 如何精确测量这些特征(定量)
常见的目标特征分为灰度(颜色)、几何形状和纹理特征等。
简单描述
简单描述符:边界描述
- 边界的长度:由轮廓决定
计算图像内部区域是由4-连通确定,则得到的边界是8-连通的;如果图像内部区域是由8-连通确定的,则得到的边界是4-连通的 - 计算方式:把所有的边缘点做连线,连线长度即为边界长度(内边界)
- 边界的直径:边界上相隔最远2点的距离,有时也称为图像的主轴长度:
Diam(B)=maxi,jD(pi,pj)Diam(B) = max_{i,j}D(p_i,p_j) Diam(B)=maxi,jD(pi,pj)
链码: - 链码用于表示由顺序连接的具有指定长度的方向的直线段组成的边界线
- 方向基于线段的4或8连接,可编码为0-3或0-7
- 每段的方向使用数字编号方法进行编码
用这种方法就可以用一串数字组成的链码表示边界线
链码问题:
- 由于起点的不同,造成编码的不同
- 由于角度的不同,造成编码的不同
解决: - 使用链码的差分代替码字本身
循环差分链码
用相邻链码的差代替链码,例如:
4-链码 10103322
循环差分为:33133030
计算方式为:
1-2 = -1(3) | 3 - 0 = 3 |
---|---|
0 - 1 = -1(3) | 3 - 3 = 0 |
1 - 0 = 1 | 2 - 3 = -1(3) |
0 - 1 = -1(3) | 2 - 2 = 0 |
形状数
定义为最小循环首差链码
如上例 形状数:03033133
形状数序号n的定义:形状数表达形式中的位数。
上例序号为8。对于封闭边界,序号一定是偶数
曲率
定义弧的曲率为
k=∣ΔαΔs∣,Δα为圆心角,Δs为弧长k = |{\frac{\Delta\alpha}{\Delta s}}|,\Delta\alpha为圆心角,\Delta s为弧长 k=∣ΔsΔα∣,Δα为圆心角,Δs为弧长
由于数字图像是离散点,计算曲率需要采用近似:用相邻边界线段(描述为直线)的斜率差作为在边界线交点处的曲率描述子。
如图交点a处的曲率为:K=k1−k2K = k_1 - k_2K=k1−k2
简单描述符
- 区域面积:区域包含的像素数
- 区域重心:
x=1A∑x,y∈Rxy=1A∑x,y∈Ryx = \frac{1}{A}\sum_{x,y\in R}x\\ y = \frac{1}{A}\sum_{x,y\in R}y x=A1x,y∈R∑xy=A1x,y∈R∑y
区域重心可能不是整数
简单描述符:区域灰度特性 - 平均灰度:g‾=∑x,y∈Rf(x,y)\overline{g} = \sum_{x,y\in R}f(x,y)g=∑x,y∈Rf(x,y)
- 最大灰度,最小灰度,灰度中值
- 灰度方差:σ2=1N∑x,y∈R(x−g‾)2\sigma^2 = \frac{1}{N}\sum_{x,y\in R}(x-\overline{g})^2σ2=N1∑x,y∈R(x−g)2
形状描述符 - 形状参数:F=∣∣B∣∣24πAF = \frac{||B||^2}{4\pi A}F=4πA∣∣B∣∣2,B为区域边界长度,A为区域面积,圆形F=1,其它F>1
- 圆形性:设边界上点到区域中心的平均距离μR=1K∑(xi,yi)∈E(R)∣∣(xi,yi)−(x‾,y‾)∣∣\mu_R = \frac{1}{K}\sum_{(x_i,y_i)\in E(R)}||(x_i,y_i)-(\overline x,\overline y)|| μR=K1(xi,yi)∈E(R)∑∣∣(xi,yi)−(x,y)∣∣
距离方差
σR2=1K∑(xi,yi)∈E(R)(∣∣(xi,yi)−(x‾,y‾)∣∣−μR)2\sigma_R^2 = \frac{1}{K}\sum_{(x_i,y_i)\in E(R)}(||(x_i,y_i)-(\overline x,\overline y)||-\mu_R )^2 σR2=K1(xi,yi)∈E(R)∑(∣∣(xi,yi)−(x,y)∣∣−μR)2
则区域圆形性定义为C=μRσR2C = \frac{\mu_R}{\sigma_R^2}C=σR2μR - 形状描述符计算实例:
计算结果相同,形状未必相同
欧拉数 - 欧拉数:E = C - H
等于区域联通数量减去孔的数量
- 上述4个字符的欧拉数分别为:-1,2,1,0
总结
- 通过链码及曲率等可以描述基于图像轮廓的特征
- 常见的图像区域特征描述包括面积、形状参数、圆形性、欧拉数等
图像表示与描述II
目标
- 掌握最小包围矩形及拟合椭圆描述
- 掌握图像的D-P多边形描述
- 了解图像的不变矩描述
一般化描述
- 最小包围矩形(MER)
- 离心率:最长弦A与垂直于A的最长弦B的长度比(主次轴之比)
- 椭圆拟合
F(a→,x→)=a→⋅x→=ax2+bxy+cy2+dx+ey+f=0F(\overrightarrow a,\overrightarrow x) =\overrightarrow a\cdot \overrightarrow x = ax^2 + bxy + cy^2 + dx + ey + f = 0 F(a,x)=a⋅x=ax2+bxy+cy2+dx+ey+f=0 - 投影
对区域进行水平投影和垂直投影,投影结果与对应区域大小有关 - 多边形拟合与D-P算法
先在边界上任取两个点,然后找区域边界线上离两点对应直线最远的点,不停找下去,指定符合要求。
不变矩
- 首先定义归一化的不变矩
图像f(x,y)f(x,y)f(x,y)的p+qp+qp+q阶矩定义为:
mpq=∑(xi,yi)∈RxiPyiPf(xi,yi)m_{pq} = \sum_{(x_i,y_i)\in R}x_i^Py_i^Pf(x_i,y_i) mpq=(xi,yi)∈R∑xiPyiPf(xi,yi)
p=0,q=0 | 面积 |
---|---|
p=1,q=0 | x方向的重心 |
f(x,y)f(x,y)f(x,y)的p+qp+qp+q阶中心距定义为:
μpq=∑(xi,yi)∈R(x−x‾)p(y−y‾)qf(xi,yi)\mu_{pq} = \sum_{(x_i,y_i)\in R}(x-\overline x)^p(y-\overline y)^qf(x_i,y_i) μpq=(xi,yi)∈R∑(x−x)p(y−y)qf(xi,yi)
其中x‾=m10m00\overline x=\frac{m_{10}}{m_{00}}x=m00m10,y‾=m01m00\overline y=\frac{m_{01}}{m_{00}}y=m00m01,即前面定义的重心。
f(x,y)f(x,y)f(x,y)的归一化中心矩定义为:
ηpq=μpqμpqγ,γ=p+q2+1,p+q⩾2\eta_{pq} = \frac{\mu_{pq}}{\mu_{pq}^\gamma },\gamma = \frac{p+q}{2}+1,p+q\geqslant 2 ηpq=μpqγμpq,γ=2p+q+1,p+q⩾2
- 然后定义不变矩
常用的有七个不变矩,即对平移、旋转和尺度变化保持不变。这些可由归一化的二阶和三阶中心距得到:
ϕ1=η20+η02ϕ2=(η20−η02)2+4η112ϕ3=(η30−3η12)2+(3η21−η03)2ϕ4=(η30+η12)2+(η21+η03)2\phi_1 = \eta_{20} + \eta_{02} \\ \phi_2 = (\eta_{20} - \eta_{02})^2 + 4\eta_{11}^2 \\ \phi_3 = (\eta_{30}-3\eta_{12})^2 + (3\eta_{21}-\eta_{03})^2\\ \phi_4 = (\eta_{30}+\eta_{12})^2+(\eta_{21}+\eta_{03})^2 ϕ1=η20+η02ϕ2=(η20−η02)2+4η112ϕ3=(η30−3η12)2+(3η21−η03)2ϕ4=(η30+η12)2+(η21+η03)2
总结
掌握图像的最小外接矩形、投影、不变矩等特征,并了解直观几何意义
图像表示与描述实战演练
目标
使用OpenCV的轮廓描述函数实现区域特征分析
- 找到目标轮廓函数
void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = point());
#image:单通道图像矩阵,可以是灰度图,但更经常是边缘检测算子处理过的二值图像
#contours:定义为"vector<vector<Point>>contours",是一个轮廓列表;
#hierachy:存在嵌套轮廓时,分别为第i个轮廓的后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号;
#mode:定义轮廓的检索模式,包括CV_RETR_EXTERNAL只检测最外围轮廓,CV_RETR_LIST检测所有轮廓,但不建立等级关系等;
#method:包括CV_CHAIN_APPROX_SIMPLE仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours等;
#offset:所有的轮廓信息相对于原始图像对应的偏移量,缺省不设置。
image, contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
相关函数(Python)
- D-P法多边形拟合
approxCurve = cv2.approxPolyDP(curve, epsilon, closed[, approxCurve])
- 计算轮廓线长度
retval = cv2.arcLength(curve, closed)
- 计算轮廓面积
retval = cv2.contourArea(contour[, oriented])
- 计算轮廓包围矩形(水平的)
retval = cv2.boundingRect(array)
- 计算轮廓包围矩形(斜的)
retval = cv2.minAreaRect(points)
- 计算轮廓拟合椭圆
retval = cv2.fitElllipse(points)
- Hu矩(不变矩)
Hu = cv2.HuMoments(m[, hu])
在此之前需要使用moments计算普通矩
Retval = cv2.moments(array[, binaryImage])
- 通过不变矩比较两个形状的不同。结果越小越相似
retval = cv2.matchShapes(contour1, contour2, method, parameter)
实例:
要求:求出图中每个目标的周长、面积、拟合多边形、拟合椭圆和不变矩参数
import cv2img = cv2.imread('C:/python/img/detect_blob2.PNG')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#首先对图像进行阈值化
_, thr = cv2.threshold(gray, 1, 255, cv2.THRESH_BINARY)
cv2.imshow("Source Image", img)
cv2.imshow("Threshold image", thr)#进一步得到图像轮廓
cnts, hier = cv2.findContours(thr, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
count = 0#建立拷贝用于图像显示
disp_poly = img.copy()
disp_poly2 = img.copy()
disp_elli = img.copy()
for i in range(len(cnts)):#进行多边形逼近,得到多边形角点c = cnts[i]poly = cv2.approxPolyDP(c, 5, True) #中间的数值越大,允许的拟合误差越大poly2 = cv2.approxPolyDP(c, 1, True)cv2.polylines(disp_poly, [poly], True, (255, 255, 255), 2)cv2.polylines(disp_poly2, [poly2], True, (255, 255, 255), 2)#拟合椭圆if (len(c) > 5):ellipse = cv2.fitEllipse(c)cv2.ellipse(disp_elli, ellipse, (255, 255, 255), 2)cv2.imshow("polygon fitting result", disp_poly2)#计算Hu不变性area = cv2.contourArea(c)length = cv2.arcLength(c, True)moments = cv2.moments(c)hu = cv2.HuMoments(moments)print(i+1, " : ", "length=%.1f" %length, "area=", area,"m00=%.3f, m01=%.3f, m10=%.3f, m11=%.3f" %(hu[0],hu[1],hu[2],hu[3]))#得到对应区域包围框,并在左上角显示序号x, y, w, h = cv2.boundingRect(c)cv2.putText(disp_poly, str(i+1), (x,y), cv2.FONT_HERSHEY_PLAIN, 0.8, (0xff, 0xff, 0xff))cv2.imshow("Polygon fitting", disp_poly)
cv2.imshow("Ellipse result", disp_elli)cv2.waitKey()
cv2.destroyAllWindows()
问题
- 完成程序,实现课程所述功能
- 扩展:根据计算的数字特征,区分不同形状(方形、圆形或其它)