我需要使用 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');