2011-01-17 2 views
0

У меня есть приложение WinForm, и я хочу загрузить растровое изображение (.bmp) в ящик, непосредственно преобразованный в оттенки серого. У меня есть код, как загружать и фильтрации изображения, и я также код для преобразования изображения ... но я не знаю, как соединить их в рабочую программуПреобразование растрового изображения в оттенки серого

private void btnLoad_Click(object sender, EventArgs e) 
{ 
    OpenFileDialog fDialog = new OpenFileDialog(); 
    fDialog.Filter = "Bitmaps |*.bmp| GIFs |*.gif| JPEGs |*.jpg;*.jpeg| TIFs |*.tif"; 
    fDialog.InitialDirectory = @"C:\\"; 
    if (fDialog.ShowDialog() == DialogResult.OK) 
    { 
     pcbImage.Image = Image.FromFile(fDialog.FileName); 
     pcbImage.SizeMode = PictureBoxSizeMode.StretchImage; 
    } 
} 
+1

Может быть, вы должны объяснить немного дальше и дать некоторые примеры того, что вы получили и то, что вы хотите. Я три раза читаю ваш вопрос, и я не уверен, что вы хотите сказать ... «вот так». Как что? – Matten

+0

Это приложение WinForms, ASP.NET? MVC или формы? В этом вопросе не хватает информации, чтобы знать, с чего начать. – David

+0

Не уверенный в закрытии ... он, конечно, выглядел немного смущенным (это понятно, поскольку он здесь новый), но, по крайней мере, часть вопроса понятна, хотя где-то может быть дубликат. Просто мое мнение ... Должны ли мы рекомендовать этому парню изменить вопрос и улучшить его? (Может ли он на самом деле редактировать закрытый вопрос?) –

ответ

6

Ваш вопрос показывает вы довольно запутались в образах и .NET Framework.

С моим ответом я не буду предоставлять вам код, так как требуется немного дополнительного времени, но я хочу помочь вам с советами. Вот алгоритм, кодирование будет за вами.

Прежде всего, получите изображение как RGB, используя класс Image. После загрузки изображения у вас есть структура из пикселей, каждая из которых имеет три компонента R, G и B. Пожалуйста, не обижайтесь, если я начну с самых оснований, но я понятия не имею о вашем фактическом уровне опыта.

Теперь вам нужно сгенерировать новое изображение с таким же расширением и высотой исходного изображения. Изображение в оттенках серого характеризуется наличием R==G==B, что означает, что новое изображение должно иметь все 3 значения одинаковые для каждого пикселя.

Чтобы получить значение, у вас есть несколько вариантов: общий вариант (в основном неправильный) заключается в выполнении среднего арифметического, т.е. C = (R+G+B)/3 (вам нужно усвоить его трижды, один раз для каждого компонента). Я расскажу вам позже, почему этот выбор неправильный, но общепринятый.

Вот псевдокод, который работает для вас

Image old; 
old = Image.Load("file.bmp"); //I don't currently have MSDN at hand, nor I remember how to load the bitmap 
Image new = new Image{ Width = old.Width; Height = old.Height }; 
for (i=0; i<old.Width-1; i++) 
    for (j=0; j<old.Height; j++) 
    { 
     Color p = old[i,j]; 
     byte gray = (p.R+p.G+p.B)/3; 
     new[i,j] = new Color(gray,gray,gray); 
    } 
} 
pictureBox.Image = new; 

Опять уведомления: этот код напоминает псевдо-код, и я на самом деле не проверить.

Почему арифметическое означает неправильно?

(самая интересная часть вопроса, с научной точки)

полутоновых изображений основаны на концепции яркости, что сила света, отраженного от объекта, и впечатление на яркости датчик (т. е. полутоновая камера). Цветной естественный свет состоит из электромагнитных волн с широким спектром, но общие датчики срабатывают только по частотам в . Красный, зеленый и синий Спектры. Человеческий глаз, также, более чувствителен к зеленому цвету, чем другие (у меня была диаграмма, показывающая реакцию человеческого глаза на свет на разных частотах).

Это означает, что принимающие компоненты в трех легких обеспечивают равной способствуют яркости не так, как тогда, когда вы показываете зрителю две лампы той же мощности, один фильтрованной зеленый и один отфильтрованный синий, наблюдатель скажет вам что зеленый свет ярче.

Существует таблица преобразования (я обновляю сообщение позже, если найду его), который показывает, как выполнять взвешенное значение с соответствующими коэффициентами для борьбы с этим явлением.Также было обнаружено, что изображения, преобразованные через эту таблицу, выглядят более реалистичными, чем другие изображения, преобразованные с помощью обычного среднего.

[Последующие меры] Я только что нашел this article с рабочими образцами кода

Редактировать

Теперь, когда вы показали хороший вопрос (и сказали, что у вас есть код преобразования) позвольте мне помочь вам , Если вы разместили код конверсии, это было бы более полезно. Вам необходимо отдельно загрузить ваше изображение с диска, Редактировать it и Свяжите с PictureBox.

Предположив вас есть private Image ConvertToGrayscale(Image source);, вот код, который работает для вас:

private void btnLoad_Click(object sender, EventArgs e) 
{ 
    OpenFileDialog fDialog = new OpenFileDialog(); 
    fDialog.Filter = "Bitmaps |*.bmp| GIFs |*.gif| JPEGs |*.jpg;*.jpeg| TIFs |*.tif"; 
    fDialog.InitialDirectory = @"C:\\"; 
    if (fDialog.ShowDialog() == DialogResult.OK) 
    { 
     Image old = Image.FromFile(fDialog.FileName); 
     pcbImage.Image = ConvertToGrayscale(old); 
     pcbImage.SizeMode = PictureBoxSizeMode.StretchImage; 
    } 
} 
+0

Вы предполагаете, что «растровое изображение» означает файл .bmp, а не одноцветное однобитовое пиксельное растровое изображение. Невозможно сказать по этому вопросу. –

+0

Не совсем .bmp. Даже JPEG распаковывается в формат * matrix * (я добровольно изменил слово * растровое изображение). Я просто предполагаю, что он использует System.Drawing –

+0

Спасибо за ваши ответы ... и да, я использую System.Drawing ... – Bosco

Смежные вопросы