BMP图像二值化处理的问题求教

sz100wwb 2011-07-31 02:48:23
for y := 0 to BitImg.Picture.Bitmap.Height - 1 do
begin
b := BitImg.Picture.Bitmap.ScanLine[y];
for x := 0 to BitImg.Picture.Bitmap.Width - 1 do
begin
//一个象素点三个字节
Gray := Round(b[x * 3 + 2] * 0.3 + b[x * 3 + 1] * 0.59 + b[x * 3] * 0.11);
if gray > 128 then //全局阀值
begin
b[x * 3] := 255;
b[x * 3 + 1] := 255;
b[x * 3 + 2] := 255;
end
else
begin
b[x * 3] := 0;
b[x * 3 + 1] := 0;
b[x * 3 + 2] := 0;
end;
end;
end;

上面的代码将24位图二值化后保存的图片文件体积太大。


BitImg.Picture.Bitmap.PixelFormat := pf1bit;
这样保存成1位图后,颜色太暗了。

如何保持二值化后的图像亮度,并大大减小保存后的bmp图片文件所占空间??? 请高手指点 谢谢
...全文
240 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sz100wwb 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 maozefa 的回复:]
测试过的,即使不要你前面的代码,仍然可得到一张黑白的图片(没阀值化的)。
[/Quote]

动态载入时需要先设置bmp的PixelFormat然后就正常了,非常感谢阿发伯的指导!
sz100wwb 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 maozefa 的回复:]
除非你的BitImg.Picture源图不是BMP类型,如jpeg,png类型等,不过同样也得不到24位或者32位的黑白图。
[/Quote]

您提供的代码,执行结果很奇怪,具体表现为:

procedure TForm1.FormCreate(Sender: TObject);
var
x, y, Gray:Integer;
b, t: PByteArray;
Pal: TMaxLogPalette;
begin
// BitImg是TImage控件,在里面手动载入24位色深的bmp图片,结果可以得到想要的1位色深bmp图片
BitImg.Picture.Bitmap.PixelFormat := pf1bit;

LongWord(Pal.palPalEntry[0]) := $000000;
LongWord(Pal.palPalEntry[1]) := $ffffff;
Pal.palVersion := $300;
Pal.palNumEntries := 2;
BitImg.Picture.Bitmap.Palette := CreatePalette(PLogPalette(@Pal)^);
BitImg.Invalidate;
end;



procedure TForm1.FormCreate(Sender: TObject);
var
x, y, Gray:Integer;
b, t: PByteArray;
Pal: TMaxLogPalette;
begin
BitImg.Picture.LoadFromFile('c:\pic24.bmp'); //动态载入24位bmp图片,结果得到的图片全黑
BitImg.Picture.Bitmap.PixelFormat := pf1bit;

LongWord(Pal.palPalEntry[0]) := $000000;
LongWord(Pal.palPalEntry[1]) := $ffffff;
Pal.palVersion := $300;
Pal.palNumEntries := 2;
BitImg.Picture.Bitmap.Palette := CreatePalette(PLogPalette(@Pal)^);
BitImg.Invalidate;
end;
阿发伯 2011-08-03
  • 打赏
  • 举报
回复
除非你的BitImg.Picture源图不是BMP类型,如jpeg,png类型等,不过同样也得不到24位或者32位的黑白图。
阿发伯 2011-08-03
  • 打赏
  • 举报
回复
测试过的,即使不要你前面的代码,仍然可得到一张黑白的图片(没阀值化的)。
sz100wwb 2011-08-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 maozefa 的回复:]
Delphi(Pascal) code


var
x, y, Gray:Integer;
b, t: PByteArray;
Pal: TMaxLogPalette;
begin
for y := 0 to BitImg.Picture.Bitmap.Height - 1 do
begin
b := BitImg.Picture.Bitmap.Sc……
[/Quote]

您好像没有测试吧? 得到的图片全是黑色的。
阿发伯 2011-08-03
  • 打赏
  • 举报
回复

var
x, y, Gray:Integer;
b, t: PByteArray;
Pal: TMaxLogPalette;
begin
for y := 0 to BitImg.Picture.Bitmap.Height - 1 do
begin
b := BitImg.Picture.Bitmap.ScanLine[y];
for x := 0 to BitImg.Picture.Bitmap.Width - 1 do
begin
//一个象素点三个字节
Gray := Round(b[x * 3 + 2] * 0.3 + b[x * 3 + 1] * 0.59 + b[x * 3] * 0.11);
if gray > 128 then //全局阀值
begin
b[x * 3] := 255;
b[x * 3 + 1] := 255;
b[x * 3 + 2] := 255;
end
else
begin
b[x * 3] := 0;
b[x * 3 + 1] := 0;
b[x * 3 + 2] := 0;
end;
end;
end;
BitImg.Picture.Bitmap.PixelFormat := pf1bit;
LongWord(Pal.palPalEntry[0]) := $000000;
LongWord(Pal.palPalEntry[1]) := $ffffff;
Pal.palVersion := $300;
Pal.palNumEntries := 2;
BitImg.Picture.Bitmap.Palette := CreatePalette(PLogPalette(@Pal)^);
BitImg.Invalidate;
end;
山东蓝鸟贵薪 2011-08-03
  • 打赏
  • 举报
回复
学习学习.................
youyidianmimang 2011-08-03
  • 打赏
  • 举报
回复
看下 原来的 PixelFormat 是多少啊;
你处理后的 应该是 pf24bit吧
sz100wwb 2011-08-03
  • 打赏
  • 举报
回复
谢谢,都不行,和阀值没有关系,会的指点下,分不够再加
贝隆 2011-07-31
  • 打赏
  • 举报
回复
if gray > 128 这个条件可能不太合适,尝试改的更小试试?
lqfcu2 2011-07-31
  • 打赏
  • 举报
回复
按理说亮度不会有什么变化啊。。。实在不行的话,你这样


var
BitMap: TBitmap;
begin
BitMap := TBitmap.Create;
BitMap.PixelFormat := pf1bit;
BitMap.Assing(BitImg.Picture.Bitmap);
end;

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