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;
}
}