转换为灰度并缩小尺寸

时间:2012-12-27 11:49:20

标签: image-processing vb6 bmp grayscale

我正在尝试在VB6中开发OCR,我在BMP格式方面遇到了一些问题。我一直在研究OCR过程,第一步是用“阈值”转换“黑白”图像。转换过程很容易理解,我已经完成了。但是,我正在尝试减小结果图像的大小,因为它使用较少的颜色(每个像素在灰度级中只有256个可能的值)。在原始图像中我有3种颜色(红色,绿色和蓝色),但现在我只需要一种颜色(灰度值)。在这一刻,我已经实现了转换,但生成的灰度图像与原始彩色图像具有相同的大小(我在三个通道中分配了相同的颜色值)。

我试图修改BMP文件的标题,但我没有实现任何目标,现在我不明白它是如何工作的。例如,如果我使用paint转换图像,则标题中指定的偏移量会更改其值。如果标头是常量,为什么偏移会改变它的值?。

2 个答案:

答案 0 :(得分:1)

问题是灰度位图图像与彩色位图图像的大小相同,因为用于保存灰色的数据占用的空间与颜色一样多。

唯一的区别是灰色只是相同值的3倍。 (160,160,160)例如,颜色与(123,200,60)类似。灰度值只是RGB场的一小部分。

例如,通过将其从24位转换为16位或8位,可以在转换为灰度后缩小尺寸。虽然这取决于您使用什么来进行转换,无论是否已经提供给您。否则你必须自己做。

您还可以尝试使用除BMP图像之外的其他内容。 PNG文件也是无损的,甚至可以节省24位版本的空间。图像处理库通常会为您提供多种输出格式选项。否则你可能会找到一个为你做这个的库。

答案 1 :(得分:0)

您可以使用“lockbits”方法编写自己的转换。理解如何正确锁定/解锁位需要一段时间,但努力是值得的,一旦您使用了代码,您将看到它如何应用于其他场景。例如,使用锁定/解锁位技术,您可以从位图访问像素值,将这些像素值复制到数组中,操作数组,然后将修改后的数组复制回位图。这比调用GetPixel()和SetPixel()要快得多。这仍然不是人们可以编写的最快的图像处理代码,但是实现和维护代码相对容易。

自从我编写VB6代码已经有一段时间了,但鲍勃鲍威尔经常有很好的例子,他有一个关于锁定位的页面:

http://www.bobpowell.net/lockingbits.htm

在紧要关头,您可以创建适当格式的新位图,并为每个像素调用SetPixel():

  1. 24位彩色图像中的每个像素(x,y)都有一个颜色值(r,g,b)
  2. 转换为24位灰度图像后,每个像素(x,y)对于每个颜色通道将具有三个相等的值;可以表达为(n,n,n),正如威廉在回答中所写的那样。如果所有三种颜色R,G,B具有相同的值,则可以说颜色值是该像素的“灰度”值。这与您在最终的8位位图中看到的灰色相同。
  3. 为新创建的8位位图中的每个像素(x,y)调用SetPixel,该位图与原始彩色图像的宽度和高度相同。