zoukankan      html  css  js  c++  java
  • Python+OpenCV图像处理之轮廓发现

    轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果。

    python实现

    import cv2
    import numpy as np
    
    
    __author__ = "boboa"
    
    
    def contours_demo(image):
        dst = cv2.GaussianBlur(image, (3, 3), 0)
        gray = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY)
        ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
        cv2.imshow("binary image", thresh)
        # 得到修改后的图像,轮廓,轮廓的层次
        cloneimage, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        """
        cv2.findContours(image, mode, method, contours, hierarchy, offset)
            参数:
                1 要寻找轮廓的图像 只能传入二值图像,不是灰度图像
                2 轮廓的检索模式,有四种:
                    cv2.RETR_EXTERNAL表示只检测外轮廓
                    cv2.RETR_LIST检测的轮廓不建立等级关系
                    cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层
                    cv2.RETR_TREE建立一个等级树结构的轮廓
                3 轮廓的近似办法
                    cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
                    cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
            返回值:
                contours:一个列表,每一项都是一个轮廓,不会存储轮廓所有的点,只存储能描述轮廓的点
                hierarchy:一个ndarray, 元素数量和轮廓数量一样, 
                    每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],
                    分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数
        """
        for i, contour in enumerate(contours):
            # 绘制轮廓
            cv2.drawContours(image, contours, i, (0, 0, 255), 2)
            """
            # 函数cv2.drawContours(image, contours, contourIdx, color, thickness, lineType, hierarchy, maxLevel, offset)
            # 第一个参数是一张图片,可以是原图或者其他。
            # 第二个参数是轮廓,也可以说是cv2.findContours()找出来的点集,一个列表。
            # 第三个参数是对轮廓(第二个参数)的索引,当需要绘制独立轮廓时很有用,若要全部绘制可设为-1。
            # 接下来的参数是轮廓的颜色和厚度
            """
            print(i)
        cv2.imshow("detect contours", image)
    
    
    if __name__ == "__main__":
        img = cv2.imread("image/circles.jpg")
        cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE)
        cv2.imshow("input image", img)
        contours_demo(img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()

    二值化图像和检测到的轮廓如下图

  • 相关阅读:
    elasticsearch安装ik分词器
    原来你是这样的JAVA[03]-继承、多态、抽象类
    JAVA入门[23]-SpringBoot配置Swagger2
    原来你是这样的JAVA[01]-基础一瞥
    springboot + @scheduled 多任务并发
    chrome解决http自动跳转https问题
    jquery.uploadify+spring mvc实现上传图片
    JAVA POI导出excel
    使用ztree展示树形菜单结构
    shiro入门示例
  • 原文地址:https://www.cnblogs.com/qianxia/p/11102800.html
Copyright © 2011-2022 走看看