Advertisement

【python】OpenCV—Extreme Points in the Contour

阅读量:
在这里插入图片描述

文章目录

  • 1、需求描述
  • 2、功能实现
  • 3、更多的例子
  • 4、完整代码
  • 5、参考

1、需求描述

给一张图片,找出其轮廓,并画出轮廓的上下左右极值点

输入图片

在这里插入图片描述

输出效果

在这里插入图片描述

2、功能实现

复制代码
    # 导入必要的包
    import imutils
    import cv2
    # 加载图像,将其转换为灰度,并稍微模糊
    image = cv2.imread("6.jpg")
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    cv2.imwrite("gray.jpg", gray)
    
    
    python
在这里插入图片描述
复制代码
    gray = cv2.GaussianBlur(gray, (5, 5), 0)
    cv2.imwrite("GaussianBlur.jpg", gray)
    
    
    python
在这里插入图片描述
复制代码
    # 对图像设置阈值,然后执行一系列腐蚀 + 膨胀以去除任何小的噪声区域
    thresh = cv2.threshold(gray, 45, 255, cv2.THRESH_BINARY)[1]
    cv2.imwrite("thresh.jpg", thresh)
    
    
    python
在这里插入图片描述

腐蚀一下

复制代码
    thresh = cv2.erode(thresh, None, iterations=2)
    cv2.imwrite("erode.jpg", thresh)
    
    
    python
在这里插入图片描述
复制代码
    thresh = cv2.dilate(thresh, None, iterations=2)
    cv2.imwrite("dilate.jpg", thresh)
    
    
    python
在这里插入图片描述
复制代码
    # 在阈值图像中找到轮廓,然后获取最大的一个
    cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
    	cv2.CHAIN_APPROX_SIMPLE)
    cnts = imutils.grab_contours(cnts)
    c = max(cnts, key=cv2.contourArea)
    
    
    # 确定轮廓的极值点
    extLeft = tuple(c[c[:, :, 0].argmin()][0])
    extRight = tuple(c[c[:, :, 0].argmax()][0])
    extTop = tuple(c[c[:, :, 1].argmin()][0])
    extBot = tuple(c[c[:, :, 1].argmax()][0])
    
    
    # 画出物体的轮廓,然后画出每个极值点,最左边是红色,最右边是绿色,最上面是蓝色,最下面是青色
    cv2.drawContours(image, [c], -1, (0, 255, 255), 2)
    cv2.circle(image, extLeft, 8, (0, 0, 255), -1)
    cv2.circle(image, extRight, 8, (0, 255, 0), -1)
    cv2.circle(image, extTop, 8, (255, 0, 0), -1)
    cv2.circle(image, extBot, 8, (255, 255, 0), -1)
    # 显示输出图像
    cv2.imshow("Image", image)
    cv2.imwrite("result.jpg", image)
    cv2.waitKey(0)
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/oBsd8e7AxvFG5hfwWD4M2z3SyE0r.png)
在这里插入图片描述

3、更多的例子

输入

在这里插入图片描述

输出

在这里插入图片描述

输入

在这里插入图片描述

输出

在这里插入图片描述

只画面积最大的轮廓

输入图片

在这里插入图片描述

输出图片

在这里插入图片描述

输入图片

在这里插入图片描述

输出图片

在这里插入图片描述

去掉了腐蚀和膨胀操作,才能分割出来完整的树叶

输入图片

在这里插入图片描述

输出图片

在这里插入图片描述

发现全部采用黑色背景设计,在第二部分的具体实现中也能了解到的是,在使用白色背景时会出现严重的问题。

4、完整代码

复制代码
    # 导入必要的包
    import imutils
    import cv2
    # 加载图像,将其转换为灰度,并稍微模糊
    image = cv2.imread("6.jpg")
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    cv2.imwrite("gray.jpg", gray)
    
    gray = cv2.GaussianBlur(gray, (5, 5), 0)
    cv2.imwrite("GaussianBlur.jpg", gray)
    
    # 对图像设置阈值,然后执行一系列腐蚀 + 膨胀以去除任何小的噪声区域
    thresh = cv2.threshold(gray, 45, 255, cv2.THRESH_BINARY)[1]
    cv2.imwrite("thresh.jpg", thresh)
    
    thresh = cv2.erode(thresh, None, iterations=2)
    cv2.imwrite("erode.jpg", thresh)
    
    
    thresh = cv2.dilate(thresh, None, iterations=2)
    cv2.imwrite("dilate.jpg", thresh)
    
    # 在阈值图像中找到轮廓,然后获取最大的一个
    cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
    	cv2.CHAIN_APPROX_SIMPLE)
    cnts = imutils.grab_contours(cnts)
    c = max(cnts, key=cv2.contourArea)
    
    
    # 确定轮廓的极值点
    extLeft = tuple(c[c[:, :, 0].argmin()][0])
    extRight = tuple(c[c[:, :, 0].argmax()][0])
    extTop = tuple(c[c[:, :, 1].argmin()][0])
    extBot = tuple(c[c[:, :, 1].argmax()][0])
    
    
    # 画出物体的轮廓,然后画出每个极值点,最左边是红色,最右边是绿色,最上面是蓝色,最下面是青色
    cv2.drawContours(image, [c], -1, (0, 255, 255), 2)
    cv2.circle(image, extLeft, 8, (0, 0, 255), -1)
    cv2.circle(image, extRight, 8, (0, 255, 0), -1)
    cv2.circle(image, extTop, 8, (255, 0, 0), -1)
    cv2.circle(image, extBot, 8, (255, 255, 0), -1)
    # 显示输出图像
    cv2.imshow("Image", image)
    cv2.imwrite("result.jpg", image)
    cv2.waitKey(0)
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/w2UGsb3oRhkepjfBZav07HxqJzPr.png)

5、参考

参考内容源自:imutils基础(7)使用 OpenCV 寻找图像轮廓的极值点

全部评论 (0)

还没有任何评论哟~