El procesamiento de imágenes en C #

Este artículo es reproducido conexión:  https://blog.csdn.net/wchstrife/article/details/78984735

El uso de C # de procesamiento de imágenes
prefacio
antes siempre pensó que el procesamiento de imágenes es una cuestión de un muy grande, se encontró con un trabajo de procesamiento de imágenes en una clase electiva, se inició una imagen sencilla pocos algoritmos de procesamiento, se puede considerar en el la puerta más simple. 
La interfaz es sencilla, feo, el nombre en clave también más informal, nos centramos en algoritmos como 
para lograr un total de viñetas, reduciendo el brillo, escala de grises, relieves, mosaicos, seis algoritmo de difusión. 
Proyecto github dirección: https: //github.com/wchstrife/ImageProcessing

diseño de la interfaz
usada aquí es VS2010, después de que el nuevo proyecto de C #. Dibujar en la pantalla 
- como las imágenes muestran el control de dos PictureBox. 
- Seis botón como un disparo diferentes efectos, 
- 2 botón para abrir y guardar el archivo como un disparador, 
- 1 etiqueta encarga de mostrar el tiempo de funcionamiento.

Abrir y guardar archivos

Aquí está la llamada principal OpenFileDialog y OpenFileDialog, no específicamente. 
Abrir el archivo:

button7_Click private void (object sender, EventArgs e)
        {
            si (OpenFileDialog1.ShowDialog () == DialogResult.OK)
            {
                string path = openFileDialog1.FileName;
                mapa de bits = (Bitmap) Image.FromFile (ruta de acceso);
                PictureBox1.Image = bitmap.Clone () como imagen;
            }
        }

Guarde el archivo:

button8_Click private void (object sender, EventArgs e)
        {
            bool isSave = true;

            si (saveFileDialog1.ShowDialog () == DialogResult.OK)
            {
                string filename = saveFileDialog1.FileName.ToString ();

                si (archivo = "!" && nomArchivo! = null)
                {
                    string fileExtName = fileName.Substring (fileName.LastIndexOf ( "") + 1). .ToString ();

                    System.Drawing.Imaging.ImageFormat imgformat = null;

                    si (fileExtName = "")
                    {
                        switch (fileExtName)
                        {
                            case "jpg":
                                imgformat = System.Drawing.Imaging.ImageFormat.Jpeg;
                                descanso;
                            caso "bmp":
                                imgformat = System.Drawing.Imaging.ImageFormat.Bmp;
                                descanso;
                            caso "gif":
                                imgformat = System.Drawing.Imaging.ImageFormat.Gif;
                                descanso;
                            defecto:
                                MessageBox.Show ( "sólo se tiene acceso a: jpg, bmp, gif");
                                isSave = false;
                                PAUSA;
                        }

                    }

                    // formato predeterminado Guardar JPG   
                    SI (imgformat == null)
                    {
                        imgformat = System.Drawing.Imaging.ImageFormat.Jpeg;
                    }

                    SI (isSave)
                    {
                        try
                        {
                            this.pictureBox2.Image.Save (nombre del archivo, imgformat);
                            //MessageBox.Show ( "La imagen se ha guardado correctamente!");   
                        }
                        La captura
                        {
                            MessageBox.Show ( "No se pudo guardar, no se ha interceptado había sido vaciada fotografías o imágenes ") ;!
                        }
                    }
                }
            }
        }

Añadir viñetas
viñeteado es añadir un círculo oscureciendo poco a poco en las esquinas de la imagen.

pasos básicos de:
calcular una distancia del vértice centro maxDistance
distancia se calcula para cada píxel desde el punto central
factor de cálculo = distancia / maxDistance
el píxel de color actual se establece en el color original * (1-factor de)
efectos en la fig.

