Các giải pháp lần đầu tiên được ám chỉ bởi @AruniRC trong các ý kiến, sau đó thực hiện bởi @belisarius trong Mathematica. Sau đây là cách giải thích của tôi trong MATLAB. Ý tưởng về cơ bản là giống nhau: phát hiện các cạnh bằng cách sử dụng phương pháp Canny, tìm các đường nổi bật bằng cách sử dụng Biến đổi Hough, tính toán góc đường thẳng, cuối cùng thực hiện Chuyển đổi Cắt để căn chỉnh hình ảnh.
%# read and crop image
I = imread('http://i.stack.imgur.com/CJHaA.png');
I = I(:,1:end-3,:); %# remove small white band on the side
%# egde detection
BW = edge(rgb2gray(I), 'canny');
%# hough transform
[H T R] = hough(BW);
P = houghpeaks(H, 4, 'threshold',ceil(0.75*max(H(:))));
lines = houghlines(BW, T, R, P);
%# shearing transforma
slopes = vertcat(lines.point2) - vertcat(lines.point1);
slopes = slopes(:,2) ./ slopes(:,1);
TFORM = maketform('affine', [1 -slopes(1) 0 ; 0 1 0 ; 0 0 1]);
II = imtransform(I, TFORM);
Bây giờ cho phép xem kết quả
%# show edges
figure, imshow(BW)
%# show accumlation matrix and peaks
figure, imshow(imadjust(mat2gray(H)), [], 'XData',T, 'YData',R, 'InitialMagnification','fit')
xlabel('\theta (degrees)'), ylabel('\rho'), colormap(hot), colorbar
hold on, plot(T(P(:,2)), R(P(:,1)), 'gs', 'LineWidth',2), hold off
axis on, axis normal
%# show image with lines overlayed, and the aligned/rotated image
figure
subplot(121), imshow(I), hold on
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
plot(xy(:,1), xy(:,2), 'g.-', 'LineWidth',2);
end, hold off
subplot(122), imshow(II)

nếu điều này là OpenCV tôi muốn nói tìm dòng Hough gần-ngang nổi bật nhất, tính toán góc của nó, sau đó thực hiện chuyển đổi affine bằng ma trận xoay với góc như đã tính trước đó. Điều này có bất kỳ tương đương matlab? Sau đó, bạn có thể thấy nó hữu ích. – AruniRC