Как удалить некоторые края после применения обнаружения края?
Мне нужно найти края радужной оболочки, входные изображения, которые я использую, не являются полностью округлой радужной оболочкой, иногда она может быть закрыта веко. Я нашел резюме статьи в журнале, чтобы найти радужную оболочку, даже покрытую веком. Однако я застрял на одном из шагов. Опять же, потому что только резюме, и я не могу найти полный текст этой статьи.
Вот где я застрял, у меня есть изображение, и оно уже подразумевается при обнаружении вертикальных краев Собеля. У меня есть входное изображение, вот изображение:
И это картина после применения обнаружения вертикального края:
Мне нужно удалить все края, кроме края радужной оболочки (красный край).
Мой ожидаемый результат должен быть таким:
Примечание. Некоторые изображения могут иметь только левый или правый края зрачка, как на изображении выше, но некоторые изображения могут иметь левый и правый края зрачка.
На мой взгляд, есть два способа получить края.
Удалите горизонтальные края, так как края зрачка вроде как вертикальные. Но я не знаю, как удалить горизонтальные края, и это не совсем горизонтальные линии, его изогнутые горизонтальные линии.
Найдите самые длинные ребра на картинке (я также не знаю, каков алгоритм нахождения самых длинных ребер).
Какой правильный способ решить мою проблему? или нет оба варианта выше?
Если вам известен метод поиска не полностью закругленных объектов, особенно для радужной оболочки, скажите, пожалуйста, он облегчит мой проект.
2 ответа
Это проблема обнаружения функций, и поэтому я бы использовал преобразование Хафа Круга в библиотеке OpenCV ( учебное пособие). На скриншоте видно, что метод достаточно надежен в обнаружении частичной округлости.
import cv2
import cv2.cv as cv
import numpy as np
img = cv2.imread(r'C:\path\to\eye.jpg',0)
img = cv2.medianBlur(img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
circles = cv2.HoughCircles(img,cv.CV_HOUGH_GRADIENT,1,20,
param1=150,param2=30,minRadius=20,maxRadius=100)
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
# draw the outer circle
cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
# draw the center of the circle
cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
cv2.imshow('detected circles',cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()
Я пытаюсь ответить на ваш вопрос, предлагаю вам воспользоваться кружком Hough Transform. Я пытаюсь определить круг, чтобы вы могли получить радиус круга, а затем вы можете получить размер круга.
Вот код и результат:
A = imread('eye.jpg');
A = imresize(A, 0.8);
A = rgb2gray(A);
A = edge(A, 'canny');
imshow(A);
[centers, radii, metric] = imfindcircles(A,[1 100]);
centersStrong5 = centers(1:1,:);
radiiStrong5 = radii(1:1);
metricStrong5 = metric(1:1);
viscircles(centersStrong5, radiiStrong5,'EdgeColor','b');
И результат:
Надеюсь, это поможет вашей проблеме.
Ссылка на код: http://www.mathworks.com/help/images/ref/imfindcircles.html