5

Я пытаюсь обнаружить изогнутый конвейер в изображении. Я использовал следующий код, используя преобразование поджилки, чтобы обнаружить ее краяКак обнаружить гладкие кривые в matlab

%# load image, and process it 
I = imread('ggp\2.jpg'); 
g = rgb2gray(I); 
bw = edge(g,'Canny'); 

[H,T,R] = hough(bw); 

P = houghpeaks(H,500,'threshold',ceil(0.4*max(H(:)))); 

% I apply houghlines on the grayscale picture, otherwise it doesn't detect 
% the straight lines shown in the picture 
lines = houghlines(g,T,R,P,'FillGap',5,'MinLength',50); 
figure, imshow(g), hold on 

for k = 1:length(lines) 

    xy = [lines(k).point1; lines(k).point2]; 

    deltaY = xy(2,2) - xy(1,2); 
    deltaX = xy(2,1) - xy(1,1); 
    angle = atan2(deltaY, deltaX) * 180/pi; 
    if (angle == 0) 

     plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green'); 

     % Plot beginnings and ends of lines 
     plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow'); 
     plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');   
    end 
end 

enter image description here

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

Кривые приблизительно обращаются вручную, изображенные на рисунке (красный цвет):

enter image description here

я не нашел кода или функции для преобразования Хка в MATLAB для обнаружения таких гладких кривых (например, 2-й полиномов степени : y= a*x^2). Любое другое решение также приветствуется.

Это исходное изображение: enter image description here

+0

Не могли бы вы предоставить нам исходное изображение? – Tapio

+0

@Tapio Я добавил фотографию к сообщению. – Ahmad

+1

Я не понимаю, какую кривую в изображении вы пытаетесь обнаружить. Можете ли вы вручную нарисовать изображение и выделить кривую, которую хотите найти? – Shai

ответ

3

Глядя на ваши прямые регистрирующих конвейер, я предполагаю, что вы можете сосредоточить свою обработку вокруг интересующей области (строки 750 до 950 в изображении).
Исходя из этой точки:

oimg = imread('http://i.stack.imgur.com/xfXUS.jpg'); %// read the image 
gimg = im2double(rgb2gray(oimg(751:950, :, :))); %// convert to gray, only the relevant part 
fimg = imfilter(gimg, [ones(7,50);zeros(1,50);-ones(7,50)]); %// find horizontal edge 

Выберите только сильные горизонтальные краевые пиксели вокруг центра области

[row, col] = find(abs(fimg)>50); 
sel = row>50 & row < 150 & col > 750 & col < 3250; 
row=row(sel); 
col=col(sel); 

Fit 2-ой Полином степени и линию для этих краевых точек

[P, S, mu] = polyfit(col,row,2); 
[L, lS, lmu] = polyfit(col, row, 1); 

Расчет расчетных кривых

xx=1:4000; 
figure;imshow(oimg,'border','tight'); 
hold on; 
plot(xx,polyval(P,xx,[],mu)+750,'LineWidth',1.5,'Color','r'); 
plot(xx,polyval(L,xx,[],lmu)+750,':g', 'LineWidth', 1.5); 

В результате

enter image description here

Вы можете визуально оценить как 2-й степени подходит P лучше подходит к границе конвейерной ленты. Глядя на первый коэффициент

>> P(1) 
ans = 
1.4574 

Вы видите, что коэффициент x^2 кривой не является незначительным, что делает кривую отчетливо не прямую линию.

+1

Большое спасибо! он работает, если я не получу другого ответа, я соглашусь с вами. – Ahmad

+0

Вы использовали 'imfilter' с матрицей 15 x 50, которая аналогична матрице' prewitt' 3 x 3. не могли бы вы сказать, почему я не мог использовать 'fspecial ('prewitt')' для определения горизонтального края в этом случае? Однако, поскольку я тестировал это, он не работает. – Ahmad

+0

15-на-50 НЕ 3-к-3. Обоснование фильтров одинаково: определение горизонтального края, но с 3 на 3 вы получаете очень локализованный результат, на который влияют небольшие ребра на изображении.Чтобы обнаружить только очень четкие и большие горизонтальные края, фильтр сглаживает область шириной 50 пикселей, чтобы четко определить края. Вы можете попробовать изменить размер фильтра на 5 на 50 или 5 на 100 и посмотреть, как он влияет на точность обнаружения. – Shai