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
回复 海轰 即可

猜你喜欢

转载自blog.csdn.net/weixin_44225182/article/details/100600364
今日推荐