opencv 如何获得形状边连接在一起的轮廓?

fcg9iug3  于 2023-04-12  发布在  其他
关注(0)|答案(1)|浏览(178)

我有一个图像,有很多正方形,我想得到这些形状的轮廓,但这些形状的边缘连接在一起,所以我不知道如何分离边缘。有人能有好的想法来得到这些轮廓使用opencv

mm5n2pyu

mm5n2pyu1#

我们可以使用RETR_TREE找到具有层次结构的轮廓,并找到没有子轮廓的“内部轮廓”。
当使用RETR_TREE时,空轮廓具有外轮廓和内轮廓。
内部轮廓是分离的,因此只查找内部轮廓就解决了问题。
以下代码示例使用以下阶段:

  • 将输入图像转换为二进制图像(使用自动二进制阈值)。
  • 使用cv2.RETR_TREE查找具有层次的等高线
  • 迭代轮廓,并找到没有子轮廓的轮廓(根据层次结构):if hierarchy[0][i][2] < 0 ...
  • 用不同的颜色绘制轮廓(只是为了表明它不是一个大的轮廓)。

代码示例:

import cv2
import numpy as np
from matplotlib import pyplot as plt  # Used for a colormap

img = cv2.imread('shapes.png')  # Read input image.
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # Convert to grayscale.
out = np.zeros_like(img)  # Prepare output image

thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)[1]  # Convert to binary image - use automatic thresholding

# Find contours with hierarchy, use cv2.RETR_TREE
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# Get viridis colormap, and convert it to look up table:
cmap = plt.get_cmap('hsv')

# Iterate over the contours and their hierarchies
# Draw contours with different colors for marking that it's not one large contour
for i, contour in enumerate(contours):
    if hierarchy[0][i][2] < 0:
        color = np.round(np.array(cmap(i*57 % 255)[:-1])*255).astype(np.uint8) # Get the color from a colormap

        # If contour has no child, draw the contour
        cv2.drawContours(out, contours, i, tuple(color.tolist()), 3)

cv2.imwrite('out.png', out)  # Save the result.

输出:

相关问题