I=imread('风景.jpg');
%% 旋转图像
if numel(size(I)) > 2 % 彩色图像
[row,col,dep] = size(I);
flag = 1;
else
[row,col] = size(I);
flag = 2;
end
angle = pi/6; %旋转角度
row_r = round(abs(row*cos(angle)) + abs(col*sin(angle))); %旋转后大小
col_r = round(abs(col*cos(angle)) + abs(row*sin(angle)));
if 1 == flag %旋转后图像矩阵
I1 = uint8(zeros(row_r, col_r,dep));
else
I1 = zeros(row_r, col_r);
end
for i = 1:row_r
for j = 1:col_r
c = i - row_r/2; %将旋转中心移至原点
d = j - col_r/2;
x = c*cos(angle) - d*sin(angle); %旋转
y = d*cos(angle) + c*sin(angle);
x = round(x + row/2); %将所需图像移至坐标系正值部分
y = round(y + col/2);
if x > 0 && x <= row && y <= col && y > 0
if 1 == flag
I1(i,j,:) = I(x, y,:);
else
I1(i,j) = I(x, y);
end
end
end
end
subplot(1,2,1);imshow(I);title('原图');
subplot(1,2,2);imshow(I1,[]);title('顺时针旋转30度后的图片');
figure;
image=I1;
imwrite(image,'顺时针旋转30度后的图片.png');
%% 放大图像
[row,col,~] = size(I);
scale_w =300; %根据输入获得缩放后的新宽度
scale_h =200; %根据输入获得缩放后的新高度
I2 = zeros(scale_h, scale_w);
for i = 1 : scale_h
for j = 1 : scale_w
x = i * row/ scale_h;
y = j * col/ scale_w;
u = x - floor(x);
v = y - floor(y);
if x < 1 %边界处理
x = 1;
end
if y < 1
y = 1;
end
%用原图的四个真实像素点来双线性插值获得“虚”像素的像素值
I2(i, j) = I(floor(x), floor(y)) * (1-u) * (1-v) + ...
I(floor(x), ceil(y)) * (1-u) * v + ...
I(ceil(x), floor(y)) * u * (1-v) + ...
I(ceil(x), ceil(y)) * u * v;
end
end
subplot(1,2,1);imshow(I);title('原图');
subplot(1,2,2);imshow(I2,[]);title('加倍后的图片');
image=I2;
imwrite(image,'加倍后的图片.png');
figure;
%% 做水平镜像
I=imread('C:\Users\LiCongliang\Desktop\数字图像处理\数字图像处理第六次作业\风景.jpg');
[row,col,dep]=size(I);
I3=zeros(row,col);
for i=1:row
for j=1:col
x=i; %水平镜像变换x的值不变
y=col-j+1; %镜像变换后y的值
I3(x,y)=I(i,j);
end
end
subplot(1,2,1);imshow(I);title('原图');
subplot(1,2,2);imshow(I3,[]);title('水平镜像变换后的图片');
image=I3;
imwrite(image,'水平镜像变换后的图片.png');
figure;
%% 垂直方向的错切
[row,col,dep]=size(I);
I4=zeros(row,col);
dy = 0.5; %错切系数
for m=1:row
for n=1:col
x = round(m);
y = round(n + dy * m);
I4(x,y)=I(m,n);
end
end
subplot(1,2,1);imshow(I);title('原图');
subplot(1,2,2);imshow(I4,[]);title('垂直错切后的图片');
image=I4;
imwrite(image,'垂直错切后的图片.png');