绿红交换、生成蓝色单通道图、成灰度图、平移、放缩、旋转、单应变化

  1. 输入(0分):
  1. 在 http://sipi.usc.edu/database/database.php?volume=misc 选择一张彩色图像,
    尺寸不大于512 × 512,下载到 Matlab 工作目录;
  2. 创建脚本文件(script),并命名为“a1_script.m”;
  3. 使用 imread 读取图像,存储在变量 img 中,并使用 imshow显示;
  1. 色彩通道(2分):
  1. 交换 img 中绿色和红色通道,获得新图像,并显示;
  2. 选择 img 中蓝色通道,生成单色图像,并显示;
  3. 将 img 转换成灰度图(grayscale),并显示,详见 rgb2gray;
  1. 图像二维变换(2 分+2 分+2分+2分,共 8 分):
    处理灰度图即可。对于每种变换,首先确定其对应的变换矩阵,然后通过矩阵
    乘法找到每个像素变换后的坐标(注意使用齐次坐标),接着通过坐标平移避免出
    现负数坐标(仅在出现负数坐标时),最后使用 interp2 函数在整数像素网格上插值,
    获得变换后的图像。
  1. 创建函数 my_translate(img, dx, dy),实现将图像沿 x轴平移 dx像素,沿 y轴
    平移 dy 像素;
  2. 创建函数 my_rotate(img, theta),实现将图像关于原点逆时针旋转 theta度;
  3. 创建函数 my_scale(img, sx, sy),实现将图像在 x 轴缩放 sx 倍,在 y 轴缩放
    sy倍;
  4. 创建函数 my_homography(img, X, Y),通过 X、Y依次输入原始图像左上、
    右上、左下、右下四个角的坐标经变换后的目标坐标,实现图像的单应变
    换。以512 × 512图像为例,其四个角的原始坐标依次为(1, 1)、(1, 512)、
    (512, 1)、(512, 512),通过 X、Y 指定上述 4 个坐标经过变换后的坐标,与
    原始坐标构成 4 对对应点,计算其对应的单应矩阵并应用;
  5. 在“a1_script.m”中依次调用上述 4 种变换函数,并显示结果图像;对于单
    应变``换,选择合适的 X、Y使得输出图像为梯形。

img=imread(‘4.2.07.tiff’);
figure(‘name’,‘原图’); %窗口
imshow(img);
title(‘Original’); %标题

%绿红交换
img1=img;
img1(:,:,2)=img(:,:,1); %1红,2绿,3蓝
img1(:,:,1)=img(:,:,2);
figure(‘name’,‘绿红交换’);
subplot(121),imshow(img),title(‘Original’);
subplot(122),imshow(img1),title(‘Green-Red’);

%生成蓝色单通道图像
imgb=img(:,:,3);
figure(‘name’,‘蓝色单通道图像’);
imshow(imgb);
title(‘Blue’);

%img转换成灰度图
img_grayscale=rgb2gray(img);
figure(‘name’,‘灰度图’);
imshow(img_grayscale);
title(‘Grayscale’);

%创建函数 my_translate(img, dx, dy),实现将图像沿 x 轴平移 dx 像素,沿 y 轴平移 dy 像素
img2=my_translate(img_grayscale, 50, 50);
figure(‘name’,‘图像平移’);
imshow(interp2(img2,2)); %将每个维度上网格点之间的间隔重复分割优化2次来增加插入值,图像太大,无法在屏幕上显示;将以 25% 显示
title(‘Image Translation’);

%创建函数 my_rotate(img_grayscale, theta),实现将图像关于原点逆时针旋转 theta 度;
img3=my_rotate(img_grayscale, 15);
figure(‘name’,‘图像旋转’);
imshow(interp2(img3,2));
title('Image Rotation ');

%创建函数 my_scale(img, sx, sy),实现将图像在 x 轴缩放 sx 倍,在 y 轴缩放sy 倍
img4=my_scale(img_grayscale, 1, 0.5);
figure(‘name’,‘图像缩放’);
imshow(interp2(img4,2));
title('Image Reduce-Enlarge ');

%创建函数 my_homography(img, X, Y),通过 X、Y 依次输入原始图像左上、右上、左下、右下四个角的坐标经变换后的目标坐标,实现图像的单应变
X = [1;DIM(1);1;DIM(1)];
Y = [1;1;DIM(2);DIM(2)];
img5 = my_homography(img_grayscale,X,Y);
figure(‘name’,‘单应变换’);
imshow(img5);
title('Image Homography ');

function img5= my_homography( img,X,Y )
X2 = [X(1)+60;X(2)-40;X(1);X(2)];
Y2 = [Y(1);Y(1);Y(3);Y(3)];
tform = maketform(‘projective’,[X Y],[X2 Y2]);
img5 = imtransform(img,tform,‘bicubic’);
end

function img3 = my_rotate(img, theta)
%图像旋转
%img为原图像,img3是关于原点逆时针旋转 theta 度后的图像
img=im2double(img);
a = theta / 180 * pi;
R = [cos(a), -sin(a); sin(a), cos(a)];
R = R’; % 求出旋转矩阵的逆矩阵进行逆向查找

% 计算原图大小
[h,w,ch]=size(img);
c1 = 0;

for k = 1:ch
for i = 1:h
for j = 1:w
p = [i; j];
pp = round(R*p+c1);
% 逆向进行像素查找
if (pp(1) >= 1 && pp(1) <= h && pp(2) >= 1 && pp(2) <= w)
img3(i, j, k) = img(pp(1), pp(2), k);
end
end
end
end

function img4 = my_scale(img, sx, sy)
%图像缩放
%img为原图像,img4是img在x轴缩放sx倍,在y轴缩放sy倍后的图像
%img=im2double(img);
%[h,w,~]=size(img);
%img4=imresize(img,[sxh,syw]); %放大或缩小的高度
img=im2double(img);
[m,n,~]=size(img);
img4=zeros(sym,sxn);
rot=[sy 0 0;0 sx 0;0 0 1]; %变换矩阵x=hu,y=wv
inv_rot=inv(rot);

for x=1:sym
for y=1:sx
n
pix=[x y 1]*inv_rot;
img4(x,y)=img(round(pix(1)),round(pix(2)));
end
end
end

function img2 = my_translate(img, dx, dy)
%图像平移
%dx,dy为平移量,img为原图像,img2为平移后图像
[M,N,G]=size(img);
img=im2double(img); %将输入转换为double类.若输入是uint8类 uint16 类 logical类则函数将其转换为范围[0,1]之间的类.若输入是double类,则函数im2double将返回一个与输入相等的数组.
img2=ones(M,N,G); %产生大小是(M,N,G)全1的三维矩阵
for i=1:M
for j=1:N
if((i+dx)>=1&&(i+dx)<=M&&(j+dy)>=1&&(j+dy)<=N) %判断平移后行列是否超过范围
img2(i+dx,j+dy,:)=img(i,j,:);
end
end
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值