quitar - Cómo crear un efecto de filtro de infrarrojos en C#
quitar filtro infrarrojo camara digital (1)
Recientemente me encontré con algunas imágenes muy interesantes de una búsqueda de imágenes de Google para infrarrojos, y me gustaría probar alguna manipulación de píxeles para crear este efecto. Tengo experiencia con la manipulación de píxeles, por lo general solo yendo de principio a fin de una imagen, extrayendo los valores de argb, manipulándolos, luego recreando el píxel y volviendo a colocarlo en la imagen o una copia. Supongo que mi pregunta es, ¿cómo puedo averiguar cómo manipular los valores de rgb para crear tal efecto a partir de una imagen normal?
Probablemente estaría usando algo de lo siguiente para extraer los valores de argb de los datos de píxel mientras recorro los píxeles de la imagen
for (int x = 0; x < width; ++x, ++index)
{
uint currentPixel = sourcePixels[index]; // get the current pixel
uint alpha = (currentPixel & 0xff000000) >> 24; // alpha component
uint red = (currentPixel & 0x00ff0000) >> 16; // red color component
uint green = (currentPixel & 0x0000ff00) >> 8; // green color component
uint blue = currentPixel & 0x000000ff; // blue color component
//Modify pixel values
uint newPixel = (alpha << 24) | (red << 16) | (green << 8) | blue; // reassembling each component back into a pixel
targetPixels[index] = newPixel; // assign the newPixel to the equivalent location in the output image
}
Editar: muestra de imagen a continuación
O
Desafortunadamente, el efecto del disparo infrarrojo es difícil de reproducir sin entender cómo los diferentes objetos en la foto reflejan o absorben la luz infrarroja. Ahí se encuentra el problema que no nos permite crear el filtro infrarrojo universal. Aunque hay algunas soluciones. Sabemos que las hojas y el césped generalmente reflejan la luz infrarroja más que otros objetos. Por lo tanto, el objetivo principal debe ser la manipulación con un color verde (u otro color si desea algunos efectos adicionales).
AForge.Imaging es una biblioteca .NET de código abierto, que podría ser un buen punto de partida. Proporciona una variedad de filtros y puede verificar fácilmente cómo se implementó cada uno de ellos. También puede verificar ejemplos que vienen dentro del proyecto. Otra opción es mirar el proyecto en CodeProject . Escribí un poco de código para mostrar cómo usar algunos filtros.
public static class ImageProcessing
{
public static Bitmap Process(Bitmap image, IFilter filter)
{
return filter.Apply(image);
}
public static Bitmap Process(string path, IFilter filter)
{
var image = (Bitmap)Image.FromFile(path);
return filter.Apply(image);
}
public static Bitmap Process(string path, IEnumerable<IFilter> filters)
{
var image = (Bitmap)Image.FromFile(path);
foreach (var filter in filters)
{
Bitmap tempImage = filter.Apply(image);
image.Dispose();
image = tempImage;
}
return image;
}
}
Imagen original (test.jpg)
Aplicación del modificador de matiz
ImageProcessing.Process("test.jpg", new HueModifier(30))
.Save("result_1.jpg");
Resultado del modificador de matiz (result_1.jpg)
Aplicación de corrección de saturación
ImageProcessing.Process("test.jpg", new SaturationCorrection(0.35f))
.Save("result_2.jpg");
Resultado de la corrección de saturación (resultado_2.jpg)
Aplicación de la cadena de filtro
ImageProcessing.Process("test.jpg"
,new List<IFilter>() {
new BrightnessCorrection(),
new SaturationCorrection(0.1f),
new HueModifier(300)})
.Save("result_3.jpg");