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

如何找出两张图片之间的矩形差异Sharing

时间:2023-04-10 18:13:05 C#

如何找出两张图片之间的差异矩形我有两张相同大小的图片。找到不同矩形的最佳方法是什么。显然,我可以在不同方向浏览图像4次,但我想知道是否有更简单的方法。示例:第一张图片http://sofzh.miximages.com/c%23/2cg0u2h.png第二张图片http://sofzh.miximages.com/c%23/14l0y13.png区别http://sofzh.miximages.com/c%23/5agshd.png我认为没有更简单的方法。实际执行此操作只需(非常)几行代码,因此除非您找到一个直接为您执行此操作的库,否则您不会找到更短的方法。一种天真的方法是从原点开始,逐行工作。比较每个像素,注意最顶部、最左侧、最右侧和最底部的像素,从中可以计算出矩形。在某些情况下,这种单遍方法会更快(即差异区域非常小)像这样的图像处理很昂贵,有很多值得关注的地方。在实际应用中,您几乎总是需要对图像进行过滤,以去除因图像捕获不完善而导致的伪影。用于此类位攻击的公共库是OpenCV,它利用可用的专用CPU指令来执行此操作。有几个可用的.NET包装器,Emgu是其中之一。我认为没有什么比在各个方面依次穷尽这个方向的第一个差异点更好的了。除非,也就是说,您知道以某种方式限制差异点集的事实。如果您知道如何使用Lockbit,这里有一个简单的方法:)BitmaporiginalBMP=newBitmap(pictureBox1.ImageLocation);位图changedBMP=newBitmap(pictureBox2.ImageLocation);intwidth=Math.Min(originalBMP.Width,changedBMP.Width),height=Math.Min(originalBMP.Height,changedBMP.Height),xMin=int.MaxValue,xMax=int.MinValue,yMin=int.MaxValue,yMax=int.MinValue;varoriginalLock=originalBMP.LockBits(newRectangle(0,0,width,height),ImageLockMode.ReadWrite,originalBMP.PixelFormat);varchangedLock=changedBMP.LockBits(newRectangle(0,0,width,height),ImageLockMode.ReadWrite,changedBMP.PixelFormat);for(inty=0;y丢弃它看起来你的2个图像包含的差异比我们用肉眼看到的要多,所以结果会比你想象的要宽,但你可以添加一个公差,所以即使其余的不是'速度100%相同,你可能会说并行。对我们来说,但仅适用于外循环的想法:将图像视为2Darrays,每个数组元素作为图像的一个像素。所以,我认为图像差异只不过是2Darrays差异。这个想法是在宽度方向扫描数组元素,找到像素值不同的地方。如果两个二维数组的示例[x,y]坐标不同,那么我们的矩形查找逻辑就开始了。稍后,将使用矩形修补最后更新的帧缓冲区。我们需要扫描矩形的边界以查找差异,如果在矩形的边界中发现任何差异,则边界将增加宽度或高度,具体取决于完成的扫描类型。考虑我扫描2D数组的宽度方向,我找到一个坐标的位置,在两个2Darrays中不同,我将创建一个矩形,起始位置为[x-1,y-1],宽度和高度为2和2,分别。请注意,宽度和高度以像素为单位。例如:矩形信息:X=20Y=35W=26H=23即矩形的宽度从坐标[20,35]->[20,35+26-1]开始。也许当您找到代码时,您可以更好地理解它。也有可能在您找到的较大矩形内有较小的矩形,因此我们需要从参考中删除较小的矩形,因为它们对我们没有任何意义,只是它们占用了我宝贵的空间!上述逻辑在VNC服务器实现的情况下会有所帮助,其中需要矩形来表示当前拍摄图像的差异。这些矩形可以通过网络发送到VNC客户端,VNC客户端可以修补它拥有的帧缓冲区的本地副本中的矩形,以在VNC客户端显示板上显示它们。PS:我会附上我实现自己算法的代码。我会要求观众对任何错误或性能调整发表评论。我还请观众评论任何让生活更轻松的更好算法。代码:类Rect:publicclassRect{publicintx;//数组索引publicinty;//数组索引publicintw;//沿Horizo??ntal的跳数publicinth;//沿垂直方向的跳数@Overridepublicbooleanequals(Objectobj){Rectrect=(Rect)obj;如果(rect.x==this.x&&rect.y==this.y&&rect.w==this.w&&rect.h==this.h){returntrue;}返回假;}}class图像差异:importjava.awt.image.BufferedImage;导入java.io.文件;导入java.io.IOException;导入java.util.LinkedList;导入javax.imageio.ImageIO;公共类ImageDifference{长开始=0,结束=0;publicLinkedListdifferenceImage(int[][]baseFrame,int[][]screenShot,intxOffset,intyOffset,intwidth,intheight){//代码从这里开始intxRover=0;intyRover=0;整数索引=0;整数限制=0;国际漫游者=0;布尔值isRectChanged=false;布尔值shouldSkip=false;LinkedList矩形=newLinkedList();矩形矩形=空;开始=System.nanoTime();//xRover-在二维数组的高度上漫游//yRover-在二维数组的宽度上漫游intverticalLimit=xOffset+height;inthorizo??ntalLimit=yOffset+宽度;for(xRover=xOffset;xRover=itrRect.x))&&((yRover=itrRect.y))){shouldSkip=true;yRover=itrRect.y+itrRect.w-1;休息;}//Endif(((xRover=itrRect.x))&&((yRover=itrRect.y)))}//Endfor(RectitrRect:rectangles)if(shouldSkip){shouldSkip=false;//需要从下面的if条件中出来,这就是为什么提供“continue”的原因//if(((xRover=itrRect.x))&&((yRover=itrRect.y)))continue;}//结束if(shouldSkip)rect=newRect();rect.x=((xRover-1)=rx+rh))&&((rect.y=ry+rw))){rectangles.remove(r);}else{idx+=1;}//Endif(((rect.x=rx+rh))&&((rect.y=ry+rw)))}//Endwhile(idxrectangles=null;//缓冲基本图像和屏幕截图图像BufferedImagescreenShotImg=ImageIO.read(newFile("screenShotImg.png"));BufferedImagebaseImg=ImageIO.read(newFile("baseImg.png"));intwidth=baseImg.getWidth();intheight=baseImg.getHeight();intxOffset=0;intyOffset=0;intlength=baseImg.getWidth()*baseImg.getHeight();//为图像处理创建2个二维数组int[][]baseFrame=newint[height][width];int[][]screenShot=newint[高度][宽度];//创建2个一维数组来检索像素值int[]baseImgPix=newint[length];int[]screenShotImgPix=newint[length];//从缓冲图像中读取像素baseImg.getRGB(0,0,baseImg.getWidth(),baseImg.getHeight(),baseImgPix,0,baseImg.getWidth());screenShotImg.getRGB(0,0,screenShotImg.getWidth(),screenShotImg.getHeight(),screenShotImgPix,0,screenShotImg.getWidth());//将一维数组传输到二维数组longstart=System.nanoTime();for(introw=0;row说明:会有一个函数叫publicLinkedListdifferenceImage(int[][]baseFrame,int[][]screenShot,intwidth,intheight)它可以找到图像和返回对象的链表对象只是矩形。有一个主要功能来完成算法测试的工作。在主要功能中有2个示例图像传递到代码中,它们只是“baseFrame”和“screenShot”,从而创建一个名为“result”的文件。我没有发布非常有趣的结果图像所需的声誉。有一个博客提供输出图像差异。以上是C#学习教程:如何找到差异之间的内容两张图都是关于,大家有用,需要了解更多C#学习教程,希望大家多多关注---本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如有转载请注明出处: