2

Hough lines을 사용하여 이미지의 선을 감지 한 후이를 사용하여 참조 이미지의 선의 각도 (회전) 변화를 계산하는 방법은 무엇입니까?MATLAB의 Houghlines

답변

3

참고 :이 후속 질문, 배경이 참조입니다 :


과정과 유사한 것 전에 보여 줬어. 아래에서 나는 the images from your previous question을 사용하고 있습니다 (단 하나만 제공했기 때문에 첫 번째를 10도 회전하여 다른 것을 만들었습니다).

두 이미지의 선을 감지하여 시작합니다. 우리는 Houghtransformfunctions의 도움으로이 작업을 수행합니다. 이 같은 모습이 모두 이미지에 적용 :

Images with detected lines and points order

다음으로, 우리는 제어 지점으로 선 끝점을 사용하여 이미지 등록을 수행 할. 먼저 두 이미지에서 점이 서로 일치하는지 확인합니다. 이는 convexhead를 convhull을 사용하여 반 시계 방향으로 자동 정렬 (또는 반대 방향으로 계산)하여 계산합니다. 위에 표시된 숫자는 순서를 나타냅니다.

마지막으로 우리는 이미지를 정렬하고 변환, 회전 및 크기 조정을 추출하는 데 사용하는 변환 행렬을 얻기 위해 함수 cp2tform을 사용합니다.

다음 전체 코드입니다 :

%% # Step 1: read and prepare images 
%# (since you provided only one, I created the other by rotating the first). 
I1 = imread('http://i.stack.imgur.com/Se6zX.jpg'); 
I1 = rgb2gray(imcrop(I1, [85 35 445 345])); %# Get rid of white border 
I2 = imrotate(I1, -10, 'bilinear', 'crop'); %# Create 2nd by rotating 10 degrees 

%% # Step 2: detect the cross sign endpoints (sorted in same order) 
p1 = getCross(I1); 
p2 = getCross(I2); 

%% # Step 3: perform Image Registration 
%# Find transformation that maps I2 to I1 using the 4 control points for each 
t = cp2tform(p2,p1,'affine'); 

%# Transform I2 to be aligned with I1 
II2 = imtransform(I2, t, 'XData',[1 size(I1,2)], 'YData',[1 size(I1,1)]); 

%# Plot 
figure('menu','none') 
subplot(131), imshow(I1), title('I1') 
subplot(132), imshow(I2), title('I2') 
subplot(133), imshow(II2), title('I2 (aligned)') 

%# Recover affine transformation params (translation, rotation, scale) 
ss = t.tdata.Tinv(2,1); 
sc = t.tdata.Tinv(1,1); 
tx = t.tdata.Tinv(3,1); 
ty = t.tdata.Tinv(3,2); 
scale = sqrt(ss*ss + sc*sc) 
rotation = atan2(ss,sc)*180/pi 
translation = [tx ty] 

그리고 여기에 라인 엔드 포인트 추출 함수의 : 결과와

function points = getCross(I) 
    %# Get edges (simply by thresholding) 
    I = imfilter(I, fspecial('gaussian', [7 7], 1), 'symmetric'); 
    BW = imclearborder(~im2bw(I, 0.5)); 

    %# Hough transform 
    [H,T,R] = hough(BW); 

    %# Detect peaks 
    P = houghpeaks(H, 2); 

    %# Detect lines 
    lines = houghlines(BW, T, R, P); 

    %# Sort 2D points in counterclockwise order 
    points = [vertcat(lines.point1); vertcat(lines.point2)]; 
    idx = convhull(points(:,1), points(:,2)); 
    points = points(idx(1:end-1),:); 
end 

을 :

Resulting aligned image

scale = 
    1.0025 
rotation = 
    -9.7041 
translation = 
    32.5270 -38.5021 

회전은 거의 10도 (불가 피한 오류가 있음)로 복구되며, 비율 조정은 효과적으로 1 (즉 줌이 없음을 의미)입니다. 위의 예에서는 교차 기호의 중심을 중심으로 회전이 수행되지 않았으므로 변환 구성 요소가 있음을 참고하십시오.

+0

안녕하세요, 번역의 숫자는 무엇을 의미합니까? 움직이는 픽셀 수는? 나는 픽셀 수준으로 확대하려고 시도하고 이동 된 픽셀을 계산하지만 계산하지는 않습니다. 감사.당신의 도움에 정말로 감사 할 것입니다. – Veronica

+0

이미지 등록 부분을 수행 한 후 우리는 회전 및 변환을 추출하는 아핀 변환 행렬로 끝납니다. 이제 제가 말했듯이 회전이 교차 사인 센터와 관련이 없으므로 두 번째 이미지를 만드는 과정에서 번역이 이루어져야합니다 ..이 프로세스를 실제 이미지에 적용하려 했습니까? 게다가,이 경우 우리는 궁극적으로 우리가 성공적으로 회복 한 회전 부분에만 관심이 있습니다 (-9.7도, 거의 10) !! – Amro

+0

안녕하세요, 실제 이미지에서이 과정을 시도했습니다. 내 이미지가 십자 기호의 중심을 중심으로 회전하지 않으므로이 이미지가 번역되어 있어야합니다. 감사! – Veronica

0

허프 (Hough) 변형의 구현은 무엇인지 모르겠지만 선의 방향은 식별하는 데 사용한 각도에 따라 직각 (90도 또는 π/2 라디안)이됩니다. 처음부터 그 줄.

도움이 되었기를 바랍니다. Wikipedia는 웹에서 Hough 변환을 적절히 다루는 곳입니다. 독자