求救:象“画笔”中把彩色图片保存为“单色位图”类型的算法————200大分放送!(200分)

  • 主题发起人 主题发起人 mocheng
  • 开始时间 开始时间
M

mocheng

Unregistered / Unconfirmed
GUEST, unregistred user!
将彩色位图转换为单色位图,我知道前面已经讨论过,并且我也试过,并不完全理想。
我遇到的麻烦是:我有大量的彩色位图,背景有一些灰色,上面有一些黑色的文字和
绿色、红色的曲线。我希望转换成单色后,背景变为白色,其他的文字和曲线等变为黑色。
我试过前面的大侠们提供的一些方法,但在一些机器上能够成功,在另一些机器上却不能
成功,灰色背景转换后变成了黑色。
我用“画笔”中把彩色图片保存为“单色位图”的功能,在每台机器上都能成功,所以,
我想“画笔”有它独特的算法,特请教各位大侠。
附:我现在用的方法
var
p: PByteArray;
w: Integer;
i, j: Integer;
begin
image1.Picture.LoadFromFile(bmpfile);
image1.Picture.bitmap.pixelformat := pf24bit;
for i := 0 to image1.Picture.bitmap.height - 1 do
begin
p := image1.Picture.bitmap.scanline;
j := 0;
while j < (image1.Picture.bitmap.width-1) * 3 do
begin
w :=(p[j] * 28 + p[j+1] * 151 + p[j+2]*77;
w := w shr 6;
p[j] := byte(w);
p[j+1] := byte(w);
p[j+2] := byte(w);
inc(j, 3) ;
end;
end;
image1.Picture.bitmap.pixelformat := pf4bit;
image1.Picture.bitmap.Monochrome:=true;
image1.Picture.Bitmap.SaveToFile(bmpfile);
end;
 
同样的算法在不同的机器上结果会不一样?而且这种位图与设备还是无关的。

关于灰色变为黑色,是否阈值不够?

比如亮度(0-255)在64以下的转为黑色?
 
你可以到www.vclxx.com上找个现成的构件,
完全能满足你的要求!!!
 
感谢两位!www.vclxx.com还没连通。
请问hustmouse:阈值为何?‘比如亮度(0-255)在64以下的转为黑色’是什么意思?请原谅
我在图象处理理论知识方面几乎不了解!但我编一个小程序时不得不处理这方面的内容。
哦,对了,我的彩色图形是通过抓图程序从不同的机器上抓下来的,不知可有关系?
 
你在抓图的时候,记得将所有图片都存成24位位图的图片即可解决这个问题
 
w :=(p[j] * 28 + p[j+1] * 151 + p[j+2]*77;
这是转换灰度

w := w shr 6;
应该是转换成4色图象(黑白,亮度分4个等级)

那么,亮度在64以下的,全被你搞成了黑色

你不如干脆这样试试 :

w := w shr 7;

image1.Picture.bitmap.pixelformat := pf2bit

照理来说,即使用256色抓的图象,是因为当时屏幕设置就是256色,不会引起失真
才对。

不过你可以都试试
 
对不起!由于机器出问题,现在才上到网。HUSTMOUSE大侠:我在不同的机器上分别调整过
w :=(p[j] * 28 + p[j+1] * 151 + p[j+2]*77;
w := w shr 6;
这两行的参数,如28,151,77,6都上下调整过,但不同的机器效果不同,有些机器可以
达到我上面所说的效果,但有的机器无论如何都不行。
 
利用阈值来转换是不正确的,正确的算法应是将不同灰度值用不同的黑白图形填充。
当然不是每一个点,而是一定大小区域!
 
可是...----请给一个详细代码好吗?
 
应该是vcl.vclxx.com
 
vcl.vclxx.com上似乎没有吧
 
彩色图象 -> 灰度图 -> BIN图(黑白图)

灰度图 -> BIN图(黑白图) 的原理:将你认为的灰度区删了
灰度图的范围(0,255),你假设的灰度区是(a,b)[a<b],转换成单色图时:
你将(0,a)内的所有点取"0"值 (b,255)内的所有点取"255"值,这样画出
的图.
彩色图象 -> 灰度图 并不是所有的"灰度图"的存储值都一样
跟R.G.B转换系数有关,(你的R.G.B转换系数比好象是28:151:77(你没贴错?))
这个系数也是自己定的
基于以上两点,1副彩图 转换得的BIN图是很多的----不过同一个程序
在不同机子上的运行结果不完全一样---怪!设备无关呀!?
是不是屏幕显示的结果不完全一样(矫正属性吧),要么你带了色镜(经常换),
要么运行环境不好(把特殊的机子砸了)
-------------------------------------------
有好的算法 我要(catyy1101@263.net)
 
咦?我的帖子怎么少了一段多??
 
这样吧,你把各个象素都扫下来,将颜色植 小于150的转化为白的,其他转为黑的,
不就可以了
 
还有谁想说点什么?
 
多人接受答案了。
 
后退
顶部