公布一段我写的二值化与边缘化的代码.(20分)

  • 主题发起人 主题发起人 QSmile
  • 开始时间 开始时间
Q

QSmile

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Button1Click(Sender: TObject);
var
Bmp:TBitmap;
Bmp1:TBitmap;

i,j:integer;
p:PByteArray;
Li:byte;

p1:PByteArray;
p2:PByteArray;
p3:PByteArray;
begin
Bmp := TBitmap.Create;
Bmp.Assign(Image1.Picture.Bitmap);
Bmp.HandleType := bmDIB;
Bmp.PixelFormat := pf24bit;
// 二值化
for j := 0 to Bmp.Height-1 do
begin
P := Bmp.ScanLine[j];
for i := 0 to Bmp.Width -1 do
begin
li := Byte(Round(0.3* p[i*3+2] + 0.59 * p[i*3+2] + 0.11 * p[i*3] ));
if Li < 230 then // 阈值
begin
p[i*3] := 0;
p[i*3+1] := 0;
p[i*3+2] := 0;
end
else begin
p[i*3] := 255;
p[i*3+1] := 255;
p[i*3+2] := 255;
end;
end;
end;
Image2.Picture.Bitmap.Assign(bmp);

Bmp1 := TBitmap.Create;
Bmp1.Assign(bmp);
Bmp1.PixelFormat := pf24bit;
// 边缘化
for j := 1 to Bmp.Height -2 do
begin
p1 := Bmp.ScanLine[j-1];
p2 := Bmp.ScanLine[j];
p3 := Bmp.ScanLine[j+1];

p := Bmp1.ScanLine[j];
for i := 1 to Bmp.Width -2 do
begin
if p2[i*3] <> 0 then Continue;
if (p2[(i-1)*3] <> 255 ) and (p2[(i+1)*3] <> 255) and
(p1[(i-1)*3] <> 255 ) and (p1[i*3] <> 255) and (p1[(i+1)*3] <> 255 ) and
(p3[(i-1)*3] <> 255 ) and (p3[i*3] <> 255) and (p3[(i+1)*3] <> 255 ) then
begin
// i,j = white
p[i*3] := 255;
p[i*3+1] := 255;
p[i*3+2] := 255;
end
else begin
// black
p[i*3] := 0;
p[i*3+1] := 0;
p[i*3+2] := 0;
end;
end;
end;

Image3.Picture.Bitmap.Assign(Bmp1);
Bmp1.Free;
Bmp.Free;
end;

==========================================
边缘化是我自己想的,不知道对不
思路: 当前点,如果是白的,那转化后还是白的.
当前点如果是黑的.那找它的四周(八个方向),如果有白的点,那这个点是在边缘上,它应该是黑的. 如果四周都是黑的,那它不是边缘,应该是白的.

高手们指证,想做一个简单字符似别的东东.
 
思路好像有点问题。
假定一个黑色的矩形
当你检测出第一行是黑的,
那么第二行便为白的
然后第三行又为黑的了
这个和你的初衷就不一样了。


仅仅个人一点看法,呵呵!
 
思路好像有点问题。
假定一个黑色的矩形
当你检测出第一行是黑的,
那么第二行便为白的
然后第三行又为黑的了
这个和你的初衷就不一样了。

----------------------
不会的。我中间是生成了临时文件来处理的。
 
放分了.再来几个人
 
老大,C++的要不
 
多人接受答案了。
 
后退
顶部