1

私はC#を学んでおり、画像処理の例で宿題を作っています。グレーレベルの jpeg 画像の水平線に沿ってピクセル値を読み取ろうとしています。私が作成したいくつかの印刷物は、私が Format8bppIndexed 画像を読んでいることを知らせてくれました (これは私にとって一種の驚きでした.jpeg 画像はパレットをまったく使用しないと信じていたからです)。Windows フォームの適切なコントロールに画像をロードするコードは次のようになります。

 try
  {
       myImage = ( Bitmap ) Image.FromFile(imageName);
  }
  catch
  {
    MessageBox .Show("Unable to load the image" , Text, MessageBoxButtons .OK, MessageBoxIcon .Hand);
  }
  pictureBox1.Image = myImage ;  

次に、ボタンを押すと、csv ファイルにリストされている画像の任意の直線パスに沿ってピクセルを読み取ろうとします。画像がグレーレベルの場合、赤色を読み取るだけで十分だと思います(そうですか?他の色成分は同じです。getBrightness を使用するとやり過ぎのように思えます)。

  cursorStartx = 0;
  cursorStarty = 256;
  cursorEndx   = myImage.Width;
  cursorEndy   = 256;
  Color pixel;

StreamWriter fs = new StreamWriter( "pixels.csv" , true );
for (var i = 0; i < cursorEndx; i++)
{
  pixel = myImage.GetPixel(i, cursorStarty);
  fs.WriteLine( String .Format("{0}; {1}; {2}" , i, cursorStarty, pixel.R));
}
fs.Close();

ファイルの断面を読むと、まったく意味のない値が表示されます。それらはすべて 17 の倍数 (???) です。

0; 256; 17
1; 256; 0
2; 256; 17
3; 256; 0
4; 256; 17
5; 256; 0
6; 256; 17
7; 256; 0
8; 256; 17
9; 256; 0
10; 256; 17
............
66; 256; 17
67; 256; 34
68; 256; 51
69; 256; 68
70; 256; 85
71; 256; 85
72; 256; 102
73; 256; 85

同じプログラムで作成されたヒストグラムは、17 の倍数 (????) で明確に異なるカウント ピークを示しています。

現実のチェックを実行するためだけに、モジュール GD を使用して Perl で同様のものを作成し (Perl の経験が豊富で、C# を学習しているだけです)、同じ画像内のまったく同じパス上のピクセルを読み取ると、非常に異なる値。

imageJ によって描画されたヒストグラムの最初の行は次のとおりです。

0   0
1   0
2   1
3   1
4   15
5   81
6   304
7   984
8   2362
9   206144
10  2582
11  1408
12  653
13  451
14  345
15  321
16  277
17  288

まったく別の話。

誰かが私がやっている恐ろしくばかげた種類のエラーを私に説明できるでしょうか?

どうもありがとう

----------------------------------- 後で編集 ------------- -------------------------

物事は興味をそそられるようになっています。C# で記述されたAforge image labを使用して同じ画像を読み取ると、同じ種類のエラーが発生しました。ヒストグラムは、17 の倍数であるピクセル値で離散カウントを示します。Java で記述されたImageJで画像を読み取ると、正しいヒストグラムが得られます。 . 現在、正しい値を取得できるようにするために、C# を使用して何らかの方法で画像の読み取りを管理する方法があるかどうかを把握しようとしています。または、これが大きな問題であり、代替手段は次のとおりです。ある種の低レベルの画像読み取りを実行します(jpeg形式の難しいもの...)

4

1 に答える 1

1

4bppチャネルを8bppチャネルに変換する場合、実際には17の倍数が非常に一般的です。0x00、0x11、0x22...0xFFはすべて17の倍数です。

ディザリングを使用した量子化された16色のグレースケール画像があるように見えます。

于 2012-07-13T18:15:47.377 に答える