Hough lines을 사용하여 이미지의 선을 감지 한 후이를 사용하여 참조 이미지의 선의 각도 (회전) 변화를 계산하는 방법은 무엇입니까?MATLAB의 Houghlines
답변
참고 :이 후속 질문, 배경이 참조입니다 :
- How to select maximum intensity in Hough transform in MATLAB?
- Calculating displacement moved in MATLAB
과정과 유사한 것 전에 보여 줬어. 아래에서 나는 the images from your previous question을 사용하고 있습니다 (단 하나만 제공했기 때문에 첫 번째를 10도 회전하여 다른 것을 만들었습니다).
두 이미지의 선을 감지하여 시작합니다. 우리는 Houghtransformfunctions의 도움으로이 작업을 수행합니다. 이 같은 모습이 모두 이미지에 적용 :
다음으로, 우리는 제어 지점으로 선 끝점을 사용하여 이미지 등록을 수행 할. 먼저 두 이미지에서 점이 서로 일치하는지 확인합니다. 이는 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
을 :
scale =
1.0025
rotation =
-9.7041
translation =
32.5270 -38.5021
회전은 거의 10도 (불가 피한 오류가 있음)로 복구되며, 비율 조정은 효과적으로 1 (즉 줌이 없음을 의미)입니다. 위의 예에서는 교차 기호의 중심을 중심으로 회전이 수행되지 않았으므로 변환 구성 요소가 있음을 참고하십시오.
허프 (Hough) 변형의 구현은 무엇인지 모르겠지만 선의 방향은 식별하는 데 사용한 각도에 따라 직각 (90도 또는 π/2 라디안)이됩니다. 처음부터 그 줄.
도움이 되었기를 바랍니다. Wikipedia는 웹에서 Hough 변환을 적절히 다루는 곳입니다. 독자
- 1. MATLAB의 벡터화
- 2. MATLAB의 Elementwise ifs - 존재합니까?
- 3. MATLAB의 눈 탐지
- 4. Matlab의 적외선 이미지 프로세싱
- 5. MATLAB의 윤곽 행렬
- 6. Matlab의 bsxfun() 코드
- 7. Matlab의 축 재설정
- 8. Matlab의 열 선택
- 9. MATLAB의 고유 값
- 10. Matlab의 동적 구조 생성
- 11. MATLAB의 im2bw 명명 규칙
- 12. MATLAB의 FFT (도움이 필요합니다)
- 13. MATLAB의 신경망 입력 바이어스
- 14. MATLAB의 용어와 같은 그룹화
- 15. MatLab의 서브 플로트
- 16. MATLAB의 여러 시간 카운터
- 17. matlab의 컬러 맵
- 18. Matlab의 행렬에 헤더 추가하기
- 19. MATLAB의 fminsearch 함수
- 20. Matlab의 kmeans 중심점
- 21. MATLAB의 채색 섹터
- 22. Matlab의 3D 플로팅
- 23. Matlab의 임계 분해 분해
- 24. matlab의 3D 셀 배열
- 25. MATLAB의 희소 세트에 bwhitmiss
- 26. Matlab의 라인 플롯
- 27. MATLAB의 베이지안 네트워크
- 28. Matlab의 실시간 데이터
- 29. Matlab의 두 벡터를 비교하십시오
- 30. MATLAB의 SVM 시각화
안녕하세요, 번역의 숫자는 무엇을 의미합니까? 움직이는 픽셀 수는? 나는 픽셀 수준으로 확대하려고 시도하고 이동 된 픽셀을 계산하지만 계산하지는 않습니다. 감사.당신의 도움에 정말로 감사 할 것입니다. – Veronica
이미지 등록 부분을 수행 한 후 우리는 회전 및 변환을 추출하는 아핀 변환 행렬로 끝납니다. 이제 제가 말했듯이 회전이 교차 사인 센터와 관련이 없으므로 두 번째 이미지를 만드는 과정에서 번역이 이루어져야합니다 ..이 프로세스를 실제 이미지에 적용하려 했습니까? 게다가,이 경우 우리는 궁극적으로 우리가 성공적으로 회복 한 회전 부분에만 관심이 있습니다 (-9.7도, 거의 10) !! – Amro
안녕하세요, 실제 이미지에서이 과정을 시도했습니다. 내 이미지가 십자 기호의 중심을 중심으로 회전하지 않으므로이 이미지가 번역되어 있어야합니다. 감사! – Veronica