Button1_Click private void (object sender, EventArgs e)
        {
            si (mapa de bits! = null)
            {
                newbitmap = bitmap.Clone () como mapa de bits;

                sw.Reset ();
                sw.Restart ();

                int width = newbitmap.Width;
                altura int = newbitmap.Height;
                flotador cx = anchura / 2;
                flotar cy = altura / 2;
                flotador maxdist = cx cx + cy * * cy;
                flotar currDist = 0, el factor;
                Píxel de color; 

                for (int i = 0; i <anchura; i ++)
                {
                    for (int j = 0; j <altura; j ++)
                    {
                        currDist = ((float) i - cx) * ((float) i - cx) + (( flotar) j - cy) * ((float) j - cy);
                        = factor de currDist / maxdist;

                        pixel = newbitmap.GetPixel (i, j);
                        int rojo = (int) (pixel.R * (1 - factor de));
                        int = verde (int) (pixel.G * (1 - factor de));
                        int = azules (int) (pixel.B * (1 - factor de));
                        newbitmap.SetPixel (i, j, Color.FromArgb (rojo, verde, azul));
                    }
                }

                sw.Stop ();
                timer.Text = sw.ElapsedMilliseconds.ToString ();
                pictureBox2.Image = newbitmap.Clone () como imagen;               
            }
        }

disminuir el brillo

Los pasos básicos

Se proporciona para reducir el brillo del color original del píxel actual un coeficiente inferior a 1, debe observarse que los componentes de los colores no pueden exceder de 255. Aquí elegimos 0,6 como coeficiente.

representaciones

Button2_Click private void (object sender, EventArgs e)
        {
            si (mapa de bits! = null)
            {
                newbitmap = bitmap.Clone () como mapa de bits;
                sw.Reset ();
                sw.Restart ();
                Píxel de color;              
                int rojo, verde, azul;
                for (int x = 0; x <newbitmap.Width; x ++)
                {
                    for (int y = 0; y <newbitmap.Height; y ++)
                    {
                        pixel = newbitmap.GetPixel (x, y);
                        rojo = (int) (pixel.R * 0,6);
                        = verdes (int) (pixel.G * 0,6);
                        = azules (int) (pixel.B * 0,6);
                        newbitmap.SetPixel (x, y, Color.FromArgb (rojo, verde, azul));
                    }
                }
                Sw.Stop ();
                timer.Text = sw.ElapsedMilliseconds.ToString ();
                pictureBox2.Image = newbitmap.Clone () como imagen;
            }
        }

para el color

Los pasos básicos

Es decir, para tomar fotografías en color incineración, RGB ajustar foto de gris. 
Particular color es el píxel actual debe ajustarse según la siguiente ecuación 
Gary = 0,3 * R + 0,59 * G + 0,11 B *

representaciones

Button3_Click private void (object sender, EventArgs e)
        {
            si (mapa de bits! = null)
            {
                newbitmap = bitmap.Clone () como mapa de bits;
                sw.Reset ();
                sw.Restart ();
                Píxel de color;
                int gris;
                for (int x = 0; x <newbitmap.Width; x ++)
                {
                    for (int y = 0; y <newbitmap.Height; y ++)
                    {
                        pixel = newbitmap.GetPixel (x, y);
                        = grises (int) (0,3 * pixel.R + 0,59 * pixel.G + 0,11 * pixel.B);
                        newbitmap.SetPixel (x, y, Color.FromArgb (gris, gris, gris));
                    }
                }
                Sw.Stop ();
                timer.Text = sw.ElapsedMilliseconds.ToString ();
                pictureBox2.Image = newbitmap.Clone () como imagen;
            }
        }

alivio

Los pasos básicos

efecto de relieve es poner tres colores RGB invertidos. 
255- componente con una aplicación específica del color actual

representaciones

button4_Click private void (object sender, EventArgs e)
        {
            si (mapa de bits! = null)
            {
                newbitmap = bitmap.Clone () como mapa de bits;
                sw.Reset ();
                sw.Restart ();
                Píxel de color;
                int rojo, verde, azul;
                for (int x = 0; x <newbitmap.Width; x ++)
                {
                    for (int y = 0; y <newbitmap.Height; y ++)
                    {
                        pixel = newbitmap.GetPixel (x, y);
                        rojo = (int) (255 - pixel.R);
                        verde = (int) (255 - pixel.G);
                        = azules (int) (255 - pixel.B);
                        newbitmap.SetPixel (x, y, Color.FromArgb (rojo, verde, azul));
                    }
                }
                Sw.Stop ();
                timer.Text = sw.ElapsedMilliseconds.ToString ();
                pictureBox2.Image = newbitmap.Clone () como imagen;
            }
        }

