📄 -+
字号:
ProgramFan.com <http://www.programfan.com>
编程爱好者收藏夹 myweb.pfan.cn <http://myweb.pfan.cn>
人才招聘频道启用新域名 job.pfan.cn <http://job.pfan.cn>
编程爱好者论坛新增软件测试技术讨论区
<http://www.programfan.com/club/bbs.asp?bbsid=60>
编程爱好者项目交易栏目 欢迎发布交易信息 <http://www.programfan.com/project>
欢迎光临编程爱好者ACM题库 <http://www.programfan.com/problem>
欢迎光临编程爱好者论坛bbs.programfan.com <http://bbs.programfan.com>
编程爱好者博客 blog.programfan.com <http://blog.programfan.com>
回到首页 <http://www.programfan.com/> 设为首页 <#> 加入收藏 <#> 网站留言
<http://www.programfan.com/contact.asp?subject=网站留言>
<http://www.programfan.com/>
_人才招聘频道_ <http://job.pfan.cn>
_编程爱好者BLOG_ <http://blog.programfan.com>
_编程爱好者论坛_ <http://bbs.programfan.com>
首页 <http://www.programfan.com> | 论坛 <http://bbs.programfan.com> |
BLOG <http://blog.programfan.com> | 人才招聘 <http://job.pfan.cn> | *书
评* <http://www.programfan.com/book> | 文章
<http://www.programfan.com/article> | 资讯
<http://www.programfan.com/newscenter.asp> | 下载
<http://www.programfan.com/download.asp> | 源码
<http://www.programfan.com/source.asp> | 项目交易
<http://www.programfan.com/project/> | 兴趣小组
<http://www.programfan.com/team> | 网友作品
<http://www.programfan.com/wysoft> | 刻盘服务
<http://www.programfan.com/bookcd.asp> | VBAPI查询
<http://www.programfan.com/vbapi.asp>
*文章分类*
*C/C++文章* <article.asp?classid=20>
Visual Basic <article.asp?classid=1>
*Visual C++* <article.asp?classid=2>
C++ Builder <article.asp?classid=4>
Visual Foxpro <article.asp?classid=5>
Powerbuilder <article.asp?classid=6>
*Delphi* <article.asp?classid=3>
*ASP <article.asp?classid=8>*
*ASP.net <article.asp?classid=18>*
*JAVA* <article.asp?classid=7>
WINDOWS编程 <article.asp?classid=10>
*VB.net <article.asp?classid=16>*
*JSP <article.asp?classid=11>*
游戏开发 <article.asp?classid=13>
汇编语言 <article.asp?classid=12>
数据库开发 <article.asp?classid=14>
Visual C# <article.asp?classid=15>
XML <article.asp?classid=17>
PHP <article.asp?classid=9>
*算法* <article.asp?classid=19>
* 您所在的位置:编程爱好者网站 <http://www.programfan.com> -文档中心
<article.asp> - 算法文章 <article.asp?classid=19>*
*图像分割中阈值的自动选取的研究及其算法实现*
(加入日期:2003-4-13 点击数:11764)
*【收藏文章
<javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange
().text:''):(d.getSelection?d.getSelection():'');void(myweb=window.open('http:
//www.programfan.com/club/mywebedit.asp?title='+escape(d.title)+'&url='+escape
(d.location.href),'myweb','scrollbars=no,width=480,height=480,left=75,top=
20,status=no,resizable=yes'));>】【对此文发表评论 <comment.asp?id=
2219>】【编程爱好者论坛 </club>】【保存文章至硬盘 <#>】【打印文章 <#>】*
图像分割是图像处理这门学科中的基础难题,基于阈值的分割则又是图像分割的最
基本的难题之一,其难点在于阈值的选取。事实证明,阈值的选择的恰当与否对分
割的效果起着决定性的作用。由于阈值选取对图像分割的基础性,本文主要在
【1】、【2】、【3】、【4】等的基础上,对一些当前流行的阈值选取算法做了探
讨、实现和比较。多阈值分割虽然能进一步提高图像分割的质量,但由于它只是分
割技巧的处理问题,而与单阈值分割并无本质的区别。因此本文并不对多阈值分割
进行讨论,而只考虑单阈值分割的情形。
1. 双峰法
双峰法的原理及其简单:它认为图像由前景和背景组成,在灰度直方图上,前后二
景都形成高峰,在双峰之间的最低谷处就是图像的阈值所在。根据这一原理,我们
给出了它的实现,部分代码如下(Pascal语言描述,以下同):
//intPeak、intPeak2、intValley:峰值和直方图值
//intIndx::相应的灰度值
intPeak,intIndx,intPeak2,intIndx2,intValley,intValleyIndx:integer;
//初始双峰值
intPeak:=0;
intPeak2:=0;
//取得第一峰值
for intLoop:=0 to 255 do
if intPeak<=intGrayLevel[intLoop] then
begin
intPeak:=intGrayLevel[intLoop];
intIndx:=intLoop;
end;
//取得第二峰值
for intLoop:=0 to 255 do
Begin
if (intPeak2<=intGrayLevel[intLoop]) and (intLoop<>intIndx) then
begin
intPeak2:=intGrayLevel[intLoop];
intIndx2:=intLoop;
end
end;
//取得双峰之间的谷值
intValley:=intSize;
if intIndx2<intIndx then
for intLoop:=intIndx2 to intIndx do
if intValley>intGrayLevel[intLoop] then
begin
intValley:=intGrayLevel[intLoop];
intValleyIndx:=intLoop;
end;
从分割的效果来看,当前后景的对比较为强烈时,分割效果较好;否则基本无效。
2. 迭代法
迭代法是基于逼近的思想,其步骤如下:
1. 求出图象的最大灰度值和最小灰度值,分别记为ZMAX和ZMIN,令初始阈值T0=
(ZMAX+ZMIN)/2;
2. 根据阈值TK将图象分割为前景和背景,分别求出两者的平均灰度值ZO和ZB;
3. 求出新阈值TK+1=(ZO+ZB)/2;
4. 若TK=TK+1,则所得即为阈值;否则转2,迭代计算。
以下给出迭代求阈值的部分实现:
//阈值初始为0
intThresholdVal:=0;
intThresholdVal2:=0;
//总灰度值
intTotalGrayLevel:=0;
for intLoop:=0 to 255 do
if intGrayLevel[intLoop]<>0 then
intTotalGrayLevel:=intTotalGrayLevel+intLoop*intGrayLevel[intLoop];
//求出初始最大灰度值
for intLoop:=0 to 255 do
if intGrayLevel[intLoop]>0 then
begin
intLGrayLevel:=intLoop;
intThresholdVal:=intLoop;
break;
end;
//求出初始最小灰度值和初始阈值
for intLoop:=255 downto 0 do
if intGrayLevel[intLoop]>0 then
begin
intRGrayLevel:=intLoop;
intThresholdVal:=(intThresholdVal+intLoop)div 2;
break;
end;
//迭代求解
while intThresholdVal<>intThresholdVal2 do
begin
intThresholdVal2:=intThresholdVal;
intCount:=0;
intLGrayLevel:=0;
for intLoop:=0 to intThresholdVal do
if intGrayLevel[intLoop]<>0 then
begin
intCount:=intCount+intGrayLevel[intLoop];
intLGrayLevel:=intLGrayLevel+intLoop*intGrayLevel[intLoop];
end;
intRGrayLevel:=intTotalGrayLevel-intLGrayLevel;
intLGrayLevel:=intLGrayLevel div intCount;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -