如何在C#中创建红外滤镜效果

时间:2014-01-05 22:36:05

标签: c# image image-processing windows-phone-8 filtering

我最近在谷歌图片中搜索了一些非常酷的红外图片,我想尝试一些像素操作来创建这种效果。我确实有像素处理的经验,通常只是从图像的开始到结束,提取argb值,操纵它们,然后重新创建像素并将其放回图像或副本中。我想我的问题是,如何操作rgb值以从常规图像中创建这样的效果?

我可能会使用以下内容从像素数据中提取argb值,同时循环显示图像的像素

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

            }

编辑:下面的示例图片

enter image description here

OR

enter image description here

1 个答案:

答案 0 :(得分:2)

不幸的是,红外拍摄的效果难以再现,而不了解照片上的不同物体如何反射或吸收红外光。其中存在不允许我们创建通用红外滤波器的问题。虽然有一些解决方法。我们知道叶子和草通常比其他物体更能反射红外光。因此,主要目标应该是绿色操作(如果你想要一些额外的效果,可以是其他颜色)。

AForge.Imaging是一个开源.NET库,可能是一个很好的起点。它提供了各种filters,您可以轻松查看每个实现方式。您还可以查看项目中的examples。另一个选择是查看Codeproject上的项目。我写了一些代码来展示如何使用一些过滤器。

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

原始图像(test.jpg)

enter image description here

色调修饰符的应用

ImageProcessing.Process("test.jpg", new HueModifier(30))
               .Save("result_1.jpg");

色调修饰符的结果(result_1.jpg)

enter image description here

饱和度校正的应用

ImageProcessing.Process("test.jpg", new SaturationCorrection(0.35f))
               .Save("result_2.jpg");

饱和度校正的结果(result_2.jpg)

enter image description here

过滤链的应用

ImageProcessing.Process("test.jpg"
            ,new List<IFilter>() {
                                  new BrightnessCorrection(), 
                                  new SaturationCorrection(0.1f), 
                                  new HueModifier(300)})
            .Save("result_3.jpg");

过滤器链的结果(result_3.jpg)

enter image description here