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

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

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

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

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

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

处理结果如下:

原图:

模板:

结果:

matlab代码如下:

clear all;close all;clc;

img=imread('lena.jpg');
mask_line=imread('mask.bmp')>; [h w]=size(img);
imgn=zeros(h,w); ind=find(mask_line==);
[lineY lineX]=ind2sub([h w],ind); %模板形状像素的位置
cenY=round(mean(lineY)); %模板形状中心
cenX=round(mean(lineX)); lineAng=atan2(lineY-cenY,lineX-cenX); %模板线上每个点到形状中心弧度
lineR=sqrt((lineY-cenY).^+(lineX-cenX).^); %模板线上每个点到形状中心距离 ang_ul=atan2(-cenY,-cenX); %图像四个点与模板形状中心弧度
ang_ur=atan2(-cenY,w-cenX);
ang_dl=atan2(h-cenY,-cenX);
ang_dr=atan2(h-cenY,w-cenX); for y=:h
for x=:w
r=sqrt((x-cenX)^+(y-cenY)^);
ang=atan2(y-cenY,x-cenX); if ang>=-pi && ang<ang_ul %分别求八个象限图像边界到模板中心距离
R=abs(cenX/cos(ang)); %应该可以简化,这样判断似乎繁琐了
elseif ang>=ang_ul && ang<-pi/
R=abs(cenY/cos(pi/-ang));
elseif ang>=-pi/ && ang<ang_ur
R=abs(cenY/cos(pi/+ang));
elseif ang>=ang_ur && ang<
R=abs((w-cenX)/cos(pi-ang));
elseif ang>= && ang<ang_dr
R=abs((w-cenX)/cos(ang));
elseif ang>=ang_dr && ang< pi/
R=abs((h-cenY)/cos(pi/-ang));
elseif ang>=pi/ && ang<ang_dl
R=abs((h-cenY)/cos(pi/+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>= && xx<=w && yy>= && yy<=h
imgn(y,x)=img(yy,xx);
end end
end imshow(img);
figure;imshow(mask_line);
figure;imshow(imgn,[])

题外话:

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

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

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

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

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

    写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在此向多位原创作者致敬!!!一.傅立叶变换的由来关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶 ...

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

    函数原型:shape_trans(Region : RegionTrans : Type : ) *shape_trans*仍然是区域,smallest_rectangle1可以获得四个角的坐标 函数 ...

  3. matlab练习程序(SUSAN检测)

    matlab练习程序(SUSAN检测) SUSAN算子既可以检测角点也可以检测边缘,不过角点似乎比不过harris,边缘似乎比不过Canny.不过思想还是有点意思的. 主要思想就是:首先做一个和原图像 ...

  4. (转)matlab练习程序(HOG方向梯度直方图)

    matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram o ...

  5. UGUI RectTransform 矩形变换

    UGUI游戏对象基本都有这个组件. float radius; radius = GetComponent<RectTransform>().sizeDelta.x; radius = ( ...

  6. matlab练习程序(矩形变换为圆)

    最近对图像坐标的变换很感兴趣啊,这次是将一张图像变换为圆形. 变换原理就是按变换前后像素到圆心的距离按比例缩减就行了. 改变x,y方向上的系数,应该还可以变换为椭圆,不过我还没有尝试. 注意我这里相当 ...

  7. matlab练习程序(最小包围矩形)

    又是计算几何,我感觉最近对计算几何上瘾了. 当然,工作上也会用一些,不过工作上一般直接调用boost的geometry库. 上次写过最小包围圆,这次是最小包围矩形,要比最小包围圆复杂些. 最小包围矩形 ...

  8. matlab练习程序(全景图到穹顶图)

    这个程序我最初是用FreeImage写的,这两天改成了matlab,再不贴上来,我就要忘了. 看到一篇文章有这样的变换,挺有意思的,就拿来试了一下,文章点此. 全景图到穹顶图变换,通俗的说就是将全景图 ...

  9. matlab示例程序--Motion-Based Multiple Object Tracking--卡尔曼多目标跟踪程序--解读

    静止背景下的卡尔曼多目标跟踪 最近学习了一下多目标跟踪,看了看MathWorks的关于Motion-Based Multiple Object Tracking的Documention. 官网链接:h ...

随机推荐

  1. C++_Eigen函数库用法笔记——Block Operations

    Using block operations rvalue, i.e. it was only read from lvalues, i.e. you can assign to a block Co ...

  2. Object、Function、String、Array原生对象扩展方法

    JavaScript原生对象的api有些情况下使用并不方便,考虑扩展基于Object.Function.String.Array扩展,参考了prototype.js的部分实现,做了提取和修改,分享下: ...

  3. C#路径总结

    [相对路径]   Request.ApplicationPath /src Path.GetDirectoryName(HttpContext.Current.Request.RawUrl ) //s ...

  4. Charm Bracelet

    Charm Bracelet Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Subm ...

  5. 如何看K线图基础知识

    在日K线图中一般白线.黄线.紫线.绿线依次分别表示:5.10.20.60日移动平均线,但这并不是固定的,会根据设置的不同而不同,比如你也可以在系统里把它们设为5.15.30.60均线. 你看K线图的上 ...

  6. Cocos2d-x 3.0修改Android平台帧率fps - 解决游戏运行手机发热发烫问题

    使用Cocos2d-x 3.0开发游戏之后,发现游戏在android手机上发热非常严重,在魅族2上,几乎担心手机会爆炸了~~~采取的一个措施就是降低帧率,因为游戏对于帧率要求不是非常高. 做过coco ...

  7. ubuntu 12.04 server编译安装nginx

    tar -xvf zlib-1.2.8.tar.gz cd zlib-1.2.8 ./config make make install above is for zlib(refers http:// ...

  8. 90天打造日均在线网站1W+的友情链接平台

    导读:三个月过去了,好友张森终于把一款默默无名的软件打造出了日均1W+在线的平台,我认为成功的因素很简单,1,找准了用户群体的痛点;2,肯花精力做运营;3,合理的推广.本文是他的自述,打造一款产品,说 ...

  9. sybaseIQ索引类型和使用注意事项

    1. FP(Fast Projection)此索引为默认的索引形式,在创建表时系统自动设置此索引. 特点:用于SELECT.LIKE '%sys%'.SUM(A+B).JOIN操作等语句. 此类型索引 ...

  10. Java面向对象的封装

    封装是Java面向对象的三大特性之一,通常我们是通过包管理机制同时对类进行封装,隐藏其内部实现细节,通常开发中不允许直接操作类中的成员属性,所以属性一般设置为私有权限private,类中一般会给出一些 ...