GDI+ — широко используемая технология обработки изображений (3)

искусственный интеллект

 

содержание

добиться эффекта резкости

Поверните цветное изображение в черный и белый

Реализовать световые эффекты

Реализовать эффект масляной живописи


добиться эффекта резкости

Принцип реализации: Измените место, где значение цвета пикселя изображения сильно изменяется, место, где значение цвета изменяется незначительно, а изменение невелико, и край изображения, поскольку значение цвета двух соседних пикселей изменяется сильно, поэтому после повышения резкости значение цвета сильно меняется.

 

Код:

    public Image AcuteEffect(PictureBox Pict)

        {

int Var_W = Pict.Width;//Получить ширину картинки

int Var_H = Pict.Height;//Получить высоту картинки

Bitmap Var_bmp = new Bitmap(Var_W, Var_H);//Создаем экземпляр класса Bitmap в соответствии с размером изображения

Bitmap Var_SaveBmp = (Bitmap)Pict.Image;//Создаем экземпляр класса Bitmap в соответствии с изображением

int[] Laplacian = {-1, -1, -1, -1, 9, -1, -1, -1, -1 };// лапласовский шаблон

//обходим каждый пиксель изображения

            for (int i = 1; i < Var_W - 1; i++)

                for (int j = 1; j < Var_H - 1; j++)

                {

int tem_r=0, tem_g=0, tem_b=0, tem_index=0;//Определяем переменные

                    for (int c = -1; c <= 1; c++)

                        for (int r = -1; r <= 1; r++)

                        {

Color tem_color = Var_SaveBmp.GetPixel(i + r, j + c);//Получить значение цвета указанного пикселя

tem_r + = tem_color.R * Лапласиан [tem_index];//устанавливаем значения цвета R

tem_g += tem_color.G * Laplacian[tem_index];//Устанавливаем значение цвета G

tem_b += tem_color.B * Laplacian[tem_index];//Установить значение цвета B

                            tem_index++;

                        }

tem_r = tem_r > 255 ? 255 : tem_r; //Если значение цвета R больше 255, установите значение цвета R на 255, в противном случае без изменений

tem_r = tem_r

tem_g = tem_g > 255 ? 255 : tem_g; //Если значение цвета G больше 255, установите значение цвета R на 255, в противном случае то же самое

tem_g = tem_g

tem_b = tem_b > 255 ? 255 : tem_b; //Если значение цвета B больше 255, установите значение цвета R на 255, иначе оно не изменится

tem_b = tem_b

Var_bmp.SetPixel(i - 1, j - 1, Color.FromArgb(tem_r, tem_g, tem_b));//Установить цвет указанного пикселя

                }

            return Var_bmp;

        }

 

        private void button1_Click(object sender, EventArgs e)

        {

            pictureBox1.Image = AcuteEffect(pictureBox1);

        }

Превратить цветное изображение в черно-белое

Принцип: Измените цветное изображение на более мягкое черно-белое изображение методом усреднения в соответствии со значением цвета RGB цветного изображения.

 

public Image BlackandWhiteEffect(PictureBox Pict)

        {

Int Var_H = Pict.Image.Height;//Получить высоту изображения

Int Var_W = Pict.Image.Width;//Получить ширину изображения

Bitmap Var_bmp = new Bitmap(Var_W, Var_H);//Создаем экземпляр класса Bitmap в соответствии с размером изображения

Bitmap Var_SaveBmp = (Bitmap)Pict.Image;//Создаем экземпляр класса Bitmap в соответствии с изображением

// цикл по пикселям изображения

            for (int i = 0; i < Var_W; i++)

                for (int j = 0; j < Var_H; j++)

                {

Color tem_color = Var_SaveBmp.GetPixel(i, j);//Получить значение цвета текущего пикселя

Int tem_r, tem_g, tem_b, tem_Value = 0;//Определяем переменные

tem_r = tem_color.R;//Получить значение цвета R

tem_g = tem_color.G;//Получить значение цвета G

tem_b = tem_color.B;//Получить значение цвета B

tem_Value = ((tem_r + tem_g + tem_b) / 3);//Используем метод усреднения для создания черно-белого изображения

Var_bmp.SetPixel(i, j, Color.FromArgb(tem_Value, tem_Value, tem_Value));//Изменить значение цвета текущего пикселя

                }

            return Var_bmp;

        }

        private void button1_Click(object sender, EventArgs e)

        {

            pictureBox1.Image = BlackandWhiteEffect(pictureBox1);

        }

Реализовать световые эффекты

Принцип реализации: установите круг в центральной точке, указанной на изображении, и осветлите значение цвета каждого пикселя в круге в соответствии с установленным значением яркости, чтобы сформировать эффект ореола.

 

