轮廓自身的一些属性特征及轮廓所包围对象的特征对于描述图像具有重要意义,本节介绍第一部分,包括宽高比、轮廓边界面积比、轮廓凸包面积之比、等效直径、椭圆轮廓的方向。

宽高比

可以使用宽高比(AspectRation)来描述轮廓。

宽高比 = 宽度(width)/ 高度(Height)

例:编写程序计算矩形轮廓的宽高比。

import cv2
# =====读取原始图像,二值化处理=====
o1 = cv2.imread(r'E:\Blog\OpenCV\Process\A4.png')
cv2.imshow('Original',o1)
gray1 = cv2.cvtColor(o1,cv2.COLOR_BGR2GRAY)
ret,binary1 = cv2.threshold(gray1,127,255,cv2.THRESH_BINARY)

# =====获取轮廓=====
contours,hierarchy = cv2.findContours(binary1,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
x,y,w,h = cv2.boundingRect(contours[0])  #矩形参数

cv2.rectangle(o1,(x,y),(x+w,y+h),(255,255,255),3) 

AspectRatio = float(w)/h
print(AspectRatio)
cv2.imshow('Result',o1)

cv2.waitKey()

运行结果:

1.6559139784946237
运行结果

轮廓边界面积比Extent

可以使用轮廓面积与矩形边界面积之比,来描述图像及其轮廓特征。

例:计算图像的轮廓面积与其矩形边界的面积之比。

import cv2
# =====读取原始图像,二值化处理=====
o1 = cv2.imread(r'E:\Blog\OpenCV\Process\A4.png')
cv2.imshow('Original',o1)
gray1 = cv2.cvtColor(o1,cv2.COLOR_BGR2GRAY)
ret,binary1 = cv2.threshold(gray1,127,255,cv2.THRESH_BINARY)

# =====获取轮廓=====
contours,hierarchy = cv2.findContours(binary1,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
x,y,w,h = cv2.boundingRect(contours[0])  #矩形框参数

cv2.drawContours(o1,contours[0],-1,(0,0,255),3)
cv2.rectangle(o1,(x,y),(x+w,y+h),(255,255,255),3) 

Arae = w*h  # 矩形框框的面积
cntArea = cv2.contourArea(contours[0]) #轮廓的面积
extend = float(cntArea)/Arae  #对象面积/矩形边界之比

print(extend)
cv2.imshow('Result',o1)
cv2.waitKey()

运行结果:

0.7095028627286691

轮廓凸包面积之比Solidity

可以使用轮廓面积与凸包面积之比来衡量图像轮廓及凸包的特征。

例:计算轮廓面积与凸包面积之比。

import cv2
# =====读取原始图像,二值化处理=====
o1 = cv2.imread(r'E:\Blog\OpenCV\Process\A5.png')
cv2.imshow('Original',o1)
gray1 = cv2.cvtColor(o1,cv2.COLOR_BGR2GRAY)
ret,binary1 = cv2.threshold(gray1,127,255,cv2.THRESH_BINARY)

# =====获取轮廓=====
contours,hierarchy = cv2.findContours(binary1,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(o1,contours[0],-1,(0,0,255),3)
cntArea = cv2.contourArea(contours[0]) #轮廓的面积

# =====获取凸包=====
hull = cv2.convexHull(contours[0])
hullArea = cv2.contourArea(hull) #凸包面积
cv2.polylines(o1,[hull],True,(0,255,0),2)

solidity = float(cntArea/hullArea)
print(solidity)
cv2.imshow('Result',o1)
cv2.waitKey()

运行结果:

0.7405170086393088

等效直径Equivalent Diameter

计算公式:
$$
等效直径 = \sqrt{\frac{4\times轮廓面积}{\pi}}
$$

例:计算与轮廓面积相等的圆形的直径,并绘制与该轮廓面积相等的圆。

import cv2
import numpy as np
# =====读取原始图像,二值化处理=====
o1 = cv2.imread(r'E:\Blog\OpenCV\Process\A5.png')
cv2.imshow('Original',o1)
gray1 = cv2.cvtColor(o1,cv2.COLOR_BGR2GRAY)
ret,binary1 = cv2.threshold(gray1,127,255,cv2.THRESH_BINARY)

# =====获取轮廓=====
contours,hierarchy = cv2.findContours(binary1,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(o1,contours[0],-1,(0,0,255),3)
cntArea = cv2.contourArea(contours[0]) #轮廓的面积

# =====等效直径=====
equiDiameter = np.sqrt(4*cntArea/np.pi)
print("等效直径是:",equiDiameter)

# =====等直径大小的圆=====
cv2.circle(o1,(100,100),int(equiDiameter/2),(0,0,255),3)

cv2.imshow('Result',o1)
cv2.waitKey()

结果:

等效直径是: 118.19199492800618

椭圆轮廓的方向

函数cv2.fitEllipse()可以用来构造最优拟合椭圆。还可以在返回值内分别返回椭圆的中心点、轴长、旋转角度等信息。语法:

(x, y),(MA,ma),angle = cv2.fitEllipse(cnt)
  • (x, y) : 椭圆的中心
  • (MA,ma):椭圆水平方向轴和垂直方向轴的长度
  • angle:椭圆的旋转角度

例:观察cv2.fitEllipse()的不同返回值。

import cv2

# =====读取原始图像,二值化处理=====
o1 = cv2.imread(r'E:\Blog\OpenCV\Process\A5.png')
cv2.imshow('Original',o1)
gray1 = cv2.cvtColor(o1,cv2.COLOR_BGR2GRAY)
ret,binary1 = cv2.threshold(gray1,127,255,cv2.THRESH_BINARY)

# =====获取轮廓=====
contours,hierarchy = cv2.findContours(binary1,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

# =====返回单值椭圆=====
ellipse = cv2.fitEllipse(contours[0])
retval = cv2.fitEllipse(contours[0])
print('返回单值形式:\n',retval)

# =====返回多值形式=====
(x,y),(MA,ma),angle = cv2.fitEllipse(contours[0])
print('范围三个值的形式:')
print('(x,y)=(',x,y,')')
print('(MA,ma)=(',MA,ma,')')
print('angle=',angle)

# =====绘制椭圆=====
cv2.ellipse(o1,ellipse,(0,0,255),2)
cv2.imshow('Result',o1)

cv2.waitKey()

运行结果:

返回单值形式:
((306.0049133300781, 139.68118286132812), (65.48823547363281, 316.8392639160156), 115.80592346191406)
范围三个值的形式:
(x,y)=( 306.0049133300781 139.68118286132812 )
(MA,ma)=( 65.48823547363281 316.8392639160156 )
angle= 115.80592346191406

运行结果


博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/OpenCV40.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 05 月 27 日
如果觉得我的文章对你有用,请随意赞赏