mosaico

Los pasos básicos

idea básica mosaico es a píxeles alrededor de un píxel a tomar un promedio, entonces estos píxeles de color se ajusta a este promedio. 
Píxeles alrededor de la toma, el mayor efecto mosaico también es más evidente.

representaciones

/ **
         * mosaico
         * predeterminado efecto red 50
         * * /
        privada Button5_Click void (object sender, EventArgs e)
        {
            SI (mapa de bits! = Null)
            {
                Newbitmap = bitmap.Clone () como mapa de bits;
                sw.Reset () ;
                sw.Restart ();
                int RIDIO = 50; // escala mosaico, que rodea dos píxeles predeterminados
                for (int 0 = H; H <newbitmap.Height; H + = RIDIO)
                {
                    for (int W = 0; W <newbitmap.Width; = W + RIDIO)
                    {
                        int avgRed = 0, 0 = avgGreen, avgBlue = 0;
                        int COUNT = 0;
                        //取周围的像素
                        for (int x = w; (x <w + RIDIO && x <newbitmap.Width); x ++)
                        {
                            for (int y = h; (Y <h + RIDIO && y <newbitmap.Height) ; y ++)
                            {
                                pixel color = newbitmap.GetPixel (x, y);
                                avgRed + = pixel.R;
                                avgGreen + = pixel.G;
                                avgBlue + = pixel.B;
                                contar ++;
                            }
                        }

                        // promediaron
                        avgRed = avgRed / COUNT;
                        avgBlue = avgBlue / COUNT;
                        avgGreen = avgGreen / COUNT;

                        //设置颜色
                        for (int x = w; (x <w + RIDIO && x <newbitmap.Width); x ++)
                        {
                            for (int y = h; (Y <h + RIDIO && y <newbitmap.Height); y ++ )
                            {
                                color Newcolor = Color.FromArgb (avgRed, avgGreen, avgBlue);
                                newbitmap.SetPixel (x, y, Newcolor);
                            }
                        }
                    }
                }
                Sw.Stop ();
                timer.Text = sw.ElapsedMilliseconds.ToString ();
                pictureBox2.Image = newbitmap.Clone () como imagen;
            }
        }

efecto de difusión

Los pasos básicos

La difusión de tinta sobre papel similar. A los píxeles adyacentes seleccionados al azar, establecen su propio color. 
Tenga en cuenta que esto debe ser seleccionado al azar píxeles circundantes.

representaciones

button6_Click private void (object sender, EventArgs e)
        {
            si (mapa de bits! = null)
            {
                newbitmap = bitmap.Clone () como mapa de bits;
                sw.Reset ();
                sw.Restart ();
                Píxel de color;
                int rojo, verde, azul;
                int bandera = 0;
                for (int x = 0; x <newbitmap.Width; x ++)
                {
                    for (int y = 0; y <newbitmap.Height; y ++)
                    {
                        Random corrió = new Random ();
                        int RankKey = ran.Next (-5, 5);
                        si (x + RankKey> = newbitmap.Width || y + RankKey> = newbitmap.Height || x + RankKey <0 || y + RankKey <0)
                        {
                            bandera = 1;
                            Seguir;
                        }

                        pixel = newbitmap.GetPixel (x + RankKey, y + RankKey);
                        rojo = (int) (pixel.R);
                        verde = (int) (pixel.G);
                        = azules (int) (pixel.B);
                        newbitmap.SetPixel (x, y, Color.FromArgb (rojo, verde, azul));
                    }
                }
                Sw.Stop ();
                timer.Text = sw.ElapsedMilliseconds.ToString ();
                pictureBox2.Image = newbitmap.Clone () como imagen;
            }
        }

 

 


 

Publicado seis artículos originales · ganado elogios 189 · vistas 280 000 +

Supongo que te gusta

Origin blog.csdn.net/newbie_xymt/article/details/103687459
Recomendado
Clasificación