Проблемы с чтением значений пикселей в C#, .Net 4.0

Я изучаю С#, и я пытаюсь делать домашние задания на примерах обработки изображений. Я пытаюсь прочитать значения пикселей вдоль горизонтальной линии в 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, следующие:

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

совсем другая история.

Кто-нибудь может объяснить мне, какую ужасно глупую ошибку я делаю?

Большое спасибо

----------------------------------- ОТРЕДАКТИРОВАНО ПОЗЖЕ ------------- -------------------------

Вещи становятся интригующими. При чтении того же изображения с помощью Aforge image lab, написанного на C#, я получил ту же ошибку: гистограмма показывает дискретный счет для значений пикселей, кратных 17. Чтение изображения с помощью ImageJ , написанный на Java, я получаю правильную гистограмму. Теперь я пытаюсь выяснить, есть ли способ с помощью С# каким-то образом управлять чтением изображения, чтобы иметь возможность получать правильные значения, или это серьезная проблема, и альтернативы: отказаться или выполнить какое-то низкоуровневое чтение изображения (сложный материал для формата jpeg...)


person Daniel    schedule 13.07.2012    source источник
comment
Проблема не ограничивается одним изображением, но несколько других изображений имеют ту же проблему.   -  person Daniel    schedule 14.07.2012
comment
Бинарная проверка показывает, что изображение было создано с помощью: JFIF Intel(R) JPEG Library, версия [2.0.14.46]   -  person Daniel    schedule 16.07.2012
comment
Пожалуйста, загрузите одно изображение, показывающее эту проблему.   -  person vidstige    schedule 03.11.2014


Ответы (1)


Число, кратное 17, на самом деле довольно распространено при преобразовании каналов 4bpp в каналы 8bpp. 0x00, 0x11, 0x22... 0xFF кратны 17.

Мне кажется, у вас есть квантованное 16-цветное изображение в градациях серого с дизерингом.

person Coincoin    schedule 13.07.2012
comment
Спасибо за совет, но открывать образ совсем другой программой, допустим: rsbweb.nih.gov/ ij четко показывает изображение с уровнем серого 8 бит на пиксель, и гистограмма выглядит хорошо. - person Daniel; 13.07.2012
comment
@Daniel Может быть, вы могли бы загрузить картинку? - person Carra; 13.07.2012