2012-12-27 183 views
0

我正試圖在VB6中開發一個OCR,並且我有一些BMP格式的問題。我一直在研究OCR過程,第一步是將圖像以「黑白」轉換爲閾值。轉換過程很容易理解,我已經完成了。但是,我試圖減小生成的圖像的尺寸,因爲它使用較少的顏色(每個像素在灰度中只有256個可能的值)。在原始圖像中我有3種顏色(紅色,綠色和藍色),但現在我只需要一種顏色(灰度值)。在這一刻,我已經實現了轉換,但生成的灰度圖像與原始彩色圖像具有相同的尺寸(我在三個通道中指定了相同的顏色值)。轉換爲灰度並縮小尺寸

我試圖修改BMP文件的標題,但我還沒有實現任何內容,現在我不明白它是如何工作的。例如,如果我使用paint轉換圖像,則標題中指定的偏移將更改其值。如果標題不變,爲什麼偏移量會改變它的值?

+0

最好使用Emgu-CV來轉換BMP –

+0

你有可能遷移到.NET嗎?大量的內置圖像轉換。 – Rethunk

回答

0

問題是灰度位圖圖像與彩色位圖圖像大小相同,因爲用於保存灰色的數據佔用的空間與顏色一樣多。

唯一的區別是灰色只是相同值的3倍。例如(160,160,160),顏色給出類似(123,200,60)的東西。灰度值只是RGB字段的一小部分。

例如,您可以通過將其轉換爲灰度級後將其大小從24位轉換爲16位或8位,從而縮小尺寸。儘管這取決於您使用的是否已經提供給您的轉換。否則,你必須自己做。

你也可以嘗試使用別的比BMP圖像。 PNG文件也是無損的,甚至可以節省24位版本的空間。圖像處理庫通常會爲您提供多種選項作爲輸出格式。否則,你可能會找到一個爲你做這個的庫。

0

您可以在「lockbits」方法中編寫自己的轉換。理解如何正確地鎖定/解鎖位需要一段時間,但是這種努力是值得的,一旦你有了代碼工作,你就會看到它是如何應用於其他場景的。例如,使用鎖定/解鎖位技術,您可以從位圖訪問像素值,將這些像素值複製到數組中,操作數組,然後將修改後的數組複製回位圖。這比調用GetPixel()和SetPixel()快得多。這仍然不是可以編寫的最快的圖像處理代碼,但實現和維護代碼相對容易。

這已經有一段時間,因爲我寫的VB6代碼,但鮑勃·鮑威爾往往具有很好的例子,他有一個關於鎖定位頁:

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

在緊要關頭,你可以創建一個新的爲每個像素的適當的格式和呼叫SetPixel()的位圖:

  1. 每個像素(x,y)的在24位彩色圖像將具有的顏色值(R,G,b)
  2. 後轉換爲24位灰色圖像,每個像素(x,y)對於每個顏色通道將具有三個相等的值;這可以表示爲(n,n,n),正如威廉在他的回覆中所寫的那樣。如果所有三種顏色R,G,B具有相同的值,則可以說顏色值是該像素的「灰度」值。這與您在最終的8位位圖中看到的灰色是相同的。
  3. 在與原始彩色圖像具有相同寬度和高度的新創建的8位位圖中爲每個像素(x,y)調用SetPixel。