我最近从谷歌图像搜索红外线中看到了一些非常酷的图片,我想尝试一些像素操作来创建这种效果.我确实有像素处理的经验,通常只是从图像的开始到结束,提取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)