请问各位高手:在图像处理中,如何得到竖直和水平投影后的区域矩形框? ( 积分: 200 )

  • 主题发起人 主题发起人 rzqcjwrz
  • 开始时间 开始时间
R

rzqcjwrz

Unregistered / Unconfirmed
GUEST, unregistred user!
请问各位高手:在图像处理中,如何得到竖直和水平投影后的红色区域矩形框?
rzqcjwrz@public.cta.cq.cn
 
请问各位高手:在图像处理中,如何得到竖直和水平投影后的红色区域矩形框?
rzqcjwrz@public.cta.cq.cn
 
哪位朋友,能帮我写出一幅图像的双峰法和 迭代法的实用程序,我写时总出错。
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;

intRGrayLevel:=intRGrayLevel div (intSize-intCount);

intThresholdVal:=(intLGrayLevel+intRGrayLevel)div 2;

end;
 
请各位高手相助啊!!!
 
怎么没人理我,高手们助我一力啊!!!
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部