Обнаружение точек на изображении с помощью обработки изображений с помощью python

Мне нужно определить следующие точки на данных изображениях. Но это не дает правильного обнаружения. Может ли кто-нибудь дать методологию определения этих точек на таком изображении? введите здесь описание изображения

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

  • улучшенное изображение путем расширения с последующим повышением резкости

    Я использовал сопоставление с шаблоном для обнаружения этих точек на изображении. Но это не сработало. Код выглядит следующим образом. Есть ли другой способ обнаружить их?

импортировать cv2 импортировать numpy как np

img_rgb = cv2.imread(file)
cv2.imwrite("D:/4/Detect/"+str(i)+".0.jpg",img_rgb)
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)

template = cv2.imread('a.jpg',0)
w, h = template.shape[::-1]

res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.455
loc = np.where( res >= threshold)

for pt in zip(*loc[::-1]):
    cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,255,255), 0)

cv2.imshow('Detected',img_rgb)
cv2.imwrite("D:/4/Detect/"+str(i)+".1.jpg",img_rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()

person vidu    schedule 24.02.2021    source источник
comment
пожалуйста, поделитесь минимально-воспроизводимым-примером   -  person Bilal    schedule 24.02.2021
comment
Спасибо за ответ. Я использовал шаблонную обработку для этого, но это мало работает. При использовании шаблона он также обнаруживает некоторые несвязанные части. Есть ли другой способ обнаружить их?   -  person vidu    schedule 25.02.2021


Ответы (1)


Вот основная часть кода для лучшего результата (показана на изображении ниже), которую я быстро разработал:

import cv2 as cv
img = cv.imread('med.jpg',0)
th2 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_MEAN_C,\
            cv.THRESH_BINARY,11,2)
th3 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,\
            cv.THRESH_BINARY,11,2)
titles = ['Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [th2, th3]
inv = ~th3
res = cv.bitwise_and(img,inv)
cv.imshow(titles[1],res)
cv.waitKey(0)
cv.imwrite("result.jpg",res)
cv.destroyAllWindows()

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

Настройте параметры для получения желаемого результата.

person SKG    schedule 25.02.2021
comment
Большое спасибо за ответ СКГ. На самом деле, я работал с адаптивной пороговой обработкой, хитрыми, морфологическими операторами многих типов, но мне нужно только сегментировать точки. На изображении выше он также сегментировал точки вместе с другими элементами. Требуется только многоточие. Есть ли способ сделать это? заранее спасибо - person vidu; 25.02.2021
comment
Из моего вывода сделайте анализ блоба. Там вы получите всю статистику (показатели) BLOB-объектов. Теперь с пороговым значением вы можете сохранить нужные капли и отклонить нежелательные. - person SKG; 25.02.2021
comment
@vidu, если вы хотите сегментировать каждую точку, вам нужно будет сегментировать на уровне пикселей, для этого, вероятно, вам понадобится использовать Mask R-CNN (сегментация экземпляров) или U-net (семантинк-сегментация) - person Freddy Daniel; 26.02.2021
comment
Спасибо @Фредди. Есть ли способ сделать это без обучения... Я имею в виду подход, основанный на правилах? - person vidu; 27.02.2021