寻算法(200分)

  • 主题发起人 主题发起人 康夫
  • 开始时间 开始时间

康夫

Unregistered / Unconfirmed
GUEST, unregistred user!
如何将彩色图片转化为黑白的,通过点的稀疏,哪里有现成的算法?
 
procedure TForm1.Button1Click(Sender: TObject);
var
p :PByteArray;
Gray,x,y :Integer;
Bmp :TBitmap;
begin
Bmp :=TBitmap.Create;
Bmp.Assign(Image1.Picture.Bitmap);
Bmp.PixelFormat :=pf24Bit;
for y:=0 to Bmp.Height-1 do
begin
p:=Bmp.scanline[y];
for x:=0 to Bmp.Width-1 do
begin
Gray:=Round(p[x*3+2]*0.3+p[x*3+1]*0.59+p[x*3]*0.11);
p[x*3]:=Gray;
p[x*3+1]:=Gray;
p[x*3+2]:=Gray;
end;
end;
Image1.Picture.Bitmap.Assign(Bmp);
Bmp.Free;
end;
 
我不要灰度的,要完全黑白的,因为我要送给打印机打印
 
打印机也能打灰度阿
 
你什么打印机阿?那么变态。那样的不大好办哦。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=168070
 
我的打印机是我们自己生产的BY2000S条码打印机,热敏打印的,只能打印单色的位图,斑马的
某些型号也一样
 
TBitmap.PixelFormat
指定一下颜色数,将图片转换一下。
 
取一个阀值啊!
for y := 0 to Bmp.Height - 1 do
begin
p := Bmp.scanline[y];
for x := 0 to Bmp.Width - 1 do
begin
Gray := Round(p[x * 3 + 2] * 0.3 + p[x * 3 + 1] * 0.59 + p[x * 3]
* 0.11);

if gray > 128 then //È¡¸ö·§Öµ
begin
// if a<>0 then
p[x * 3] := 255;
p[x * 3 + 1] := 255;
p[x * 3 + 2] := 255;
end
else
begin
p[x * 3] := 0;
p[x * 3 + 1] := 0;
p[x * 3 + 2] := 0;
end;
end;
end;
Image1.Picture.Bitmap.Assign(Bmp);
 
Huazai兄的看法似乎不妥, 设若取一阀值, 则必然大于此值者皆墨, 而低于此值者皆白,
非吾本意也, 吾意乃通过点之疏密来表现图像之灰度, 灰度大者, 则点密, 小者则点疏.
 
To 康夫:你是否是ZX?扬州?
 
可以用区域法,比如4*4区域,算出区域内的平均亮度h,
再用256/4/4*h个白点均匀插入4*4区域中。
 
找一下抖动算法吧.
 
给你这样的思路:
1. 取一个阀值,求出整个图像的疏密度,
2. 对每个象素点,在它的8领域(或更大)求得局部疏密度,
3. 由局部疏密度,根据全图的疏密度进行该象素点的灰度提升或降低,或直接变为二值图像.
 
后退
顶部