我之前的答案因其格式而被删除,我会以更好的方式再写一次。
我在问你是否考虑使用 GPU 来计算两个图像之间的图像差异。由于 GPU 与 CPU 计算相比具有高度并行性,因此该解决方案可以大大提高您的计算时间。
使用 C#,您可以尝试使用 XNA 来实现此目的。实际上,我使用单通道 HLSL(它用于使用 direct3D 对 GPU 进行编程)像素着色器进行了一些测试:
texture texture1;
texture texture2;
sampler textureSampler1 = sampler_state{
Texture = <texture1>;
};
sampler textureSampler2 = sampler_state{
Texture = <texture2>;
};
float4 pixelShaderFunction(float2 TextureCoordinate : TEXCOORD0) : COLOR0{
float4 color1 = tex2D(textureSampler1,TextureCoordinate);
float4 color2 = tex2D(textureSampler2,TextureCoordinate);
if((color1.r == color2.r) && (color1.g == color2.g) && (color1.b == color2.b)){
color1.r = 0;
color1.g = 0;
color1.b = 0;
}
else{
color1.r = 255;
color1.g = 255;
color1.b = 255;
}
return color1;
}
technique Compare
{
pass Pass1
{
PixelShader = compile ps_2_0 pixelShaderFunction();
}
}
XNA 部分的计算非常简单。将 XNA 的基本片段与 Visual Studio 一起使用,我刚刚将绘图函数编写为:
protected override void Draw(GameTime gameTime) {
Stopwatch sw = new Stopwatch();
sw.Start();
GraphicsDevice.Clear(Color.CornflowerBlue);
e.Parameters["texture1"].SetValue(im1);
e.Parameters["texture2"].SetValue(im2);
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.LinearClamp, DepthStencilState.Default, RasterizerState.CullNone, e);
spriteBatch.Draw(im1,new Vector2(0,0),Color.White);
spriteBatch.End();
base.Draw(gameTime);
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
}
im1 和 im2 是加载为 Texture2D 的两个 1920*1080 彩色 bmp 图像,e 是作为效果加载的 file.fx。
使用这种技术,我在相当普通的计算机(I5-2410m @ 2.3Ghz、4Gb ram、Nvidia Geforce GT525m 的笔记本电脑)上获得了 17/18ms 的计算时间。
这是程序的输出,显示了不同的图像(对不起,这是高度放大的,因为我没有 1920*1080 的屏幕:>),此外还有两个图像 im1 和 im2,它们之间有一些小的差异:
http ://img526.imageshack.us/img526/2345/computationtime.jpg
我对 GPU 编程很陌生,所以如果我在如何计算时间或其他任何事情上犯了一个巨大的错误,请随时告诉!
编辑:要注意的第一件事,我刚刚读到“这将是一个不平凡的操作,因为 GPU 不能很好地处理分支。”。
最好的祝福