MATLAB--數字圖像處理 圖像平移

圖像平移

對於圖像的平移,MATLAB中是可以利用膨脹函數平移圖像。
代碼:

I = imread('a1.jpg');
se = translate(strel(1), [50 140]);%將一個平面結構化元素分別向下和向右移動30個位置
J = imdilate(I,se);%利用膨脹函數平移圖像
subplot(121);imshow(I), title('原圖')
subplot(122), imshow(J), title('移動後的圖像');

效果圖:
在這裏插入圖片描述
這裏我重點說平移的基本原理及代碼實現。

首先,我們必須要知道圖像是怎麼平移的?圖像可以看成二維矩陣,由很多的像素點組成,假設一個像素點的座標爲(1,2),我們向下平移2個像素,向右平移3個像素,那麼目標座標就是(3,5)。這個在二維座標中很好得出結果,無非就是橫縱座標加減偏移地址罷了,但是在矩陣中怎麼算呢?其實這裏有幾種方法,但思維都是一樣的。看原理:
假設(x0,y0)是原圖像的點,Tx是x方向偏移量,Ty是y方向偏移量(圖像處理一般向下爲x軸,向右爲y軸)。那麼(x1,y1)可以由下圖矩陣計算。

在這裏插入圖片描述
通過上面的矩陣運算,我們對原圖像的中的每一個像素點進行該變換(僅僅是位置變換),得到新的座標,然後在新座標下顯示原圖像。

代碼(這個是copy別人的,她用的矩陣變換和我的不一樣,但是原理相同):

I=rgb2gray(imread('a1.jpg'));%讀入圖片並轉化爲灰度圖
subplot(1,2,1),imshow(I),title('原圖');                   %建立窗口,顯示灰度圖I
[r,c]=size(I);                      %計算灰度圖的大小,r表示行,c表示列,即通過size函數將灰度圖I的行數存在矩陣的r中,列數存在矩陣的c中,這樣就知道灰度圖的大小是r×c
dst=zeros(r,c);                     %建立r×c的0矩陣(平移結果矩陣),初始化爲零(黑色)
dx=50;                              %平移的x方向的距離,這裏是豎直方向
dy=80;                              %平移的y方向的距離,這裏是水平方向
tras=[1 0 dx;0 1 dy;0 0 1];         %平移變換矩陣
for i=1:r
    for j=1:c
        temp=[i;j;1];               %灰度圖I要平移變換的點,這裏用矩陣表示
        temp=tras*temp;             %矩陣相乘,得到三行一列的矩陣temp,即平移後的矩陣
        x=temp(1,1);                %把矩陣temp的第一行第一列的元素給x   
        y=temp(2,1);                %把矩陣temp的第二行第一列的元素給y 
        if(x>=1&&x<=r)&&(y>=1&&y<=c)%判斷所變換後得到的點是否越界
            dst(x,y)=I(i,j);        %得到平移結果矩陣,點(x,y)是由點(i,j)平移而來的,有對應關係 
        end
    end
end
subplot(1,2,2),imshow(uint8(dst)),title('平移後');          %建立窗口,顯示平移後的圖

效果圖:
在這裏插入圖片描述
效果雖然達到了,但是,她的這種寫法好像都變成了灰色圖片。那麼怎麼得到和膨脹函數的效果一樣呢?
這個也簡單,我們只需要對原圖像的三個通道分別平移,再合成就ok了(就是這麼簡單,哈哈)。
代碼(這個纔是我寫的):

 t=imread('a1.jpg');

%分別提取三通道的矩陣
t_1=t(:,:,1)
t_2=t(:,:,2)
t_3=t(:,:,3)

%這裏不能是[m,n]=size(t),我們是用三個二維矩陣合成一個三維圖片(這裏圖片看出三維,畢竟有RGB)
[m,n,z]=size(t);

% 定義偏移量
dx=50;
dy=140;

%定義新矩陣 ,存儲新座標
r_1=zeros(m,n);
r_2=zeros(m,n);
r_3=zeros(m,n);

%martix 變換用的矩陣
martix=[1,0,dx;0,1,dy;0,0,1];

%座標變換
for i=1:m
for j=1:n
tem=[i;j;1];
tem=martix*tem;
x=tem(1,1);
y=tem(2,1);
if(x>=1&&x<=m)&&(y>=1&&y<=n)
r_1(x,y)=t_1(i,j);
r_2(x,y)=t_2(i,j);
r_3(x,y)=t_3(i,j);
end
end
end

%得到三個新矩陣合成一張圖片
rt=t
rt(:,:,1)=r_1;
rt(:,:,2)=r_2;
rt(:,:,3)=r_3;

%顯示
subplot(1,2,1),imshow(t),title('原圖');
subplot(1,2,2),imshow(rt),title('平移後');

效果圖:
在這裏插入圖片描述

更多

獲取更多資料、代碼,微信公衆號:海轟Pro
回覆 海轟 即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章