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 的直方图 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 的倍数。用 Java 编写的ImageJ读取图像,我得到一个正确的直方图. 现在我想弄清楚是否有办法使用 C# 以某种方式管理图像读取,以便能够获得正确的值,或者这是一个主要问题,替代方案是:放弃或放弃执行某种低级图像读取(jpeg 格式的硬东西......)

4

1 回答 1

1

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

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

于 2012-07-13T18:15:47.377 回答