opencv+python 提取国徽轮廓

简单的说,就是最近需要做图像处理相关的项目,之前没关注过这个领域,突然接触,还是很多细节思路不明白,中间想了很多临时方案,解决过程,最后探索的结果是用不上,不过也有部分东西可以留下思路作为借鉴。

图像提取轮廓,庆幸找到用 Python 和 OpenCV 检测图片上的条形码这篇文章,学了一些处理的思路和方法。这个也是整个处理过程的基础。这里简单说一个探索过程,就是提取轮廓,目标国徽。

opencv版本不一样,用到的api还是有区别的,这里用到的版本是2.4.13

截取一张国徽照片,参考上面的文章,先做灰度,模糊,二值化,再做闭运算,之后4次腐蚀,4次膨胀,之后查找轮廓,在原图画一个轮廓,看起来不是很理想。

def get_guohui2():
    #获取国徽轮廓
    img = cv2.imread("pic/guohui0.jpg")
    
    #灰度
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    #模糊
    blurred = cv2.blur(gray, (9, 9))
    #二值化
    (_, thresh) = cv2.threshold(blurred, 127, 255, cv2.THRESH_BINARY)
    cv2.imshow("image", thresh)
    cv2.waitKey(0)
    
    #闭运算
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (40, 20))
    close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

    # perform a series of erosions and dilations
    #腐蚀、膨胀
    close = cv2.erode(close, None, iterations = 4)
    close = cv2.dilate(close, None, iterations = 4)
    
    cv2.imshow("image", close)
    cv2.waitKey(0)
    
    #查找轮廓
    (contours, _) = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    
    cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
    
    cv2.imshow("image", img)
    cv2.waitKey(0)

后面改了先开运算再闭运算,再调整一些参数,看起来效果好多了

def get_guohui2():
    #获取国徽轮廓
    img = cv2.imread("pic/guohui0.jpg")
    
    #灰度
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    #模糊
    blurred = cv2.blur(gray, (3, 3))
    #二值化
    (_, thresh) = cv2.threshold(blurred, 127, 255, cv2.THRESH_BINARY)
    cv2.imshow("image", thresh)
    cv2.waitKey(0)
    
    #开运算
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 25))
    open = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)

    # perform a series of erosions and dilations
    #腐蚀、膨胀
    open = cv2.erode(open, None, iterations = 4)
    open = cv2.dilate(open, None, iterations = 4)
    
    cv2.imshow("image", open)
    cv2.waitKey(0)
    
    #闭运算
    close = cv2.morphologyEx(open, cv2.MORPH_CLOSE, kernel)
    cv2.imshow("image", close)
    cv2.waitKey(0)
    
    #查找轮廓
    (contours, _) = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    
    cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
    
    cv2.imshow("image", img)
    cv2.waitKey(0)

但是还有一些缺陷,不够完整,后面想到,可能是边缘不够明显,于是找了怎么锐化边缘,找到OpenCV图像处理 空间域图像增强(图像锐化 1 基于拉普拉斯算子)。里面都是C++的代码,参考了一下,用了矩阵,小改就完成了。锐化后没做模糊操作。

def get_guohui2():
    #获取国徽轮廓
    img = cv2.imread("pic/guohui0.jpg")
    
    #锐化操作
    kernel = np.matrix('0 -1 0; -1 5 -1; 0 -1 0')
    dst = cv2.filter2D(img,-1,kernel)

    cv2.imshow("Result", dst)
    cv2.waitKey(0)
    
    #灰度
    gray = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY)
    
    #二值化
    (_, thresh) = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
    cv2.imshow("image", thresh)
    cv2.waitKey(0)
    
    #开运算
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 25))
    open = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)

    # perform a series of erosions and dilations
    #腐蚀、膨胀
    open = cv2.erode(open, None, iterations = 4)
    open = cv2.dilate(open, None, iterations = 4)
    
    cv2.imshow("image", open)
    cv2.waitKey(0)
    
    #闭运算
    close = cv2.morphologyEx(open, cv2.MORPH_CLOSE, kernel)
    cv2.imshow("image", close)
    cv2.waitKey(0)
    
    #查找轮廓
    (contours, _) = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    
    area = cv2.contourArea(contours[0])
    print area
    
    cv2.drawContours(img, [contours[1]], -1, (0, 255, 0), 3)
    
    cv2.imshow("image", img)
    cv2.waitKey(0)

完。

转载于:https://my.oschina.net/u/2274874/blog/1510941

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值