打酱油的工程师 2023-01-13 21:01 采纳率: 66.7%
浏览 10
已结题

OpenCV 里的连通区域分析例题

OpenCV 里的连通区域分析可以将具有相同像素值且位置相邻的前景像素点组成的图像区域识别出来。有两种像素相邻的定义:
通过OpenCV的连通区域分析算法,我们可以将下图的水鸭子的外框框出来:
系统识别的正确代码是:

import cv2
import numpy as np
import matplotlib.pyplot as plt

def close_op(img):
kernel = np.ones((3, 3), np.uint8)
img1 = cv2.dilate(img, kernel, iterations=1)
img2 = cv2.erode(img1, kernel, iterations=1)
return img2

def show_images(images):
i = 0
for title in images:
plt.subplot(2, 3, i+1), plt.imshow(images[title], 'gray')
plt.title(title)
plt.xticks([]), plt.yticks([])
i += 1
plt.show()

if name == 'main':
duck_origin = cv2.imread('duck.png', -1)

duck_box = duck_origin.copy()
duck_gray = cv2.cvtColor(duck_box, cv2.COLOR_BGR2GRAY)
duck_gray_with_closed = close_op(duck_gray)
ret, duck_binary = cv2.threshold(duck_gray_with_closed, 127, 255, cv2.THRESH_BINARY)
 
ret, labels, stats, centroid = cv2.connectedComponentsWithStats(duck_binary)
duck_area = sorted(stats, key=lambda s: s[-1], reverse=False)[-2]
cv2.rectangle(
    duck_box,
    (duck_area[0], duck_area[1]),
    (duck_area[0] + duck_area[2], duck_area[1] + duck_area[3]),
    (255, 0, 0),
    3
)
 
images = {
    'duck_origin': duck_origin,
    'duck_gray': duck_gray,
    'duck_gray_with_closed_op': duck_gray_with_closed,
    'duck_binary': duck_binary,
    'duck_box': duck_box
}
show_images(images)

但实际运行测试,并不能正确框选出duck。
如何修改?

img

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-01-13 21:31
    关注

    该代码的问题可能在于图像阈值化的参数设置,在 cv2.threshold() 中 threshold 的取值可能不适合这张图片。可以尝试使用其他阈值化方法,如 cv2.adaptiveThreshold() 或 cv2.createTrackbar() 来动态调整阈值。


    另外,在使用 cv2.connectedComponentsWithStats() 时,stats 参数返回的是所有连通块的统计信息,而代码中选择的是面积最小的连通块,这可能不是我们想要的结果,需要更改为选择面积最大的连通块。


    除此之外,需要注意的还有:

    • 在读取图片时,使用 cv2.IMREAD_GRAYSCALE 会使得读入的图片是灰度图,而不是彩色图。

    • 用于腐蚀和膨胀操作的核大小可能需要调整。

    • 使用 cv2.rectangle() 函数画矩形时,(x,y) 和 (x+w,y+h) 是矩形右下角和左上角的坐标,而不是左上角和右下角。

    总之,应该从多个方面来调整代码,以获得最佳结果。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月21日
  • 已采纳回答 1月13日
  • 创建了问题 1月13日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效