利用MATLAB通过矩阵变化实现图像的平移缩放和旋转,要一个程序两者同时进行
来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/09/29 20:45:23
利用MATLAB通过矩阵变化实现图像的平移缩放和旋转,要一个程序两者同时进行
根据矩阵计算:
平移旋转以后,还需要插值,才能显示完整的图像
clear all; close all; clc;
img=imread('lena.bmp');
[h w]=size(img);
%平移旋转参数
a = 10; b = 20;
theta = 30 /180*pi;
% 旋转矩阵
rot=[cos(theta) -sin(theta) 0;
sin(theta) cos(theta) 0;
0 0 1];
% 平移矩阵
move = [ 1 0 a;
0 1 b;
0 0 1];
%平移加旋转
rot = rot * move;
pix1=[a b 1]*rot;\x09% 左上点的坐标
pix2=[a w+b 1]*rot; % 右上点的坐标
pix3=[h+a b 1]*rot;\x09% 左下点的坐标
pix4=[h+a w+b 1]*rot;\x09% 右下点的坐标
height = round(max([abs(pix1(1)-pix4(1)) abs(pix2(1)-pix3(1))])); %变换后图像的高度
width = round( max([abs(pix1(2)-pix4(2)) abs(pix2(2)-pix3(2))])); %变换后图像的宽度
imgn=zeros(height,width);
delta_y = abs(min([pix1(1) pix2(1) pix3(1) pix4(1)]));
delta_x = abs(min([pix1(2) pix2(2) pix3(2) pix4(2)]));
for i=1-delta_y:height
for j=1-delta_x:width
pix=[i j 1]/rot; %用变换后图像的点的坐标去寻找原图像点的坐标,
float_Y=pix(1)-floor(pix(1));
float_X=pix(2)-floor(pix(2));
if pix(1)>=1 && pix(2)>=1 && pix(1) <= h && pix(2) <= w
pix_up_left=[floor(pix(1)) floor(pix(2))]; %四个相邻的点
pix_up_right=[floor(pix(1)) ceil(pix(2))];
pix_down_left=[ceil(pix(1)) floor(pix(2))];
pix_down_right=[ceil(pix(1)) ceil(pix(2))];
value_up_left=(1-float_X)*(1-float_Y);\x09\x09
value_up_right=float_X*(1-float_Y);
value_down_left=(1-float_X)*float_Y;
value_down_right=float_X*float_Y;
\x09imgn(i+delta_y,j+delta_x) = value_up_left*img(pix_up_left(1),pix_up_left(2))+...
\x09value_up_right*img(pix_up_right(1),pix_up_right(2))+...
\x09value_down_left*img(pix_down_left(1),pix_down_left(2))+...
\x09value_down_right*img(pix_down_right(1),pix_down_right(2));
end
end
end
imshow(uint8(imgn));title('平移旋转并插值');
平移旋转以后,还需要插值,才能显示完整的图像
clear all; close all; clc;
img=imread('lena.bmp');
[h w]=size(img);
%平移旋转参数
a = 10; b = 20;
theta = 30 /180*pi;
% 旋转矩阵
rot=[cos(theta) -sin(theta) 0;
sin(theta) cos(theta) 0;
0 0 1];
% 平移矩阵
move = [ 1 0 a;
0 1 b;
0 0 1];
%平移加旋转
rot = rot * move;
pix1=[a b 1]*rot;\x09% 左上点的坐标
pix2=[a w+b 1]*rot; % 右上点的坐标
pix3=[h+a b 1]*rot;\x09% 左下点的坐标
pix4=[h+a w+b 1]*rot;\x09% 右下点的坐标
height = round(max([abs(pix1(1)-pix4(1)) abs(pix2(1)-pix3(1))])); %变换后图像的高度
width = round( max([abs(pix1(2)-pix4(2)) abs(pix2(2)-pix3(2))])); %变换后图像的宽度
imgn=zeros(height,width);
delta_y = abs(min([pix1(1) pix2(1) pix3(1) pix4(1)]));
delta_x = abs(min([pix1(2) pix2(2) pix3(2) pix4(2)]));
for i=1-delta_y:height
for j=1-delta_x:width
pix=[i j 1]/rot; %用变换后图像的点的坐标去寻找原图像点的坐标,
float_Y=pix(1)-floor(pix(1));
float_X=pix(2)-floor(pix(2));
if pix(1)>=1 && pix(2)>=1 && pix(1) <= h && pix(2) <= w
pix_up_left=[floor(pix(1)) floor(pix(2))]; %四个相邻的点
pix_up_right=[floor(pix(1)) ceil(pix(2))];
pix_down_left=[ceil(pix(1)) floor(pix(2))];
pix_down_right=[ceil(pix(1)) ceil(pix(2))];
value_up_left=(1-float_X)*(1-float_Y);\x09\x09
value_up_right=float_X*(1-float_Y);
value_down_left=(1-float_X)*float_Y;
value_down_right=float_X*float_Y;
\x09imgn(i+delta_y,j+delta_x) = value_up_left*img(pix_up_left(1),pix_up_left(2))+...
\x09value_up_right*img(pix_up_right(1),pix_up_right(2))+...
\x09value_down_left*img(pix_down_left(1),pix_down_left(2))+...
\x09value_down_right*img(pix_down_right(1),pix_down_right(2));
end
end
end
imshow(uint8(imgn));title('平移旋转并插值');
利用MATLAB通过矩阵变化实现图像的平移缩放和旋转,要一个程序两者同时进行
求MATLAB GUI 环境下 图像处理图像的平移,任意角度的旋转,缩放和翻转,仿射变换等的源代码
MATLAB 利用旋转矩阵来编写一个旋转图像的函数 只要对就再追加100分
用MATLAB自带的函数对图像进行旋转、平移的问题
利用Matlab画函数图像的程序
求matlab程序 对一个任意信号进行采样和恢复 用MATLAB实现
一个大的矩阵中有很都的零点,对其进行插值的同时如何保持矩阵大小不变,用matlab如何实现
编写一个程序实现一个矩阵类,通过重载+,-,*运算符来实现矩阵的加,减,乘操作.
几何画板中如何使图像旋转同时缩放
我想用matlab 来实现以下的小程序:随机产生一个布尔矩阵(要保证这个矩阵的每一列至少有一个1) 每次
一个图像的最大、最小灰度阈值如何用MATLAB程序实现(最好能举例说明)
利用matlab要实现如下函数,其中m代表min M代表max,我的程序如下,目标图形如下 实际图像是最后那个