Как удалить некоторые края после применения обнаружения края?

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

Вот где я застрял, у меня есть изображение, и оно уже подразумевается вертикальным обнаружением края Собеля. У меня есть ввод изображения, вот картинка:

Входное изображение

А это изображение после применения обнаружения вертикального края:

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

Мне нужно удалить все края, кроме края радужной оболочки (красный край).

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

Мой ожидаемый результат должен быть таким:

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

Примечание. Некоторые изображения могут иметь только левый или правый край зрачка, как на изображении выше, но некоторые изображения могут иметь левый и правый края зрачка.

На мой взгляд, есть два способа получить края.

  1. Удалите горизонтальные края, так как края зрачка вертикальны. Но я не знаю, как удалить горизонтальные края, и это не совсем горизонтальные линии, а извилистые горизонтальные линии.

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

Какой из них является правильным способом решения моей проблемы? или не оба варианта выше?

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


person Dennis    schedule 04.06.2016    source источник


Ответы (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()
person Borealis    schedule 04.06.2016
comment
Ах, вы правы, это ирис. Я спросил некоторых людей, которые использовали круговое преобразование Хафа, и они сказали, что я не могу использовать преобразование Хафа, если радужная оболочка чем-то закрыта, возможно, они не пробовали этот случай. Я никогда раньше не пробовал Hough Transform, но после того, как они это сказали, я просто нашел другой способ решить эту проблему, но все же я застрял на этом шаге. Говоря о библиотеке openCV, которую вы мне даете, у вас есть полная теория/статья об этой библиотеке? я не могу просто использовать библиотеку для своего проекта, потому что поиск радужной оболочки - мой основной метод для моего последнего проекта в моем колледже. - person Dennis; 05.06.2016

Я пытаюсь ответить на ваш вопрос, я предлагаю вам использовать круг 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

person Mr. Mike    schedule 04.06.2016
comment
сначала я думал, что могу использовать Circular Hough Transform для моего случая, но я не могу. В моем случае входное изображение иногда представляет собой не полностью закругленный зрачок или радужную оболочку. Мой проект касается оценки взгляда, поэтому будет ввод изображения глаза, который смотрит влево или вправо, а зрачок или радужная оболочка могут быть закрыты чем-то вроде века. - person Dennis; 04.06.2016