matlab练习程序(矩形变换为单连通形状)

本文深入探讨了图像处理中模板变换的算法细节,强调了模板必须是单连通且中心位于内部的重要性。通过逆向插值方法,解决了变换过程中的空洞问题,并提供了MATLAB代码实现,展示了从矩形到任意形状模板的变换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

变换使用的模板必须是单连通的,而且模板中心必须在模板内,如果在模板中打个结或是月牙形,这里的程序就处理不了了。

虽然非单连通模板也有办法处理,不过不是这里要讨论的。

这里用到的方法和矩形变换为圆那片文章中用的方法几乎一样,变换前后像素按比例缩减,不过在判断弧度和图像边界到模板中心距离时略有不同。

变换为圆时弧度可以直接计算出来,而变换为任意形状只能算出一个最小相似值。

至于图像边界到模板中心距离只能分八种情况判断了,处理圆时可以根据对称性简化程序,这里似乎没有什么好办法简化。

变换细节上,那篇文章中使用的是正向插值,这里使用正向插值则会产生很多空洞,因此选择了更常见的逆向插值。

处理结果如下:

原图:

模板:

结果:

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
                      
    end
end

imshow(img);
figure;imshow(mask_line);
figure;imshow(imgn,[])

题外话:

今天等了一天在京东订的kindle,到下午5点都还没送来,最后发现竟然是手机没信号,没有收到送货通知。

中国移动一定是看我用的2G卡,又没开上网功能,欺负人,不给优先级。

如果收到货,也许现在正在玩kindle,就不会有这篇文章了。

转载于:https://www.cnblogs.com/tiandsp/p/4004551.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值