Обнаружение радужки и зрачка на изображении с помощью Java и OpenCV

У меня известная проблема с обнаружением радужной оболочки и зрачка на изображениях. Я уже читал некоторые темы (например:

Какое правильное использование / значения параметров для HoughCircles в OpenCV для обнаружения радужки? Обнаружение зрачков и cvHoughCircles? Использование HoughCircles для обнаружения и измерения зрачка и радужной оболочки Параметры HoughCircles для распознавания мячей

об этой проблеме, но все еще не могу найти решение своей проблемы.

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

Это мой образец изображения ввода: Входное изображениеИ это мой результат:  введите описание изображения здесь

Мой код размещен ниже.

 Mat src = Highgui.imread("in.jpg", Highgui.CV_LOAD_IMAGE_GRAYSCALE);       
 Mat des = new Mat(src.rows(), src.cols(), src.type());
 Imgproc.GaussianBlur(src,src, new Size(3,3),0,0); 
 Imgproc.Canny(src, dst,  5, 10);
 Mat circles = new Mat();
 Imgproc.HoughCircles(source, circles, Imgproc.CV_HOUGH_GRADIENT, 1.0, 20.0, 70.0, 30.0, 3, 100);
 //draw circles code here

Я хочу, чтобы зрачок и радужка были обведены. Может ли кто-нибудь опубликовать правильные значения для определения моего круга?
У меня также есть несколько вопросов:

1) Что лучше использовать фильтр Canny или Sobel?

2) Могу ли я сделать это обнаружение лучше, гибче?

3) Вы можете просто объяснить мне, что именно означает параметры HoughCircles - (из OpenCV javadoc)

* @param dp Inverse ratio of the accumulator resolution to the image
  * resolution. For example, if <code>dp=1</code>, the accumulator has the same
  * resolution as the input image. If <code>dp=2</code>, the accumulator has half
  * as big width and height.
* @param param1 First method-specific parameter. In case of <code>CV_HOUGH_GRADIENT</code>,
  * it is the higher threshold of the two passed to the "Canny" edge detector
  * (the lower one is twice smaller).
* @param param2 Second method-specific parameter. In case of <code>CV_HOUGH_GRADIENT</code>,
  * it is the accumulator threshold for the circle centers at the detection
  * stage. The smaller it is, the more false circles may be detected. Circles,

person Araneo    schedule 11.11.2014    source источник
comment
ваши хитрые пороги слишком низки. Попробуйте вывести промежуточные изображения, вы увидите что-то очень шумное;)   -  person Micka    schedule 11.11.2014
comment
ваша концептуальная проблема может заключаться в том, что сила края границы радужной оболочки и границы зрачка сильно различается, поэтому вы легко обнаружите зрачок, но радужная оболочка может быть более сложной.   -  person Micka    schedule 11.11.2014
comment
@Micka Основываясь на некоторых темах, которые я нашел на stacoverflow, я добавил автоматический расчет порога, например: maxThreshold = Imgproc.threshold (source, tmp, 0, 255, Imgproc.THRESH_BINARY | Imgproc.THRESH_OTSU); И minThreshold для меня 5.0 * maxThres. Он правильно определяет зрачок, но мне еще предстоит много кругов. Более того, он не обнаруживает радужную оболочку. Что еще я могу изменить?   -  person Araneo    schedule 12.11.2014
comment
Если у вас тоже есть цветные изображения, попробуйте обнаружить круги в H-канале HSV. Не знал, что еще делать, простых порогов для радужки не нашел ...   -  person Micka    schedule 12.11.2014
comment
Как вы это решили? У меня та же проблема, что и при обнаружении зрачка OpenCV. Получение множества случайных ложных кругов. Какие пороговые значения вы использовали? Я видел в другом посте, что вы разместили очень чистые изображения, так что похоже, что вам это удалось!   -  person LearningSwift    schedule 15.02.2018
comment
Я попытаюсь найти исходный код этого приложения, но, честно говоря, я беспокоюсь, что не найду его.   -  person Araneo    schedule 19.02.2018


Ответы (1)


Круги Хафа - не очень хороший метод для определения радужки / зрачка. Это не очень надежно, и вы всегда будете настраивать слишком много параметров, чем следовало бы.

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

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

person Vasanth    schedule 17.03.2016