如何使用OpenCV ConnectedComponents获取图像

13
如何使用Python OpenCV ConnectedComponents函数获取图像?
在查找一些过去的问题时,我只能找到如何以不同颜色着色连接对象的方法(我测试了它并且有效,但我不知道标签是如何工作的)
这些先前回答的问题的参考:Stackoverflow问题48303309Stackoverflow问题46441893 使用以下代码,我可以获得着色输出。
import cv2
import numpy as np

img = cv2.imread('eGaIy.jpg', 0)
img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)[1]  # ensure binary
ret, labels = cv2.connectedComponents(img)

# Map component labels to hue val
label_hue = np.uint8(179*labels/np.max(labels))
blank_ch = 255*np.ones_like(label_hue)
labeled_img = cv2.merge([label_hue, blank_ch, blank_ch])

# cvt to BGR for display
labeled_img = cv2.cvtColor(labeled_img, cv2.COLOR_HSV2BGR)

# set bg label to black
labeled_img[label_hue==0] = 0

cv2.imshow('labeled.png', labeled_img)
cv2.waitKey()

原始图片 阴影效果

我是否有办法从这张图片中将连接的对象剥离出来?
所以输出应该是从原始图片中得到多个图像。

1个回答

12
image = cv2.imread('image.png', cv2.IMREAD_UNCHANGED);
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]

# getting mask with connectComponents
ret, labels = cv2.connectedComponents(binary)
for label in range(1,ret):
    mask = np.array(labels, dtype=np.uint8)
    mask[labels == label] = 255
    cv2.imshow('component',mask)
    cv2.waitKey(0)

# getting ROIs with findContours
contours = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]
for cnt in contours:
    (x,y,w,h) = cv2.boundingRect(cnt)
    ROI = image[y:y+h,x:x+w]
    cv2.imshow('ROI', ROI)
    cv2.waitKey(0)

cv2.destroyAllWindows()

谢谢!它运行得很好。我可以问一下如何将所有的ROI合并成一个大的ROI吗? - Chopin
在轮廓循环期间,我应该保留最低的x、最高的x、最低的y和最高的y,然后使用image[smally: highy - smally, smallx: highx - smallx]进行裁剪吗? - Chopin
1
第一个for循环在处理大图像时可能会非常缓慢。有什么加速的想法吗? - jtlz2
2
你需要编辑你的答案:将contours=cv2.findContours(...)[1]改为contours=cv2.findContours(...)[0] - Scott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接