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

    end
end

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

题外话:

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

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

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

时间: 2024-10-17 09:38:31

matlab练习程序(矩形变换为单连通形状)的相关文章

为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换

写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在此向多位原创作者致敬!!! 一.傅立叶变换的由来 关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶变换的描述,但是大都是些故弄玄虚的文章,太过抽象,尽是一些让人看了就望而生畏的公式的罗列,让人很难能够从感性上得到理解,最近,我偶尔从网上看到一个关于数字信号处理的电子书籍,是一个叫Steven W. Smith, Ph.D.外国人写的,写得非常浅显,里面有七章由浅入深地专门讲述关于离散信号的傅

matlab练习程序(弧形、圆柱投影的复原)

前一段介绍了从矩形图像到圆柱的正向投影,看这里和这里.今天介绍如何从已经投影的图像反映射到原图像上. 本来此种变换一定是需要数学公式的,不过这里只是用了一个很简单的方式来完成反映射. 具体就把每一列有像素数据的长度拉伸到原图像的高就行了. 原图像是这样: 处理后: 看着感觉还可以,不过这样显然是不合数学公式的,和最原始的图比较一下就看出来差别了: matlab代码如下: clear all;close all;clc; img=imread('re.bmp'); [h w]=size(img);

matlab练习程序(弧形投影)

这个其实也算是圆柱体投影了,不过上一篇文章是从正面看,得到的是凸形的结果,而这个是从反面看,得到的是凹形的结果. 计算公式就不写了,大致介绍一下,计算公式中关于x坐标求法和上篇一样,y坐标则正好是上篇公式的反变换,结合上篇公式代码和本篇的代码,应该都不是很难理解的. 下面是hfOV为pi/2时得到的变换结果: 原图: 处理后结果: matlab代码如下: clear all; close all;clc; img=imread('lena.jpg'); [h,w]=size(img); hfOV

Halcon算子之shape_trans,用于变换区域的形状

函数原型:shape_trans(Region : RegionTrans : Type : ) *shape_trans*仍然是区域,smallest_rectangle1可以获得四个角的坐标 函数作用:变换区域的形状 参数列表: Region(in):被变换的区域 RegionTrans(out):变换后的区域 Type(in):变换类型 参数Type的可选项解释如下: convex:凸包性 ellipse:与输入区域有相同的矩和区域的椭圆 outer_circle:最小外接圆 inner_

【转载】matlab练习程序(图像Haar小波变换)

matlab练习程序(图像Haar小波变换) 关于小波变换我只是有一个很朴素了理解.不过小波变换可以和傅里叶变换结合起来理解. 傅里叶变换是用一系列不同频率的正余弦函数去分解原函数,变换后得到是原函数在正余弦不同频率下的系数. 小波变换使用一系列的不同尺度的小波去分解原函数,变换后得到的是原函数在不同尺度小波下的系数. 不同的小波通过平移与尺度变换分解,平移是为了得到原函数的时间特性,尺度变换是为了得到原函数的频率特性. 小波变换步骤: 1.把小波w(t)和原函数f(t)的开始部分进行比较,计算

matlab练习程序(波纹扭曲)

其实就是用sin或cos对x,y坐标进行变换,处理的时候依然是反向变换. 类似的,用不同的函数能得到不同的扭曲效果,比如log,1/x,exp等等. 效果如下: 代码如下(还给出了如何生成gif图片的代码): clear all;close all;clc; img=imread('lena.jpg'); [h w]=size(img); wave=[10,100]; %[幅度,周期] newh=h+2*wave(1); neww=w+2*wave(1); rot=0; for i=1:10 i

matlab练习程序(圆柱投影)

圆柱投影就是将一张二维的图像投影到三维的圆柱体上,不过在显示图像的时候依然是以二维的形式给出. 投影最重要的步骤就是计算投影变换公式,和图像旋转类似,只要得到变换公式,再依照公式进行代码编写就很容易了. 这里就不写投影变换公式的推导过程了,直接给出变换公式.公式分为正变换和反变换,编程时,反变换公式通常更有用. 正变换公式如下: x'=f\cdot\arctan\left({\frac{x-\frac{W}{2}}{f}}\right)+f\cdot\arctan\left({\frac{W}{

matlab练习程序(生成黑白网格)

提供了两种生成方法,一个是自己编程实现,比较灵活:另一个是调用系统的checkerboard函数,似乎只能生成8*8网格. 至于用途,也许可以用来下国际象棋. 自己函数生成: 系统函数生成: 代码如下: clear all;close all;clc h=256; w=256; n=8; img=zeros(h,w); flag=1; for y=1:h for x=1:w if flag>0 img(y,x)=255; end if mod(x,int8(w/n))==0 flag=-flag

matlab练习程序(旋转、径向模糊)

还记得过去写过径向模糊,不过当时效果似乎不好. 这次效果还可以,程序中用的算法是: 1.求当前处理点和图像中心点之间的距离r与角度ang; 2.通过对r的修改得到径向模糊. 3.通过对ang的修改得到旋转模糊. 一看代码就能全部明白,不仔细解释了. 原图如下: 处理后效果: matlab代码如下: clear all;close all;clc img=imread('lena.jpg'); [h w]=size(img); imshow(img) imgn=zeros(h,w); for y=