最近,我从Google图片搜索红外中发现了一些非常酷的图片,我想尝试一些像素操纵来创建这种效果。我确实有像素处理的经验,通常只是从图像的开始到结束,提取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
}
编辑:下面的示例图片
要么
最佳答案
不幸的是,如果不了解照片上的不同物体是如何反射或吸收红外光的,很难再现红外拍摄的效果。其中存在一个问题,使我们无法创建通用红外滤镜。尽管有一些解决方法。我们知道,树叶和草通常比其他物体反射更多的红外光。因此,主要目标应该是使用绿色(如果需要其他效果,则可以使用其他颜色)。
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)
色相修饰剂的应用
ImageProcessing.Process("test.jpg", new HueModifier(30))
.Save("result_1.jpg");
色调修改器的结果(result_1.jpg)
饱和度校正的应用
ImageProcessing.Process("test.jpg", new SaturationCorrection(0.35f))
.Save("result_2.jpg");
饱和度校正的结果(result_2.jpg)
过滤链的应用
ImageProcessing.Process("test.jpg"
,new List<IFilter>() {
new BrightnessCorrection(),
new SaturationCorrection(0.1f),
new HueModifier(300)})
.Save("result_3.jpg");
筛选器链的结果(result_3.jpg)