在C#,。NET 4.0中读取像素值的麻烦

时间:2012-07-13 18:03:57

标签: c# image-processing aforge

我正在学习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(????)

的倍数处显示出明显不同的计数峰

只是为了执行现实检查,我在Perl中做了类似的东西(我在perl中有更多的经验,我只是学习C#)使用模块GD,并在同一图像中的同一路径上读取像素,我得到了非常不同的价值观。

imageJ的直方图drwan的第一行如下:

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 图像实验室读取相同的图像,我得到了同样的错误:直方图显示了像素值的离散计数,是17的倍数。用 ImageJ读取图像,用Java编写,我得到了正确的直方图。现在我想弄清楚是否有办法,使用C#,以某种方式管理图像阅读,以便能够获得正确的值,或者这是一个主要问题,替代方案是:放弃或者执行某种低级别的图像阅读(jpeg格式的硬件......)

1 个答案:

答案 0 :(得分:1)

将4bpp通道转换为8bpp通道时,17的倍数实际上非常常见。 0x00,0x11,0x22 ... 0xFF都是17的倍数。

在我看来,你有一个量子化的16色灰度图像,带有抖动。