opencv+python 提取国徽轮廓
博客专区 > sskicgah 的博客 > 博客详情
opencv+python 提取国徽轮廓
sskicgah 发表于2个月前
opencv+python 提取国徽轮廓
  • 发表于 2个月前
  • 阅读 26
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

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

图像提取轮廓,庆幸找到用 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)

完。

共有 人打赏支持
粉丝 4
博文 39
码字总数 29704
×
sskicgah
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: