1

我需要使用 MATLAB 处理图像。这是一项简单的任务,除了一个部分,我几乎完成了所有工作。

基本上,我有一个城市地平线的形象。我使用Hough 变换Canny 边缘检测处理图像。接下来,边缘检测会检测到许多不同的线条,并将它们绘制出来。但是,我需要使用边缘检测给出的点在主地平线上绘制一条新线。我已经想出了如何让第一个点在真实的地平线上画线,但我无法让第二个点画出那条线。

它需要扫描右侧的图像,当它在 Canny 边缘检测坐标上检测到一个点时,它会将坐标存储起来,并将其作为第二个点来绘制线条。我怎样才能做到这一点?

我相信它使用了一个简单的“for”循环或“ismember”,但我不确定该怎么做。对于左侧的第一个坐标,我使用了数组中的最小值,这很容易。但是对于第二个坐标,它需要做的是从上到下扫描最右边的图像。当它检测到一个坐标时,它实际上会存储这个坐标,并用它来创建跨越真实地平线的线。

我的代码如下。

    I = imread('Picture9.jpg'); % Input image file here
    dim = size(I); % Get size of the image and store in an array called 'dim'.
    %size array matrix; 1 is height, 2 is width
    height = dim(1);
    width = dim(2);
end

I = rgb2gray(I); % Convert to grayscale
BW = edge(I,'canny',[]); % Edge detection using Canny
imshow(BW);
[H,T,R] = hough(BW);

%  figure, imshow(H,[], 'XData', T, 'YData', R, 'InitialMagnification', 'fit');
%  xlabel('\theta'), ylabel('\rho');
axis on, axis normal, hold on;
P  = houghpeaks(H,50,'threshold',ceil(0.1*max(H(:))));

% Set houghpeaks parameters, threshold unsure
x = T(P(:,2));
y = R(P(:,1));
plot(x,y,'s','color','white');

% Apply median filtering
I = medfilt2(I);

% Find lines and plot them
lines = houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);
figure, imshow(I),imagesc(I), hold on
max_len = 0;
for k = 1:length(lines)
    xy = [lines(k).point1; lines(k).point2];
    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

showlines = struct(lines);
cellData = struct2cell(showlines);

% X-coordinates are for width
% Y-coordinates are for height
%point1(x y) etc
for i = 1:280
    % 'A' stores all 'x' coordinates of point 1
    A([i,i+1])= [cellData{1,i}];
    % 'B' stores all 'x' coordinates of point 2
    B([i,i+1])= [cellData{2,i}];
    % 'C' stores all 'y' coordinates of point 1
    C([i,i])= [cellData{1,i}];
    % 'D' stores all 'y' coordinates of point 2
    D([i,i])= [cellData{2,i}];
end

这是我试图让第二点画线的部分。但这是错误的。还有其他更适合的方法吗?

for height = 1:dim(1)
    for width = 635:dim(2)
        if X(height,width) == J(D,B)
            newpos = J(C,A);
        end
    end
end

plot( [((min(A)+min(B))/2),max(B)], [((min(C)+min(D))/2),newpos], 'LineWidth', 2, 'Color', 'red');
4

0 回答 0