OpenCV的图像轮廓有一些特征,像面积、弧长(其实就是轮廓的长度)、图像矩等。
先写一下相关术语中英文参照。
轮廓contour
特征feature
面积area
弧长perimeter
图像矩image moment
通过cv2.arcLength可以求得轮廓弧长。
通过一个例子来演示一下,例如,想要过滤掉那些微小琐碎的轮廓,只显示lena这幅图中长度大于100的轮廓。代码思路是将findContours查找到的轮廓按照弧长排序,然后绘制。
def contour_area():
img = cv2.imread('../images/lena.jpg', cv2.IMREAD_GRAYSCALE)
ret, thresh = cv2.threshold(img, 160, 255, cv2.THRESH_BINARY)
contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 复制原图
img1 = img.copy()
# 创建一幅相同大小的白色图像
img2 = np.ones(img.shape)
# 按照面积将所有轮廓逆序排序
contours2 = sorted(contours, key=lambda a: cv2.contourArea(a), reverse=True)
for c in contours2:
l = cv2.arcLength(c)
print(l)
# 只输出长度大于100轮廓
if l<100:break
# 分别在复制的图像上和白色图像上绘制当前轮廓
cv2.drawContours(img1, [c],0, (0,255,0), 3)
cv2.drawContours(img2, [c],0, (0,255,0), 3)
plot_images(1,3,[img,img1,img2], gray=True)
运行界面如下图
共有3幅图,分别是原始图像,在原始图像上绘制了轮廓,在白色背景图上绘制了轮廓。
程序的print输出内容如下
2313.1130298376083
1705.9179517030716
584.5878736972809
551.0437185764313
363.0904004573822
340.8771973848343
294.26197242736816
277.8822498321533
228.63960921764374
197.99494767189026
183.96550989151
171.99494767189026
147.94112491607666
135.81118202209473
114.15432786941528
110.15432798862457
95.01219248771667