簡體   English   中英

OpenCV 感興趣的環形區域

[英]OpenCV Annulus region of interest

我定義了環形 ROI 選擇 function,我想在這個區域找到輪廓。 但是輪廓像素值是零的鄰居,並且在掩蔽區域之外等於零。 因此輪廓無法捕捉到閾值圖像。

如果 function 可以,我如何定義環形 ROI 或找到輪廓

    def annulusROI(img, center, innerR, outerR):
        """
        img: Image matrix
        center: ROI center point [px] (x,y tuple)
        innerR: ROI inner radius [px]
        outerR: ROI outer radius [px]
        mode: Mask selection for white (255, 255, 255), for black (0, 0, 0) [BGR tuple]
    
        return roi matrix and left-top start point coordinate
        """
        outRoi, rectC = rectangleROI(img, center, outerR*2, outerR*2)
        mask1 = np.zeros_like(outRoi)
        mask2 = np.zeros_like(outRoi)
        mask1 = cv2.circle(mask1, (round(outerR),round(outerR)), innerR, (255, 255, 255), -1)
        mask2 = cv2.circle(mask2, (round(outerR),round(outerR)), outerR, (255, 255, 255), -1)
        mask = cv2.subtract(mask2, mask1)
        roi = cv2.bitwise_and(outRoi, mask)
    
        return roi, (center[0]-outerR, center[1]-innerR)

輪廓

閾值roi 返回圖像

在閾值化之后和獲取輪廓之前,您可以將感興趣的區域與外部區域分開。 或者更好的是,您可以在閾值之后而不是之前切割您感興趣的區域。 最后,您可以按區域大小過濾掉相關輪廓。

import cv2


# get image threshold
img = cv2.imread("img.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray, 64, 255, 0)

# separate annulus from outer area
h, w, _ = img.shape
center = (round(w / 2), round(h / 2))
innerR = 246
outerR = 306

cv2.circle(thresh, center, innerR, 255)
cv2.circle(thresh, center, outerR, 255)

# filter contours by relevant area size
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cc = [c for c in contours if 100 < cv2.contourArea(c) < 5000]
cv2.drawContours(img, cc, -1, (0, 0, 255))

cv2.imwrite("out.png", img)

結果:

輸出

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM