資源簡介
matlab 傾斜校正算法的實例,內附源程序及圖像以供試驗

代碼片段和文件信息
clear?all;
close?all;
clc;
img=?imread(‘E:\matlab圖像處理學習\matlab傾斜校正(透視變換)\傾斜圖.jpg‘);
%?img=?rgb2gray(img);
figure(1)
imshow(mat2gray(img));
[M?N]?=?size(img);
dot=ginput();???????%取四個點,依次是左上,右上,左下,右下這里我取的是書的四個角
w=round(sqrt((dot(11)-dot(21))^2+(dot(12)-dot(22))^2));?????%從原四邊形獲得新矩形寬
h=round(sqrt((dot(11)-dot(31))^2+(dot(12)-dot(32))^2));?????%從原四邊形獲得新矩形高
y=[dot(11)?dot(21)?dot(31)?dot(41)];????????%四個原頂點
x=[dot(12)?dot(22)?dot(32)?dot(42)];
%這里是新的頂點,我取的矩形也可以做成其他的形狀
%大可以原圖像是矩形,新圖像是從dot中取得的點組成的任意四邊形.:)
Y=[dot(11)?dot(11)?dot(11)+h?dot(11)+h];?????
X=[dot(12)?dot(12)+w?dot(12)?dot(12)+w];
B=[X(1)?Y(1)?X(2)?Y(2)?X(3)?Y(3)?X(4)?Y(4)]‘;???%變換后的四個頂點,方程右邊的值
%聯立解方程組,方程的系數
A=[x(1)?y(1)?1?0?0?0?-X(1)*x(1)?-X(1)*y(1);?????????????
??0?0?0?x(1)?y(1)?1?-Y(1)*x(1)?-Y(1)*y(1);
???x(2)?y(2)?1?0?0?0?-X(2)*x(2)?-X(2)*y(2);
??0?0?0?x(2)?y(2)?1?-Y(2)*x(2)?-Y(2)*y(2);
???x(3)?y(3)?1?0?0?0?-X(3)*x(3)?-X(3)*y(3);
??0?0?0?x(3)?y(3)?1?-Y(3)*x(3)?-Y(3)*y(3);
???x(4)?y(4)?1?0?0?0?-X(4)*x(4)?-X(4)*y(4);
??0?0?0?x(4)?y(4)?1?-Y(4)*x(4)?-Y(4)*y(4)];
fa=inv(A)*B;????????%用四點求得的方程的解,也是全局變換系數
a=fa(1);b=fa(2);c=fa(3);
d=fa(4);e=fa(5);f=fa(6);
g=fa(7);h=fa(8);
rot=[d?e?f;
?????a?b?c;
?????g?h?1];????????%公式中第一個數是xMatlab第一個表示y,所以我矩陣12行互換了
pix1=rot*[1?1?1]‘/(g*1+h*1+1);??%變換后圖像左上點
pix2=rot*[1?N?1]‘/(g*1+h*N+1);??%變換后圖像右上點
pix3=rot*[M?1?1]‘/(g*M+h*1+1);??%變換后圖像左下點
pix4=rot*[M?N?1]‘/(g*M+h*N+1);??%變換后圖像右下點
height=round(max([pix1(1)?pix2(1)?pix3(1)?pix4(1)])-min([pix1(1)?pix2(1)?pix3(1)?pix4(1)]));?????%變換后圖像的高度
width=round(max([pix1(2)?pix2(2)?pix3(2)?pix4(2)])-min([pix1(2)?pix2(2)?pix3(2)?pix4(2)]));??????%變換后圖像的寬度
imgn=zeros(heightwidth);
delta_y=round(abs(min([pix1(1)?pix2(1)?pix3(1)?pix4(1)])));????????????%取得y方向的負軸超出的偏移量
delta_x=round(abs(min([pix1(2)?pix2(2)?pix3(2)?pix4(2)])));????????????%取得x方向的負軸超出的偏移量
inv_rot=inv(rot);
for?i?=?1-delta_y:height-delta_y????????????????????????%從變換圖像中反向尋找原圖像的點,以免出現空洞,和旋轉放大原理一樣
????for?j?=?1-delta_x:width-delta_x
????????pix=inv_rot*[i?j?1]‘;???????%求原圖像中坐標,因為[YW?XW?W]=fa*[y?x?1]所以這里求的是[YW?XW?W]W=gy+hx+1;
????????pix=inv([g*pix(1)-1?h*pix(1);g*pix(2)?h*pix(2)-1])*[-pix(1)?-pix(2)]‘;?%相當于解[pix(1)*(gy+hx+1)?pix(2)*(gy+hx+1)]=[y?x]這樣一個方程,求y和x,最后pix=[y?x];
????????
????????if?pix(1)>=0.5?&&?pix(2)>=0.5?&&?pix(1)<=M?&&?pix(2)<=N
????????????imgn(i+delta_yj+delta_x)=img(round(pix(1))round(pix(2)));?????%最鄰近插值也可以用雙線性或雙立方插值
????????end??
????end
end
figure(2);
imshow(uint8(imgn));
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????2881??2017-07-20?22:55??matlab傾斜校正(透視變換)\main.m
?????文件???????11166??2017-07-20?20:04??matlab傾斜校正(透視變換)\傾斜圖.jpg
?????目錄???????????0??2017-07-20?20:06??matlab傾斜校正(透視變換)\
- 上一篇:歐拉角/四元數轉化為機器手坐標系描述矩陣
- 下一篇:matlab 自適應增強算法
評論
共有 條評論