Поиск ям в изображении

Один из моих друзей работал над следующим проектом:

Ниже представлено микроскопическое изображение (SEM) поверхности из нержавеющей стали.

enter image description here

Но вы можете видеть, что он немного корродирует (после длительного воздействия морской среды), и некоторые ямы образуются на поверхности. Некоторые из ям отмечены красным кружком.

Ему нужно найти количество ям в изображении, и он подсчитывал их вручную (представьте, их почти 150 изображений). Поэтому я подумал о автоматизации этого процесса с помощью любого инструмента обработки изображений.

Вопрос:

Как я могу найти количество ям на этом изображении?


Что я пробовал:

В качестве первого шага я немного улучшил контраст, закрыв операцию.

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('6.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(11,11))

close = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)

close2 = cv2.add(close,1)
div = (np.float32(gray)+1)/(close2)
div2 = cv2.normalize(div,None, 0,255, cv2.NORM_MINMAX)
div3 = np.uint8(div2)

Результат:

enter image description here

Затем я применил некоторый порог для 127 и нашел в нем контуры. Позже эти контуры фильтруются на основе их площади (нет конкретной информации об этой области, я использовал диапазон 1-10 в качестве эмпирического значения).

ret, thresh = cv2.threshold(div3, 127,255, cv2.THRESH_BINARY_INV)
temp, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)

res = np.zeros(gray.shape,np.uint8)

for cnt in contours:
    if 1.0 < cv2.contourArea(cnt) < 10.0:
        res = cv2.drawContours(res, [cnt], 0, 255, -1)

plt.subplot(121); plt.imshow(img, 'gray'); plt.subplot(122); plt.imshow(res,'gray'); plt.show() 

Но это закончилось большим количеством дополнительного шума. См. Результат ниже:

enter image description here


Дополнительная информация:

Некоторые тестовые изображения:

enter image description hereenter image description here

Ответ 1

Ваше дело напоминает мне документ (Обнаружение человека с использованием мобильной платформы и новые функции, полученные из механизма визуальной экспертизы), который вычисляет значение на изображении, основанном на понятии ячейки ганглиозного центра, то есть методе, который обнаруживает яркие пиксели, окруженные темными областями (или наоборот, называемыми внецентральными ячейками).

Ganglion cells

Чтобы приблизить эти ячейки, вы можете использовать прямоугольные области. Используя интегральные изображения, вы можете ускорить процедуру. Подробнее см. В документе.

Еще одна идея - свертка составного фильтра. Найдите шаблон, который очень близок к каждой яме и сопоставьте шаблон с изображением (или используйте несколько фильтров для изменения масштаба/формы).