基于matlab哈哈镜制作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机视觉课程设计实验报告
一、题目:哈哈镜的制作
三、实验目的:
1、掌握几何变换的原理。
2、读入待制作的图片,实现图片的缩小放大、水平外凹、水平外凸、梯形变形、三角形,S 形和波浪型。
四、实验原理:
变形处理整体都是一个思路,把原图每一行经过缩放拷到新图的相应行。
每次变形都是在原图的基础上,根据想要变换的图象形状,计算出每一行的起始位,再计算出每一行新的总长度。
1)对于放大、缩小可以根据最近邻插值或者双线性插值来进行变化,放大我们采用了双线性方法,缩小采用了最近邻插值方法。
2)对于水平内凹和水平外凸,以周期为2倍高度的正弦函数来进行变化,变化后远图象的高度坐标不变,宽度坐标以一定比例变化。
3)对于三角形和梯形,原图象高度坐标不变,宽度坐标以线性来进行变化。
4)对于宽度不变的变形,如波浪形,直接一次变形拷贝一整行。对于高度不变的图形,如S形,也可以用这个方法,或者说是把起始点确定后,将坐标点进行平移。
5)除放大效果外,缩小、水平外凹、水平外凸、梯形变形、三角形,S形和波浪型均采用最近邻插值方法进行变化。
五、实验步骤(附程序主代码):
1、打开图象
clear;clc; %清空工作空间
[filename,pathname]=uigetfile({'*.*','All Files(*.*)'});
file=fullfile(pathname,filename);
t1=imread(file);
t2=rgb2gray(t1); %将打开的彩色图像转换为灰度图
imshow(t2)
save temp t2;
2、缩小
load temp t2 %加载打开的图片
[m,n]=size(t2);
x2=double(t2);
for i=1:m
for j=1:n
w=round(i*0.5); %宽度缩小为原来一半
h=round(j*0.5); %高度缩小为原来一半
x3(w,h)=x2(i,j); %最近邻插值,象素值赋给新的图象
end
end
figure,imshow(mat2gray(x3))
3、放大
x3=zeros(fix(m*2),fix(n*2)); %开辟空间
for i=2:fix((m-1)*2)
for j=2:fix((n-1)*2)
p=fix(i/2);
q=fix(j/2);
x3(i,j)=[x2(p+1,q)-x2(p,q)]*(i/2-fix(i/2))+[x2(p,q+1)-x2(p,q)]*(j/2-
fix(j/2))+[x2(p+1,q+1)+x2(p,q)-x2(p,q+1)-x2(p+1,q)]*(i/2-fix(i/2))*
(j/2-fix(j/2))+x2(p,q); %双线性插值
end
end
4、水平内凹
t3(m,n)=0; %开辟新图象空间
for i = 1:m
a = (2*pi/m)*i; %i转化为弧度形式
p=round(abs(30*sin(a/2))+0.5);
q=round(-abs(30*sin(a/2))-0.5); % 正弦函数变换,周期为2M
for j=p:q+n
x=i; %变化后高度坐标不变
y=round((j-p)*n/((q+n-p+1))); %宽度坐标以(j-p)*n/((q+n-p+1)))比例变化 if (x>0&&x<=m) &&(y>0&&y<=n)
t3(i,j)=t2(x,y);
else
t3(i,j)=255;
end
end
end
5、水平外凸
a=round(sin(pi/2));
t3(m,n+2*a)=0;
grade=50;
for i =1:m
b =2*pi/m*i; %i转化为弧度形式
j1=round(abs(sin(2*pi-b/2)*grade+grade)+0.5);
j2=round(sin(b/2)*grade-grade-0.5); % 正弦函数变换,周期为2M
for j=j1:j2+n
x=i; %变化后高度坐标不变
y=round((j-j1)*n/((j2+n-j1+1))); %宽度坐标以(j-j1)*n/((j2+n-j1+1))比例变化 if (x>0&&x<=m) &&(y>0&&y<=n)
t3(i,j)=t2(x,y);
else
t3(i,j)=255;
end
end
end
6、梯形
prompt={'please input p:'};
title='请输入上底缩放比例:';
lines=1;
def={'0.5'}; %默认上底缩放比例值
p=inputdlg(prompt,title,lines,def); %对话框输入上底缩放比例 p=str2double(p);
prompt={'please input q:'};
title='请输入下底缩放比例:';
lines=1;
def={'0.8'}; %默认下底缩放比例值
q=inputdlg(prompt,title,lines,def); %对话框输入下底缩放比例 q=str2double(q);
n1=round(n*p+0.5);
n2=round(n*q+0.5);
sd=min(n1,n2); %短底
xd=max(n1,n2); %长底
t3 = zeros(m,xd);
bi=abs(n2-n1)/2/m;%斜率
for i = 1:m
if n1 a=round((m-i+1)*bi+0.5);%缩进长度 newx=sd+2*i*bi;%变化后的下底的长度 else a=round((i-1)*bi+0.5); newx=xd-2*i*bi;%变化后的下底的长度 end for j=a:a+round(newx+0.5) x=i; y=round((j-a)*n/newx); if (x>0&&x<=m) &&(y>0&&y<=n) t3(i,j)=t2(x,y); else t3(i,j)=255; end end end 7、三角形 t3(m,n)=0; for i=1:m for j=1:round(i*n/m) x=i; %高度坐标不变