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

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

Ниже приведено микроскопическое (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 here enter image description here

10
задан Abid Rahman K 7 May 2014 в 11:42
поделиться