## CSDN博客

### 图像分割的一些简单实现

1．  双峰法

//intPeakintPeak2intValley：峰值和直方图值

//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．  求出图象的最大灰度值和最小灰度值，分别记为ZMAXZMIN，令初始阈值T0=(ZMAX+ZMIN)/2

2．  根据阈值TK将图象分割为前景和背景，分别求出两者的平均灰度值ZOZB

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;

intRGrayLevel:=intRGrayLevel div (intSize-intCount);

intThresholdVal:=(intLGrayLevel+intRGrayLevel)div 2;

end;

3．  大津法（OTSU法）

//遍历所有灰度值求Max g

for intCurrentLevel:=0 to intArrLen do

begin

if intSclGrayLevel[intCurrentLevel]=0 then

continue

else

begin

//计算当阈值为intCurrentLevel时的g

intCount:=0;

intSumPels:=0;

for intLoop:=0 to intCurrentLevel do

begin

intCount:=intCount+intSclGrayLevel[intLoop];

intSumPels:=intSumPels+intSumPelsArr[intLoop];

end;

w0:=intCount/intSize;

u0:=intSumPels/intCount;

w1:=1-w0;

if intSize-intCount<>0 then

u1:=(intTotalPels-intSumPels)/(intSize-intCount)

else

u1:=0;

RlTempO:=w0*w1*(u0-u1)*(u0-u1);

if RlTempO>RlMaxO then

begin

RlMaxO:=RlTempO;

Result:=intCurrentLevel;

end;

end;

4．  灰度拉伸－一种改进的大津法

5．  Kirsh算子

【1】       崔屹，数字图像处理技术与应用，电子工业出版社，1997

【2】       付忠良，图像阈值选取方法，计算机应用，2000

【3】       吴冰、秦志远，自动确定图像二值化最佳阈值的新方法，绘测学院学报，2000

【4】       曹莉华，图像边缘提取中的一种动态阈值获取法，小型微型计算机系统，1997

【5】       付忠良，基于图像差距度量的阈值选取方法，计算机研究与发展，2001

【6】       付忠良，一些新的图像阈值选取方法，计算机应用，2001

【7】       Kenneth.R.Castleman著，朱志刚等译，数字图像处理，电子工业出版社，1998

0 0