我正在学习 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 格式的硬东西......)