MATLABを使用して画像を処理する必要があります。これは単純な割り当てであり、一部を除いてほとんどすべてを実行しました。
基本的に、私は都市の地平線のイメージを持っています。ハフ変換とキャニーエッジ検出を使用して画像を処理します。次に、エッジ検出が線を検出するさまざまな線があり、それらを描画します。ただし、エッジ検出から与えられたポイントを使用して、メインホライズンを横切る新しい線をプロットする必要があります。真の地平線を横切る線を引くための最初の点を取得する方法はすでに理解していますが、その線を引くための2番目の点を取得することはできません。
右側の画像をスキャンする必要があり、キャニーエッジ検出座標上の点を検出すると、座標を保存し、線を引くための2番目の点として使用します。どうやってやるの?
単純な「for」ループまたは「ismember」を使用していると思いますが、正確な方法はわかりません。左側の最初の座標には、配列の最小値を使用しました。これは簡単です。ただし、2番目の座標では、右端の画像を上から下にスキャンする必要があります。そして、座標を検出すると、実際にこの座標を保存し、それを使用して実際の地平線を横切る線を作成します。
私のコードは以下の通りです。
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
これは、線を引くための2番目のポイントを取得しようとしている部分です。しかし、それは間違っています。より適切な他の方法はありますか?
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');