Как обнаружить контур или пятно на краю?

Я пытаюсь обнаружить черные пятна на следующем изображении.

введите здесь описание изображения

Я использую адаптивный порог и использую контуры поиска в opencv. Этот метод успешно обнаруживает большинство черных пятен на сером фоне. Однако он не может обнаружить пятна по краям просто потому, что обнаружение контура считает, что пятна являются частью черного фона, см. здесь:

введите здесь описание изображения

Вот код, который я использовал для получения этих контуров:

import cv2

image_path = "cropped.png"
img = cv2.imread(image_path)
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, (1, 1))
blob = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (10, 10))
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)

result1 = img.copy()
cv2.drawContours(result1, cnts, -1, (0, 0, 255), 3)
cv2.imwrite("_Fail_Blob.png", result1)

Любые предложения о том, как обнаружить черные пятна по краям? В конце концов, ищем алгоритм, позволяющий выводить что-то вроде следующего:

введите здесь описание изображения


person Mohammad    schedule 04.06.2020    source источник


Ответы (1)


Вы можете использовать морфологические операции для выделения пятна: Например:

import cv2 
fn = 'IdTPp.jpg'
img = cv2.imread(fn)
img=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
se=cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (45,45))
img2=cv2.morphologyEx(img, cv2.MORPH_CLOSE, se)
img3=cv2.absdiff(img, img2)
cv2.imshow("detected circles", img3)

введите здесь описание изображения

person Alex Alex    schedule 04.06.2020
comment
Возможно, лучше использовать прямоугольный структурный элемент. - person Alex Alex; 04.06.2020