Q
QSmile
Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Button1Click(Sender: TObject);
var
Bmp:TBitmap;
Bmp1:TBitmap;
i,j:integer;
pByteArray;
Li:byte;
p1ByteArray;
p2ByteArray;
p3ByteArray;
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;
==========================================
边缘化是我自己想的,不知道对不
思路: 当前点,如果是白的,那转化后还是白的.
当前点如果是黑的.那找它的四周(八个方向),如果有白的点,那这个点是在边缘上,它应该是黑的. 如果四周都是黑的,那它不是边缘,应该是白的.
高手们指证,想做一个简单字符似别的东东.
var
Bmp:TBitmap;
Bmp1:TBitmap;
i,j:integer;
pByteArray;
Li:byte;
p1ByteArray;
p2ByteArray;
p3ByteArray;
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;
==========================================
边缘化是我自己想的,不知道对不
思路: 当前点,如果是白的,那转化后还是白的.
当前点如果是黑的.那找它的四周(八个方向),如果有白的点,那这个点是在边缘上,它应该是黑的. 如果四周都是黑的,那它不是边缘,应该是白的.
高手们指证,想做一个简单字符似别的东东.