0

VB6 で OCR を開発しようとしていますが、BMP 形式に問題があります。私はOCRプロセスを調査しており、最初のステップは、画像をしきい値で「白黒」に変換することです。変換プロセスは理解しやすく、実行しました。ただし、使用する色が少ないため、結果の画像のサイズを縮小しようとしています (各ピクセルにはグレースケールで 256 の可能な値しかありません)。元の画像には 3 色 (赤、緑、青) がありますが、今は 1 色 (グレースケールの値) しか必要ありません。この時点で変換は完了しましたが、結果のグレースケール イメージは元のカラー イメージと同じサイズになります (3 つのチャネルに同じカラー値を割り当てます)。

BMP ファイルのヘッダーを変更しようとしましたが、何も達成できず、その仕組みがわかりません。たとえば、画像をペイントで変換すると、ヘッダーで指定されたオフセットによって値が変わります。ヘッダーが定数の場合、オフセットによって値が変わるのはなぜですか?

4

2 に答える 2

1

問題は、グレースケールのビットマップ画像がカラービットマップ画像と同じサイズであることです。これは、グレーの色を保存するために使用されるデータが色と同じくらいのスペースを占めるためです。

唯一の違いは、灰色が同じ値の 3 倍にすぎないことです。(160,160,160)たとえば、次のような色を指定します(123,200,60)。グレー値は、RGB フィールドのほんの一部です。

たとえば、24ビットから16ビットまたは8ビットに変換することにより、グレースケールに変換した後にサイズを縮小できます。それがすでに提供されているかどうかは、変換を行うために何を使用しているかによって異なりますが。それ以外の場合は、自分で作成する必要があります。

BMP 画像以外のものを使用することもできます。PNG ファイルもロスレスであり、24 ビット バージョンでもスペースを節約できます。画像処理ライブラリは通常、出力形式としていくつかのオプションを提供します。それ以外の場合は、おそらくこれを行うライブラリを見つけることができます。

于 2012-12-27T12:06:22.743 に答える
0

「lockbits」メソッドで独自の変換を記述できます。ビットを正しくロック/ロック解除する方法を理解するにはしばらく時間がかかりますが、努力する価値はあります。コードが機能するようになると、他のシナリオにどのように適用できるかがわかります。たとえば、ビットのロック/ロック解除手法を使用すると、ビットマップからピクセル値にアクセスし、それらのピクセル値を配列にコピーし、配列を操作してから、変更した配列をビットマップにコピーして戻すことができます。これは、GetPixel() および SetPixel() を呼び出すよりもはるかに高速です。これはまだ最速の画像操作コードではありませんが、コードの実装と保守は比較的簡単です。

私が VB6 コードを書いてからしばらく経ちましたが、Bob Powell にはしばしば良い例があり、ロック ビットに関するページがあります。

https://web.archive.org/web/20121203144033/http://www.bobpowell.net/lockingbits.htm

ピンチでは、適切な形式の新しいビットマップを作成し、すべてのピクセルに対して SetPixel() を呼び出すことができます。

  1. 24 ビット カラー画像のすべてのピクセル (x,y) には、カラー値 (r,g,b) があります。
  2. 24 ビット グレー イメージへの変換後、各ピクセル (x,y) は、各カラー チャネルに対して 3 つの等しい値を持ちます。ウィレムが返信で書いたように、これは (n,n,n) と表現できます。R、G、B の 3 色すべてが同じ値である場合、その色の値はそのピクセルの「グレースケール」値であると言えます。これは、最終的な 8 ビット ビットマップに表示されるグレーの色合いと同じです。
  3. 元のカラー イメージと同じ幅と高さの新しく作成された 8 ビット ビットマップの各ピクセル (x,y) に対して SetPixel を呼び出します。
于 2013-01-04T03:25:47.547 に答える