OpenCV的图像轮廓有一些特征,像面积、弧长(其实就是轮廓的长度)、图像矩等。
先写一下相关术语中英文参照。
轮廓contour
特征feature
面积area
弧长perimeter
图像矩image moment
通过cv2.contourArea可以求得轮廓面积。
通过一个例子来演示一下,例如,想要过滤掉那些微小琐碎的轮廓,只显示lena这幅图中面积大于500的轮廓。代码思路是将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:
area = cv2.contourArea(c)
print(area)
# 只输出面积大于500轮廓
if area<500: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输出内容如下
22757.5
10316.5
7935.0
6270.0
1317.5
1250.0
1132.0
769.0
699.5
371.5