Конвертировать изображение в черно-белый или сепия в С#

Я хочу изменить изображение на Black-White или Sepia. После преобразования изображения я хочу заменить существующее изображение на преобразованное изображение.

Пожалуйста, дайте мне некоторое предложение.

5 ответов

Существует много способов обесцветить цветное изображение. На самом деле, вероятно, нет ни одного "истинного" или "правильного" способа сделать это, хотя некоторые способы более "правильные", чем другие. Я предполагаю, что ваше изображение находится в формате RGB (Red-Green-Blue) (хотя BGR также распространен).

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

Лучший способ генерации изображения в градациях серого - использовать средневзвешенное значение для 3 каналов RGB. Выбор равных весов (0,33 * R + 0,33 * G + 0,33 * B) даст довольно хорошее изображение в оттенках серого. Другие выпуклые веса (неотрицательные веса, сумма которых равна 1) дадут разные результаты, некоторые из которых можно считать более эстетически приятными, а некоторые могут принимать во внимание перцепционные параметры. (YUV использует эти веса: Y = 0.299*R + 0.587*G + 0.114*B)

Вы всегда можете преобразовать изображение в другое цветовое пространство, которое имеет только один канал в оттенках серого (и 2 "цветных канала), например, HSV (V - оттенки серого), YUV (Y - оттенки серого) или Lab (L это оттенки серого). Различия не должны быть очень большими.

Термин "дезатурация" происходит из пространства HSV. Если вы конвертируете изображение в HSV, установите для S-канала (Saturation) все нули и сделайте изображение, вы получите 3-канальное ненасыщенное "цветное" изображение.

Дублирование этих градаций серого в RGB даст вам 3-канальное ненасыщенное "цветное" изображение, где все 3 канала RGB идентичны.

Как только у вас есть это 3-канальное (RGB) ненасыщенное изображение, вы можете умножить каждый канал на отдельный вес, чтобы раскрасить изображение - изображение сепии.

Учитывая серый пиксель [v,v,v], раскрасьте его так: [v*a, v*b, v*c], что 0 <= a,b,c <=1.


private Bitmap grayscale(Image image)
{
 Bitmap btm = new Bitmap(image);
 for (int i = 0; i < btm.Width; i++)
 {
 for (int j = 0; j < btm.Height; j++)
 {
 int ser = (btm.GetPixel(i, j).R + btm.GetPixel(i, j).G + btm.GetPixel(i, j).B) / 3;
 btm.SetPixel(i, j, Color.FromArgb(ser, ser, ser));
 }
 }
 return btm;
}


Для сепии вы хотите сначала преобразовать в оттенки серого. Затем просто умножьте каждый пиксель на заданный триглет масштабирования, такой как [1, 0.95, 0.82], вы можете поиграть с этим триплетом, чтобы получить правильный вид... так что код может быть...

for(x=0; x


// Loop through the images pixels to reset color.
for(x=0; x
<p>Преобразование цветного пикселя в оттенки серого с помощью этого</p> <pre class="prettyprint linenums">Gray = Green * 0.59 + Blue * 0.11 + Red * 0.30; </pre>


Здесь я нашел хороший ответ: https://social.msdn.microsoft.com/Forums/vstudio/en-US/1d6b5960-c509-433c-b000-c885b8c727c4/how-to-convert-an-image-to-black-and-white-not-grayscale?forum=csharpgeneral&prof=required

var color = new Bitmap("file.jpg");
var bw = color.Clone(new Rectangle(0, 0, color.Width, color.Height), 
 PixelFormat.Format1bppIndexed);

licensed under cc by-sa 3.0 with attribution.