matlab练习程序(矩形变换为单连通形状)
变换使用的模板必须是单连通的,而且模板中心必须在模板内,如果在模板中打个结或是月牙形,这里的程序就处理不了了。
虽然非单连通模板也有办法处理,不过不是这里要讨论的。
这里用到的方法和矩形变换为圆那片文章中用的方法几乎一样,变换前后像素按比例缩减,不过在判断弧度和图像边界到模板中心距离时略有不同。
变换为圆时弧度可以直接计算出来,而变换为任意形状只能算出一个最小相似值。
至于图像边界到模板中心距离只能分八种情况判断了,处理圆时可以根据对称性简化程序,这里似乎没有什么好办法简化。
变换细节上,那篇文章中使用的是正向插值,这里使用正向插值则会产生很多空洞,因此选择了更常见的逆向插值。
处理结果如下:
原图:

模板:

结果:

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练习程序(矩形变换为单连通形状)的更多相关文章
- 为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换
写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在此向多位原创作者致敬!!!一.傅立叶变换的由来关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶 ...
- Halcon算子之shape_trans,用于变换区域的形状
函数原型:shape_trans(Region : RegionTrans : Type : ) *shape_trans*仍然是区域,smallest_rectangle1可以获得四个角的坐标 函数 ...
- matlab练习程序(SUSAN检测)
matlab练习程序(SUSAN检测) SUSAN算子既可以检测角点也可以检测边缘,不过角点似乎比不过harris,边缘似乎比不过Canny.不过思想还是有点意思的. 主要思想就是:首先做一个和原图像 ...
- (转)matlab练习程序(HOG方向梯度直方图)
matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram o ...
- UGUI RectTransform 矩形变换
UGUI游戏对象基本都有这个组件. float radius; radius = GetComponent<RectTransform>().sizeDelta.x; radius = ( ...
- matlab练习程序(矩形变换为圆)
最近对图像坐标的变换很感兴趣啊,这次是将一张图像变换为圆形. 变换原理就是按变换前后像素到圆心的距离按比例缩减就行了. 改变x,y方向上的系数,应该还可以变换为椭圆,不过我还没有尝试. 注意我这里相当 ...
- matlab练习程序(最小包围矩形)
又是计算几何,我感觉最近对计算几何上瘾了. 当然,工作上也会用一些,不过工作上一般直接调用boost的geometry库. 上次写过最小包围圆,这次是最小包围矩形,要比最小包围圆复杂些. 最小包围矩形 ...
- matlab练习程序(全景图到穹顶图)
这个程序我最初是用FreeImage写的,这两天改成了matlab,再不贴上来,我就要忘了. 看到一篇文章有这样的变换,挺有意思的,就拿来试了一下,文章点此. 全景图到穹顶图变换,通俗的说就是将全景图 ...
- matlab示例程序--Motion-Based Multiple Object Tracking--卡尔曼多目标跟踪程序--解读
静止背景下的卡尔曼多目标跟踪 最近学习了一下多目标跟踪,看了看MathWorks的关于Motion-Based Multiple Object Tracking的Documention. 官网链接:h ...
随机推荐
- spring mvc实现修改+删除
1.在userController中添加修改的方法 a.首先点击修改,我们一般是到修改界面,并且上面有值,并且有提交按钮 b.修改后,提交到查看的页面 //进入修改界面 @RequestMapping ...
- WPF 数据绑定基础
纯理论,可能会枯燥. .net 技术群: 199281001 ,欢迎加入. 1.目标对象一定是派生自DependencyObject的对象,并且目标属性必须是依赖属性,否则数据绑定操作将会失 败. ...
- iOS多线程介绍
一.线程概述 有些程序是一条直线,起点到终点:有些程序是一个圆,不断循环,直到将它切断.直线的如简单的Hello World,运行打印完,它的生命周期便结束了,像昙花一现那样:圆如操作系统,一直运行直 ...
- shell脚本监控Flume输出到HDFS上文件合法性
在使用flume中发现由于网络.HDFS等其它原因,使得经过Flume收集到HDFS上得日志有一些异常,表现为: 1.有未关闭的文件:以tmp(默认)结尾的文件.加入存到HDFS上得文件应该是gz压缩 ...
- dedecms后台批量替换文章中的关键词
DEDECMS怎么样能快捷或者批量修改网站所有文章的超链接和锚文本,超链和所有关键词锚文本的链接需要修改? dedecms后台批量替换文章中的关键词
- Charm Bracelet
Charm Bracelet Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Subm ...
- sqlmap如何修改线程
找到settings.py文件,具体在\lib\core\目录下找到 # Maximum number of threads (avoiding connection issues and/or Do ...
- setVolumeControlStream(int streamType)
Android中有如下几种音频流: AudioManager.STREAM_MUSIC /** The audio stream for music playback */ AudioManager ...
- GDB 使用大法
一.GDB 我用的是 GCC+POWERSHELL+GDB, GDB刚刚接触也有很多要记的. 二.一个调试示例 tst.c #include <stdio.h> int func(int ...
- map遍历
Set<Map.Entry<String,String>> ss = params.entrySet(); for(Map.Entry<String,String> ...