bwmorph
功能: 提取二进制图像的轮廓.
语法: BW2 = bwmorph(BW1,operation) ;
BW2 = bwmorph(BW1,operation,n) ; n为次数;
Operation的参数可以有多种选择,现归纳如下:
‘bother’:闭包运算,即先腐蚀,在膨胀,然后减去原图像;
‘bridge’:做连接运算;
‘clean’:去除孤立的亮点;
‘close’:进行二值闭运算;
‘diag’:采用对角线填充来去除8邻域的背景;
‘dilate’:采用结构元素ones(3)做膨胀运算;
‘erode’:采用结构元素ones(3)作腐蚀运算;
‘fill’:填充孤立的黑点; ‘hbreak’:断开H形连接;
‘Majority’:若像素的8邻域中有大于或等于5的元素为1,则像素为1,否则为0;
‘open’:执行二值开运算;
‘remove’:去掉内点,即若像素的4邻域都为1,则像素为0;
‘shrink’n=inf:做收缩运算,这样没有孔的物体收缩为一个点,而含孔的物体收缩为一个相连的环,环的位置在孔和物体外边缘的中间,收缩运算保持欧拉数不变,
‘skel’n=inf: 提取物体的骨架,即去除物体外边缘的点,但是保持物体不发生断裂,它也保持欧拉数不变。 ‘spur’:去除物体小的分支;
‘thicken’n=inf;对物体进行粗化,即对物体的外边缘增加像素,知道原来为连接的物体按照8邻域被连接起来。粗化保持欧拉数不变。
‘thin’n=inf:对物体进行细化,使得没有孔的物体收缩为最小连接棒,而含有孔的物体收缩为一个连接的环,同样细化保持欧拉数不变。
‘tophat’:用原图减去开运算后的图像;
28 Apr 2010
27 Apr 2010
matlab 中序列求极值的方法
坛子里的几个经典方法:
利用数学里驻点和极值点定义来求。
--------------------------------------ilxy的方法 -------------------------------------------------------------------
>> aa=randperm(20)
aa =
16 13 17 7 19 18 14 8 11 2 20 3 6 4 15 1 12 10 5 9
>> bb=intersect(find(diff(aa)>0)+1,find(diff(aa)<0))
bb =
3 5 9 11 13 15 17
----------------------------------------------------------------------------------------------------------------------
----------------------------------hyperelastic 的方法----------------------------------------------------------
N = 100;
aa=randperm(N);
index = find(((aa(2:N-1)>aa(1:N-2))+(aa(2:N-1)>aa(3:N)))==2)+1;
bb = aa(index);
-------------------bainhome 的方法 -----------------------------------------------------------------------------
a=rand(1,100); find(diff(sign(diff(a)))>0)+1
------------------------------------------------------------------------------------------------------------------------
以上代码都是求极大值,略微变换后可以得到极小值。
------------------------------------eight版主给的方法 ------------------------------------------------------------
d=diff(x);
n=length(d);
d1=d(1:n-1);
d2=d(2:n);
indmin=find(d1.*d2<0 & d1<0)+1;
indmax=find(d1.*d2<0 & d1>0)+1;
------------------------------------------------------------------------------------------------------------------------
虽然基本原理一样,不过几位的方法都各有特色。都是前辈们智慧的结晶,在此深表感谢。
小代码体现大智慧的典范!
我在实验中所搜到的方法,可惜这次没搜索到:
假设待求的数列为data,则find(diff(sign(diff(data)))== - 2)+1 可求极大值。find(diff(sign(diff(data)))== 2)+1 可求极小值。
Uninstalling Visual Studio 2010
Uninstall Visual Studio 2010
Uninstall Visual Studio Office 2010
Uninstall other 2010 stuff...
Search on Framework
Uninstall .NET Framework 4.0 Extended
if there's errors,Rename the crashed program (always in the v4.0 frameworks directory in my case) to have a *.OLD extension
Uninstall the .NET Framework 4 Client Profile
Done!
Uninstall Visual Studio Office 2010
Uninstall other 2010 stuff...
Search on Framework
Uninstall .NET Framework 4.0 Extended
if there's errors,Rename the crashed program (always in the v4.0 frameworks directory in my case) to have a *.OLD extension
Uninstall the .NET Framework 4 Client Profile
Done!
26 Apr 2010
Python Tips - 判断点是否在直线上
#! /usr/bin/env python import math class Point: def __init__(self, x, y): self.x = x self.y = y def __repr__(self): return str((self.x, self.y)) class Segment: def __init__(self, p1, p2): self.start = p1 self.end = p2 self.length = getDist(p1, p2) def __repr__(self): return str((self.start, self.end, self.length)) def isOn(self, p): if getDist(p, self.start) + getDist(p, self.end) == self.length: return True else: return False def getDist(p1, p2): return math.sqrt((p1.x-p2.x)**2 + (p1.y-p2.y)**2) def main(): p1 = Point(-1, -1) p2 = Point(1, 1) p3 = Point(0, 0) p4 = Point(0, 1) line = Segment(p1, p2) print 'Is ', p3, ' on line ', line, ':', line.isOn(p3) print 'Is ', p4, ' on line ', line, ':', line.isOn(p4) if __name__ == '__main__': main()
24 Apr 2010
Python Tips - 正则表达式 (Regular Expression)
1 非贪婪flag
注意比较这种情况:
2 如果你要多行匹配,那么加上re.S和re.M标志
re.S:.将会匹配换行符,默认.不会匹配换行符
re.M:^$标志将会匹配每一行,默认^和$只会匹配第一行
但是,如果没有^标志,
可见,是无需re.M
来自 http://www.juyimeng.com/python-multi-line-non-greedy-regular-expression-sample.html
>>> re.findall(r"a(\d+?)", "a23b") ['2'] >>> re.findall(r"a(\d+)", "a23b") ['23']
注意比较这种情况:
>>> re.findall(r"a(\d+)b", "a23b") ['23'] >>> re.findall(r"a(\d+?)b", "a23b") ['23']
2 如果你要多行匹配,那么加上re.S和re.M标志
re.S:.将会匹配换行符,默认.不会匹配换行符
>>> re.findall(r"a(\d+)b.+a(\d+)b", "a23b\na34b")
[]
>>> re.findall(r"a(\d+)b.+a(\d+)b", "a23b\na34b", re.S)
[('23', '34')]
>>>re.M:^$标志将会匹配每一行,默认^和$只会匹配第一行
>>> re.findall(r"^a(\d+)b", "a23b\na34b") ['23'] >>> re.findall(r"^a(\d+)b", "a23b\na34b", re.M) ['23', '34']
但是,如果没有^标志,
>>> re.findall(r"a(\d+)b", "a23b\na23b") ['23', '23']
可见,是无需re.M
来自 http://www.juyimeng.com/python-multi-line-non-greedy-regular-expression-sample.html
23 Apr 2010
MATLAB自动生成exe文件
方法一:
1.设置编译器:
在确定安装好Matlab Compiler后,还需要对Compiler进行适当的配置,方法是在Matlab命令窗口输入:Mbuild –setup, 按提示选择matlab自带编译器LCC。
2.将脚本编译为可执行文件:
如项目文件包含:gui.m, gui.gif, fun1.m。在项目文件路径下命令行输入:mcc –m gui.m,生成:mccExcludedFiles.log,ReadMe.txt,gui.ctf,gui.prj,gui_main.c,gui_mcc_component_data.c,gui.exe。其中:gui.ctf,gui.exe为脱离matlab环境运行必需的文件。
3.在未安装matlab的机器上运行可执行程序。
将MATLAB根目录下\toolbox\compiler\deploy\win32中的MCRinstaller.exe安装到该计算机上,将生成可执行程序脱离matlab运行所需的函数库。将2中生成的gui.ctf,gui.exe拷贝到该计算机同一路径。运行gui.exe将生成gui_mcr文件夹,包含程序运行所需的库。至此完成。
4.去除独立可执行程序运行时的“DOS黑窗口”。
以上生成的exe程序运行时首先弹出一个DOS界面窗口,如果不需要其输出数据和错误信息,可将其去除。
matlab命令行输入:
cd(prefdir)
edit compopts.bat
此时compopts.bat打开,在文件最后添加: set LINKFLAGS=%LINKFLAGS% -subsystem windows
如果程序比较复杂,易出现异常,则不建议去除这个dos窗口以便调试。
另外,这个办法是适用于你用的编译器为LCC,如果是其他的,那么所加语句有所不同
Microsoft Visual C/C++:
set LINKFLAGS=%LINKFLAGS% /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup
Borland: set LINKFLAGS=%LINKFLAGS% -aa
5.遇到某些函数不能使用的问题。
我的程序中用到vpa函数,运行gui.exe出现:undefined method or function 'vpa' for input argument type of 'double'错误提示。而gui.m脚本在matlab环境可以运行。原因:百度搜到的信息为:matlab不支持符号工具箱的编译。只好避开使用此函数。
使用结果:
总体上很顺利,没遇到5所述的问题,但“DOS黑窗口”按4所述方法无法去除。在第2步中,输入mcc -m fillholegui.m或mcc -B sgl fillholegui.m均可。编译过程比较缓慢,需要耐心等候。
方法二:
matlab编程很方便,强大的矩阵运算功能,很多好用的工具箱,但是一般程序都要在matlab环境中运行,能否脱离这个环境打包发布呢,matlab也提供了这样的工具。
1. 转化为c/c++程序并编译为.exe
先验证mcc是否可用,用matlab中的example验证即可。建议不用matlab默认的lcc 编译器(可能有问题),可使用VC6编译器(按默认路径安装)由于带有界面,需要图像库支持,编译时应使用命令: mcc -B sglcpp pressure编译生成若干c/c++源码,以及.exe文件、bin目录中figure菜单条/工具条文件(.fig)等程序发布需要.exe、bin\、.fig
2. 在未装matlab的电脑上运行程序需要数学运行时库、图像运行时库以及用到的工具箱mex文件前两者已经在\matlab\extern\lib\win32mglinstaller.exe压缩包中,将其解压,并在环境变量path中添加解压到的路径另外若程序中还用到其他工具箱的东西,那么需要将此工具箱中需要的mex文件也一并放在解压到的路径,子文件夹位置与matlab中的位置相同
3. 在确保.exe程序可以运行的情况下 可以用setup factory打包发布
使用结果:
总体来说,方法失败,不过也可能是因为不是用VC的编译器。我选择的是c++Builder的编译器,输入命令mcc -B sglcpp fillholegui2.m出现错误;输入命令mcc -B sgl fillholegui2.m 出错;输入命令mcc –p -B sgl fillholegui2.m出错。
网上可能还有一些其它的方法,比如在LCC编译环境下,输入命令为mcc -B sgl fillholegui2.m;mcc –m -B sgl fillholegui2.m;mcc –p -B sglcpp fillholegui2.m等。稍微进行了实验,这几个命令都会报错。谨慎怀疑是将LCC编译器和C++编译器环境下的命令混淆了。
Subscribe to:
Posts
(
Atom
)