public Image pp(PictureBox Pict, int x, int y, int R, float better)//R Радиус поверхности сильного засветки, то есть "гало"

        {

Bitmap Var_Bmp = new Bitmap(Pict.Image, Pict.Width, Pict.Height);//Создайте экземпляр класса Bitmap в соответствии с изображением

Int tem_w = var_bmp.width; // получить ширину изображения

INT TEM_H = var_bmp.height;// Получить высоту изображения

//Определяем копию класса Bitmap

            Bitmap Var_SaveBmp = Var_Bmp.Clone(new RectangleF(0, 0, tem_W, tem_H), System.Drawing.Imaging.PixelFormat.DontCare);

Point Var_Center = new Point(x, y);//Центральная точка ореола

//обходим каждый пиксель изображения

            for (int i = tem_W - 1; i >= 1; i--)

            {

                for (int j = tem_H - 1; j >= 1; j--)

                {

float Var_Length = (float)Math.Sqrt(Math.Pow((i - Var_Center.X), 2) + Math.Pow((j - Var_Center.Y), 2));//Устанавливаем диапазон ореола

//Если пиксель находится внутри "ореола"_

                    if (Var_Length < R)

                    {

                        Color Var_Color = Var_SaveBmp.GetPixel(i, j);

                        int r, g, b;

float Var_Pixel = better * (1.0f - Var_Length/R);//Устанавливаем интенсивность света

r = var_color.r + (int) var_pixel; // установить расширенное значение R

r = Math.Max(0, Math.Min(r, 255));//Если значение R выходит за пределы диапазона значения цвета, устанавливаем значение R

g = Var_Color.G + (int)Var_Pixel;//Устанавливаем расширенное значение G

G = Math.Max(0, Math.Min(g, 255));//Если значение G не находится в диапазоне значения цвета, установите значение G

b = Var_Color.B + (int)Var_Pixel;//Установить расширенное значение B

b = Math.Max(0, Math.Min(b, 255));//Если значение B не находится в диапазоне значений цвета, устанавливаем значение B

Var_SaveBmp.SetPixel(i, j, Color.FromArgb(255, r, g, b));//Записываем значение выделенного пикселя обратно в растровое изображение

                    }

                }

            }

            return Var_SaveBmp;

        }

        private void button1_Click(object sender, EventArgs e)

        {

            pictureBox1.Image = pp(pictureBox1,49,47,40,100F);

        }

Реализовать эффект масляной живописи

Принцип реализации: Произвольная обработка пикселей в определенном диапазоне цветов изображения позволяет получить эффект масляной живописи.

Код:

public partial class Frm_Main : Form

    {

        public Frm_Main()

        {

            InitializeComponent();

        }

        private Bitmap SourceBitmap;

        private Bitmap MyBitmap;

        private void button2_Click(object sender, EventArgs e)

        {

//Открываем файл изображения

            OpenFileDialog openFileDialog = new OpenFileDialog();

openFileDialog.Filter = "Файл изображения (JPeg, Gif, Bmp и т. д.)|*.jpg;*.jpeg;*.gif;*.bmp;*.tif;*.tiff;*.png|Файл изображения JPEG( *.jpg;*.jpeg)|*.jpg;*.jpeg |Файл изображения GIF(*.gif)|*.gif |Файл изображения BMP(*.bmp)|*.bmp|Файл изображения Tiff(*.tif) ;*.tiff)|*.tif;*.tiff|Файлы изображений Png (*.png)| *.png|все файлы (*.*)|*.*";

            if (openFileDialog.ShowDialog() == DialogResult.OK)

            {

// получаем изображение исходного размера

                SourceBitmap = new Bitmap(openFileDialog.FileName);

//Получить масштабированное изображение

                MyBitmap = new Bitmap(SourceBitmap, this.pictureBox1.Width, this.pictureBox1.Height);

                this.pictureBox1.Image = MyBitmap;

            }

        }

 

        private void button1_Click(object sender, EventArgs e)

        {

//Показать изображение с эффектом масляной живописи

            Graphics g = this.panel1.CreateGraphics();

//Получить размер изображения

            int width = MyBitmap.Width;

            int height = MyBitmap.Height;

            RectangleF rect = new RectangleF(0, 0, width, height);

            Bitmap img = MyBitmap.Clone(rect, System.Drawing.Imaging.PixelFormat.DontCare);

// Генерируем последовательность случайных чисел

            Random rnd = new Random();

// Берем разные значения, чтобы определить разные степени эффектов масляной живописи

            int iModel = 2;

            int i = width - iModel;

            while (i > 1)

            {

                int j = height - iModel;

                while (j > 1)

                {

                    int iPos = rnd.Next(100000) % iModel;

//Установите значение RGB точки в любую точку в пределах ближайшей точки iModel

                    Color color = img.GetPixel(i + iPos, j + iPos);

                    img.SetPixel(i, j, color);

                    j = j - 1;

                }

                i = i - 1;

            }

// перерисовываем изображение

            g.Clear(Color.White);

            g.DrawImage(img, new Rectangle(0, 0, width, height));

        }

    }