我最近在谷歌图片中搜索了一些非常酷的红外图片,我想尝试一些像素操作来创建这种效果。我确实有像素处理的经验,通常只是从图像的开始到结束,提取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
}
编辑:下面的示例图片
OR
答案 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;
}
}
ImageProcessing.Process("test.jpg", new HueModifier(30))
.Save("result_1.jpg");
ImageProcessing.Process("test.jpg", new SaturationCorrection(0.35f))
.Save("result_2.jpg");
ImageProcessing.Process("test.jpg"
,new List<IFilter>() {
new BrightnessCorrection(),
new SaturationCorrection(0.1f),
new HueModifier(300)})
.Save("result_3.jpg");