OpenCV图像轮廓(3)轮廓长度

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)

运行界面如下图

lena图像轮廓长度大于100

共有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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值