конвертировать изображение в черно-белый или сепию в c # - PullRequest
5 голосов
/ 07 января 2011

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

Пожалуйста, дайте мне несколько советов.

Ответы [ 5 ]

10 голосов
/ 12 января 2011

Существует множество способов обесцветить цветное изображение. На самом деле, вероятно, нет единственного «истинного» или «правильного» способа сделать это, хотя некоторые способы более «правильны», чем другие.
Я предполагаю, что ваше изображение в формате RGB (красный-зеленый-синий) (хотя 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 - это оттенки серого) или La b (L - оттенки серого). Различия не должны быть очень большими.

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

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

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

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

2 голосов
/ 07 января 2011

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

for(x=0; x<image1.Width; x++)     
{         
    for(y=0; y<image1.Height; y++)         
    {             
        Color pixelColor = image1.GetPixel(x, y);             

        int grayScale = (int)((originalColor.R * .3) + (originalColor.G * .59) + (originalColor.B * .11));              
        //create the color object             
        Color newColor =  Color.FromArgb(grayScale, grayScale, grayScale);             

        //now apply a sepia filter
        pixelColor.R = newColor.R*1;
        pixelColor.G = newColor.G*0.95;
        pixelColor.B = newColor.B*0.82;

        image1.SetPixel(x, y, pixelColor);
     }
 }
2 голосов
/ 07 января 2011
// Loop through the images pixels to reset color.
for(x=0; x<image1.Width; x++)
{
    for(y=0; y<image1.Height; y++)
    {
        Color pixelColor = image1.GetPixel(x, y);
        int grayScale = (int)((originalColor.R * .3) + 
            (originalColor.G * .59) + (originalColor.B * .11));

        //create the color object
        Color newColor =  Color.FromArgb(grayScale, grayScale, grayScale);
            image1.SetPixel(x, y, newColor);
    }
}

Преобразование цветного пикселя в оттенки серого с помощью этого

Gray = Green * 0.59 + Blue * 0.11 + Red * 0.30;
1 голос
/ 22 августа 2013
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;
}
0 голосов
/ 06 марта 2018

Здесь я нашел хороший ответ: 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);
...