Обрезка img, которая дается независящим кругам для ускорения, не приводит к результатам [MATLAB] - PullRequest
0 голосов
/ 05 июля 2019

Привет, ребята, у меня есть этот код, который, учитывая обрезанное изображение, пытается найти радужную оболочку, это рабочий фрагмент кода настоящей программы:

clc
clear all
path = './vid/primaprovaedited/Luca Neutro.avi';
tic
video = VideoReader(path);
sourceImg = readFrame(video);
sourceImgL = insertText(sourceImg,[0,0],'Draw a rectangle around the eye displayed to the LEFT and press ENTER', 'FontSize', 40, 'BoxColor', 'red');
h  = figure;
imshow(sourceImgL);
r1 = drawrectangle('Label','Eye to the left','Color',[1 0 0],'Position',[500,500,500,500]);
pause;
leftEyeRectange = r1.Position;
sourceImg = readFrame(video);
sourceImg = imcrop(sourceImg, leftEyeRectange);
%sourceImg = imresize(sourceImg, 0.5); % Reduce img size for permormance issue
r=0.8;
low=[0 0.05 0.025 0.020 0.010 0.05 0.04]; 
for i=1:size(low,2)
    r=r+low(i);
    [centers, radii] = imfindcircles(sourceImg, [40 60],'ObjectPolarity','dark','Sensitivity', r);
    if ~isempty(centers)
        center = centers(1,:);
        radius = radii(1,:);
        sourceImg = insertShape(sourceImg, 'Circle', [center(1,1), center(1,2), radius(1)], 'LineWidth',2, 'Color','red');
        break;
    end
end
figure;
imshow(sourceImg);
imdistline;
toc

Работает просто отлично, но занимает много времени, в основном потому, что img, переданный в функцию imfindcircle, слишком велик. Поэтому я попытался ускорить его, уменьшив и масштабировав входное изображение (теперь область обрезки составляет 250x250, а размер уменьшен):

clc
clear all
path = './vid/primaprovaedited/Luca Neutro.avi';
tic
video = VideoReader(path);
sourceImg = readFrame(video);
sourceImgL = insertText(sourceImg,[0,0],'Draw a rectangle around the eye displayed to the LEFT and press ENTER', 'FontSize', 40, 'BoxColor', 'red');
h  = figure;
imshow(sourceImgL);
r1 = drawrectangle('Label','Eye to the left','Color',[1 0 0],'Position',[500,500,250,250]); %smaller cropped img
pause;
leftEyeRectange = r1.Position;
sourceImg = readFrame(video);
sourceImg = imcrop(sourceImg, leftEyeRectange);
sourceImg = imresize(sourceImg, 0.5); % Reduce img size for permormance issue
r=0.8;
low=[0 0.05 0.025 0.020 0.010 0.05 0.04]; 
for i=1:size(low,2)
    r=r+low(i);
    [centers, radii] = imfindcircles(sourceImg, [20 40],'ObjectPolarity','dark','Sensitivity', r); %reduced radius
    if ~isempty(centers)
        center = centers(1,:);
        radius = radii(1,:);
        sourceImg = insertShape(sourceImg, 'Circle', [center(1,1), center(1,2), radius(1)], 'LineWidth',2, 'Color','red');
        break;
    end
end
figure;
imshow(sourceImg);
imdistline;
toc

Тем не менее, даже несмотря на то, что img по-прежнему ясно (я могу просмотреть его с помощью последнего imshow), и я ввел правильный диапазон радиуса (рассчитанный с использованием последней imstistline), я все равно не получаю ни окружности, ни случайных.

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

Если вам интересно, попробуйте вот это видео Спасибо за вашу помощь!

...