文档图像去噪声 (50分)

  • 主题发起人 主题发起人 cqhxping
  • 开始时间 开始时间
C

cqhxping

Unregistered / Unconfirmed
GUEST, unregistred user!

我要进行文档扫描图像的压缩处理,但由于扫描文档图像中常有阴影、斑点、
或者线条明暗不齐现象。请教各位高手多给评论和指点!
分数好说,只要我认为你的答案基本可以就行。
 
你可以看看《软件工程》2000。3期,上面有介绍算法的
 
你是何希平吗? 我是谁你知道吗?
用中值滤波或者模板滤波试一下

//中值滤波:
procedure TFrmSmoothing.N4Click(Sender: TObject);
var
i,j , s, nTotal, nResult: integer;
ii, jj ,nTemp : integer;
m : array [1..30] of integer;
k : array [1..30] of integer;
begin
for i := 2 to Image1.Picture.Width-1 do
for j :=2 to Image1.Picture.Height-1 do
begin
m[1] := GetRValue(ColorToRGB(Image1.Canvas.Pixels[i-1,j-1]));
m[2] := GetRValue(ColorToRGB(Image1.Canvas.Pixels[i,j-1]));
m[3] := GetRValue(ColorToRGB(Image1.Canvas.Pixels[i+1,j-1]));
m[4] := GetRValue(ColorToRGB(Image1.Canvas.Pixels[i-1,j]));
m[5] := GetRValue(ColorToRGB(Image1.Canvas.Pixels[i,j]));
m[6] := GetRValue(ColorToRGB(Image1.Canvas.Pixels[i+1,j]));
m[7] := GetRValue(ColorToRGB(Image1.Canvas.Pixels[i-1,j+1]));
m[8] := GetRValue(ColorToRGB(Image1.Canvas.Pixels[i,j+1]));
m[9] := GetRValue(ColorToRGB(Image1.Canvas.Pixels[i+1,j+1]));
for ii:=1 to 8 do //冒泡排序
for jj :=ii to 8 do
begin
if m[jj] > m[jj+1] then
begin
nTemp :=m[jj];
m[jj] := m[jj+1];
m[jj+1] :=nTemp;
end;
end;
nResult := m[5];
Canvas.Pixels[i+320,j] := RGB(nResult,nResult,nResult);
end;

end;


//使用模板滤波
procedure TFrmSmoothing.N2Click(Sender: TObject);
var
i,j , s, nTotal, nResult: integer;
m : array [1..30] of integer;
k : array [1..30] of integer;
begin
k[1] := StrToInt(Edit1.text);
k[2] := StrToInt(Edit2.text);
k[3] := StrToInt(Edit3.text);
k[4] := StrToInt(Edit4.text);
k[5] := StrToInt(Edit5.text);
k[6] := StrToInt(Edit6.text);
k[7] := StrToInt(Edit7.text);
k[8] := StrToInt(Edit8.text);
k[9] := StrToInt(Edit9.text);
nTotal := 0;
for i:=1 to 9 do
nTotal := nTotal + k;

for i := 1 to min(328 ,Image1.Picture.Width) do
for j :=1 to min(328 ,Image1.Picture.Height) do
begin
m[1] := GetRValue(ColorToRGB(Canvas.Pixels[i-1,j-1]));
m[2] := GetRValue(ColorToRGB(Canvas.Pixels[i,j-1]));
m[3] := GetRValue(ColorToRGB(Canvas.Pixels[i+1,j-1]));
m[4] := GetRValue(ColorToRGB(Canvas.Pixels[i-1,j]));
m[5] := GetRValue(ColorToRGB(Canvas.Pixels[i,j]));
m[6] := GetRValue(ColorToRGB(Canvas.Pixels[i+1,j]));
m[7] := GetRValue(ColorToRGB(Canvas.Pixels[i-1,j+1]));
m[8] := GetRValue(ColorToRGB(Canvas.Pixels[i,j+1]));
m[9] := GetRValue(ColorToRGB(Canvas.Pixels[i+1,j+1]));
nResult := m[1]*k[1]+ m[2]*k[2]+ m[3]*k[3]+ m[4]*k[4]+ m[5]*k[5]+
m[6]*k[6]+ m[7]*k[7]+ m[8]*k[8]+ m[9]*k[9];
if nTotal<>0 then nResult := nResult div nTotal;
Canvas.Pixels[i+320,j] := RGB(nResult,nResult,nResult);
end;

end;

 
上面的滤波效果如果不够好可以考虑这种方法,他能比较好的保持原来图像中的边缘信息,
效果比中值滤波好,不过运算时间也比较长。具体算法我不记不清了,在不少图像处理的
书都有,大概是算某一个点周围9个不同形状区域(好像有4个正方形,4个6边形和一个其
他形状的区域)的灰度均值和方差,根据这些区域的以上数据确定该点的灰度值。
 
苦瓜:麻烦您到
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=478069
 
谢谢 He Tianwen!
大富翁上还有高手吗?

 
看来,我不该来大富翁了。
 
图像的腐蚀与膨胀
 
to bluefoam:你有“图像的腐蚀与膨胀”处理源代码或者算法吗?可否一见?
 
代码是VC的API的架构,估计对你这种高手是没什么问题的了。
在《程序员大本营》的光盘中VC,VB部分里就有,你可以去买一张。
如果要我发给你的话,请稍等几日。
另外,科学出版社《图像处理与分析--数学形态学方法及应用》中也有开闭的算法,其代码
太过于简单,效果不是很好。
 
多人接受答案了。
 
后退
顶部