function img2 = myaffine(img1,A)
%输入3*3矩阵,对应仿射矩阵
[h1,w1,p] = size(img1);
a1=A(1,1);
a2=A(1,2);
a3=A(1,3);
b1=A(2,1);
b2=A(2,2);
b3=A(2,3);
xmax=max(max(max(max(a1*1+a2*1),a1*1+a2*h1),a1*w1+a2*1),a1*w1+a2*h1);
xmin=min(min(min(min(a1*1+a2*1),a1*1+a2*h1),a1*w1+a2*1),a1*w1+a2*h1);
ymax=max(max(max(max(b1*1+b2*1),b1*1+b2*h1),b1*w1+b2*1),b1*w1+b2*h1);
ymin=min(min(min(min(b1*1+b2*1),b1*1+b2*h1),b1*w1+b2*1),b1*w1+b2*h1);
%求出变换后图像的左右范围大小和上下范围大小
deltax = round(xmax-xmin)+1;
deltay = round(ymax-ymin)+1;
%注意如果有平移分量,我们要把它加上
img2=uint8(zeros(deltay+b3, deltax+a3, p));
for x=1:deltax
for y=1:deltay
%要考虑到如果xmin,ymin为负,要把它加上才可以保证能映射到原图像中的对应点。
x1=min(xmin,0)+x;
y1=min(ymin,0)+y;
%注意此处不应包含a3和b3,因为我们已经去掉了a3和b3,在最后才需要加上。
x0=round((b2*x1-a2*y1)/(a1*b2-a2*b1));
y0=round((a1*y1-b1*x1)/(a1*b2-a2*b1));
%要考虑到可能b3和a3是负数,这样的点要排除(对应于平移出界的情况)。
if(x0>0 && x0<=w1 && y0>0 && y0<=h1 && y+b3>0 && x+a3>0)
img2(y+b3,x+a3,:) = img1(y0,x0,:);
end
end
end
MATLAB 仿射变换实现
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 目录一、Quartz2D 1、什么是Quartz2D 2、Quartz2D的一些实例二、UIBezierPath ...