首页 > 代码库 > matlab练习程序(矩形变换为单连通形状)
matlab练习程序(矩形变换为单连通形状)
变换使用的模板必须是单连通的,如果在模板中打个结,这里的程序就处理不了了。
虽然非单连通模板也有办法处理,不过不是这里要讨论的。
这里用到的方法和矩形变换为圆那片文章中用的方法几乎一样,变换前后像素按比例缩减,不过在判断弧度和图像边界到模板中心距离时略有不同。
变换为圆时弧度可以直接计算出来,而变换为任意形状只能算出一个最小相似值。
至于图像边界到模板中心距离只能分八种情况判断了,处理圆时可以根据对称性简化程序,这里似乎没有什么好办法简化。
变换细节上,那篇文章中使用的是正向插值,这里使用正向插值则会产生很多空洞,因此选择了更常见的逆向插值。
处理结果如下:
原图:
模板:
结果:
matlab代码如下:
clear all;close all;clc;img=imread(‘lena.jpg‘);mask_line=imread(‘mask.bmp‘)>50;[h w]=size(img);imgn=zeros(h,w);ind=find(mask_line==1);[lineY lineX]=ind2sub([h w],ind); %模板形状像素的位置cenY=round(mean(lineY)); %模板形状中心cenX=round(mean(lineX));lineAng=atan2(lineY-cenY,lineX-cenX); %模板线上每个点到形状中心弧度lineR=sqrt((lineY-cenY).^2+(lineX-cenX).^2); %模板线上每个点到形状中心距离ang_ul=atan2(1-cenY,1-cenX); %图像四个点与模板形状中心弧度ang_ur=atan2(1-cenY,w-cenX);ang_dl=atan2(h-cenY,1-cenX);ang_dr=atan2(h-cenY,w-cenX);for y=1:h for x=1:w r=sqrt((x-cenX)^2+(y-cenY)^2); ang=atan2(y-cenY,x-cenX); if ang>=-pi && ang<ang_ul %分别求八个象限图像边界到模板中心距离 R=abs(cenX/cos(ang)); %应该可以简化,这样判断似乎繁琐了 elseif ang>=ang_ul && ang<-pi/2 R=abs(cenY/cos(pi/2-ang)); elseif ang>=-pi/2 && ang<ang_ur R=abs(cenY/cos(pi/2+ang)); elseif ang>=ang_ur && ang<0 R=abs((w-cenX)/cos(pi-ang)); elseif ang>=0 && ang<ang_dr R=abs((w-cenX)/cos(ang)); elseif ang>=ang_dr && ang< pi/2 R=abs((h-cenY)/cos(pi/2-ang)); elseif ang>=pi/2 && ang<ang_dl R=abs((h-cenY)/cos(pi/2+ang)); elseif ang>=ang_dl && ang<=pi R=abs(cenX/cos(pi-ang)); end [junk index]=min(abs(ang-lineAng)); %距离最近的弧度 newR=lineR(index); ss=R*r/newR; %缩减扩展比例系数 xx=round((ss*cos(ang)+cenX)); yy=round((ss*sin(ang)+cenY)); if xx>=1 && xx<=w && yy>=1 && yy<=h imgn(y,x)=img(yy,xx); end endendimshow(img);figure;imshow(mask_line);figure;imshow(imgn,[])
题外话:
今天等了一天在京东订的kindle,到下午5点都还没送来,最后发现竟然是手机没信号,没有收到送货通知。
中国移动一定是看我用的2G卡,又没开上网功能,欺负人,不给优先级。
如果收到货,也许现在正在玩kindle,就不会有这篇文章了。
matlab练习程序(矩形变换为单连通形状)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。