当前位置: 首页 > 编程语言 > C#

快速计算两张相似图片之间的“脏”区域分享

时间:2023-04-11 01:19:47 C#

快速计算两张相似图片之间的“脏”区域screenshot),我正在尝试找到最好(最快)的方法来找到哪些区域图像已更改(作为代表不同区域的矩形阵列)一些标准:我有两个工作解决方案,但其中一个是逐像素计算的,这当然很慢。另一方面,我尝试将两个图像分成不同大小的块并为每个块计算校验和,但这也很慢。只是为了那些想知道我正在构建什么的人-它是一个更笨(更慢)的远程桌面,可以在没有任何插件的浏览器中工作。您需要逐个像素进行比较。我认为它不应该那么慢。例如代码:intsize=1920*1080*3;byte[]image1=newbyte[size];byte[]image2=newbyte[size];byte[]diff=newbyte[size];varsw=newSystem.Diagnostics.Stopwatch();sw.开始();for(inti=0;i在我的笔记本电脑上运行大约40毫秒。如果它只是灰度,它运行不到20毫秒。如果你将使用真正的图像数据,diff[i]!=0将表示变化在两个图像中。如果使用Bitmap.GetPixel或其他慢速方法读取像素值,则解决方案可能很慢。如果是这种情况,我建议查看Bitmap.LockBits或使用不安全的方法。我之前的回答因为它的格式被删除了,我会以更好的方式重新写。我问你是否考虑使用GPU来计算两个图像之间的图像差异。与CPU计算相比,这种解决方案可以大大增加你的计算时间,因为GPU是高度并行的。使用C#,你可以尝试使用XNA来实现这一点。实际上,我在单通道HLSL中使用像素着色器进行了一些测试(它用于使用direct3D对GPU进行编程):纹理纹理2;采样器textureSampler1=sampler_state{Texture=;};采样器textureSampler2=sampler_state{Texture=;};float4pixelShaderFunction(float2TextureCoordinate:TEXCOORD0):COLOR0{float4color1=tex2D(textureSampler1,TextureCoordinate);float4color2=tex2D(textureSampler2,TextureCoordinate);如果((color1.r==color2.r.r)&&(color1g==color2.g)&&(color1.b==color2.b)){color1.r=0;color1.g=0;颜色1.b=0;}else{color1.r=255;color1.g=255;color1.b=255;}返回颜色1;}techniqueCompare{passPass1{PixelShader=compileps_2_0pixelShaderFunction();XNA部分的计算非常简单。使用XNA的基本片段和visualstudio,我只是将绘制函数编写为:protectedoverridevoidDraw(GameTimegameTime){Stopwatchsw=newStopwatch();sw.开始();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,newVector2(0,0),Color.White);spriteBatch.End();base.Draw(游戏时间);sw.停止();Console.WriteLine(sw.ElapsedMilliseconds);}im1和im2是两个1920*1080彩色bmp图像作为Texture2D加载,e是作为效果加载的file.fx。使用这种技术,我在一台相当普通的计算机(笔记本电脑I5-2410m@2.3Ghz,4Gbram,NvidiaGeforceGT525m)上获得了17/18ms的计算时间。这是显示差异图像的程序输出(抱歉,这是高度缩放因为我没有1920*1080屏幕:>)以及两张图像im1和im2,它们之间存在一些差异:http://img526.imageshack.us/img526/2345/computationtime.jpgGPU编程是新的,所以如果我在计算时间或其他方面犯了巨大错误,请随时告诉我!编辑:首先要注意的是,我刚刚读到“这将是一个重要的操作,因为GPU不能很好地处理分支。祝福以上就是C#学习教程:快速计算两张相似图片之间的“脏”区域分享所有内容,如果对大家有用还需要详细了解C#学习教程,希望大家多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: