2016-06-15 6 views
0

Я пытаюсь обнаружить диск и чашку в задней части глаза (дно), чтобы вычислить некоторые вещи позже. Так вот изображение глаза:Обнаружение кругов в изображении с использованием лапласиана

enter image description here

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

До сих пор я пытался использовать фильтрацию лапласа, чтобы сделать круг более заметным.

Вот мой код:

import cv2 
import numpy as np 
from matplotlib import pyplot as plt 
from pylab import * 

# loading image 
img0 = cv2.imread('01_g.jpg',) 

# converting to gray scale 
gray = cv2.cvtColor(img0, cv2.COLOR_BGR2GRAY) 

# remove noise 
img = cv2.GaussianBlur(gray,(3,3),0) 

# convolute with proper kernels 
laplacian = cv2.Laplacian(img,cv2.CV_64F) 
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5) # x 
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5) # y 
magnitude = sqrt(sobelx**2+sobely**2) 

plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray') 
plt.title('Original'), plt.xticks([]), plt.yticks([]) 

plt.subplot(2,2,2),plt.imshow(laplacian,cmap = 'gray') 
plt.title('Laplacian'), plt.xticks([]), plt.yticks([]) 

plt.subplot(2,2,3),plt.imshow(sobelx,cmap = 'gray') 
plt.title('Sobel X'), plt.xticks([]), plt.yticks([]) 

plt.subplot(2,2,4),plt.imshow(sobely,cmap = 'gray') 
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([]) 

plt.show() 

Это результат я получил: enter image description here

Как вы можете видеть, лапласиан фильтр не помогло all-- на самом деле, чашка и диск даже не видны. Sobelx и sobely по крайней мере, дали некоторый контур внешнего круга (диска)

Я также попробовал абсолютное значение лапласиана:

final = np.absolute(laplacian) 
plt.imshow(final, cmap = 'gray') 
plt.show() 

и я получил этот результат:

enter image description here

Я также попытался применения Difference of Gaussians method используя этот код:

#difference of gaussians 

blur1 = cv2.GaussianBlur(img,(3,3),1) 
blur2 = cv2.GaussianBlur(img,(5,5),1.1) 
difference = blur2 - blur1 
plt.imshow(difference, cmap = 'gray') 
plt.show() 

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

+0

Я думаю, что команда imshow автоматически масштабирует изображение так, чтобы максимальное значение белого цвета, а самый низкий черный. Поскольку у вас очень сильное закругление вокруг кругового изображения, будет трудно увидеть более слабые края внутри – HugoRune

+0

@ShalinShah попытается нарисовать абсолютные значения вместо знаковых значений лапласиана – Micka

+0

@HugoRune Я обрезал изображение, чтобы изображение было теперь только внутренняя часть и очень сильный край ушли .... но результат не изменился вообще –

ответ

1

EDIT: Предыдущий подход MSER, как показано, не находит кругового пятна, хотя он выделяет область. Поэтому я попробовал Difference-of-Gaussians (DoG) для обнаружения blob, и это дает хорошие результаты. Вы можете поэкспериментировать с гауссовскими размерами ядра и их сигмами. Обратите внимание, что я удалил изображение и удалил структуры судна путем расширения до применения DoG. Порог изображения DoG дает вам капли.

Также я заметил, что интересующая вас область является глобальным максимумом изображения (возможно, это не так для другого изображения). Может быть, вы можете совместить это знание и с вашим алгоритмом.

DoG

dog

пороговую DoG

thresh

Global Max

max

код (C++) для собак approac ч

Mat im = imread("8Lzuq.jpg", 0); 
Mat dw; 

pyrDown(im, dw); 
pyrDown(dw, dw); 
pyrDown(dw, dw); 

Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(7, 7)); 
morphologyEx(dw, dw, CV_MOP_DILATE, kernel); 

Mat g1, g2, dog, bw; 
GaussianBlur(dw, g1, Size(31, 31), 21, 21); 
GaussianBlur(dw, g2, Size(65, 65), 31, 31); 
dog = g1 - g2; 
normalize(dog, dog, 0, 255, NORM_MINMAX); 

threshold(dog, bw, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); 

Point mx; 
minMaxLoc(dw, NULL, NULL, NULL, &mx); 

circle(dw, mx, 20, Scalar(255, 255, 255), 2); 

MSER подход

Я попробовал субдискретизации цветное изображение, расширяя его, а затем обнаруживать MSER с в отдельных каналах. Результат выглядит неплохо, хотя он не описывает диск как идеальный круг.

Синий канал:

bbmser

Зеленый канал:

ggmser

Красный канал:

rrmser

Обнаружение MSER в цветном изображении не получилось.

код в C++

Mat im = imread("8Lzuq.jpg"); 
Mat dw; 

pyrDown(im, dw); 
pyrDown(dw, dw); 
pyrDown(dw, dw); 

Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(7, 7)); 
morphologyEx(dw, dw, CV_MOP_DILATE, kernel); 

Mat ch[3]; 
split(dw, ch); 

MSER mser; 
vector<vector<Point>> regions; 

mser(ch[2], regions); 
Mat regionsMat = Mat::zeros(dw.rows, dw.cols, CV_8U); 

for (size_t i = 0; i < regions.size(); i++) 
{ 
    for (Point pt: regions[i]) 
    { 
     uchar& val = regionsMat.at<uchar>(pt); 
     if (val > 0) 
     { 
      val += 1; 
     } 
     else 
     { 
      val = 1; 
     } 
    } 

} 

imwrite("reg.jpg", regionsMat*50);