簡體   English   中英

使用 opencv 中的輪廓檢測檢測視網膜圖像中的視盤?

[英]Detect optic disk in a retina image using contour detection in opencv?

我有以下視網膜圖像,我試圖在視盤周圍畫一個圓圈(視網膜圖像中的白色圓形)。 這是原始圖像:

在此處輸入圖像描述

我應用了自適應閾值然后 cv2.findcontour:

import cv2
def detectBlob(file):
    # read image
    img = cv2.imread(file)
    imageName = file.split('.')[0]
    # convert img to grayscale
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # do adaptive threshold on gray image
    thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 101, 3)

    # apply morphology open then close
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
    blob = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (20,20))
    blob = cv2.morphologyEx(blob, cv2.MORPH_CLOSE, kernel)

    # invert blob
    blob = (255 - blob)

    # Get contours
    cnts,hierarchy = cv2.findContours(blob, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

        # write results to disk
    result = img.copy()
    cv2.drawContours(result, cnts, -1, (0, 0, 255), 3)
    cv2.imwrite(imageName+"_threshold.jpg", thresh)
    cv2.imwrite(imageName+"_blob.jpg", blob)
    cv2.imwrite(imageName+"_contour.jpg", result)

detectBlob('16.png')

這是閾值的樣子:

在此處輸入圖像描述

這是輪廓的最終 output:

在此處輸入圖像描述

理想情況下,我正在尋找這樣的 output:

在此處輸入圖像描述

自適應閾值化失敗是因為過濾器尺寸太小。 雖然我們沒有弄清楚這一點,但背景中的波浪非常令人不安。

通過將圖像分辨率降低 16 倍並應用范圍為 99x99 的自適應濾波器,我獲得了一個有趣的結果。

在此處輸入圖像描述

您需要識別更大的結構。 理想情況下,您需要大約 1/4 視盤半徑的結構尺寸來平衡結果和處理時間(用更大的尺寸進行實驗直到可以接受)。

或者您可以對圖像進行下采樣(降低分辨率並使圖片更小),這或多或少是一回事,即使您在視盤邊界上失去了精度。

暫無
暫無

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

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