如何最好地确定图像中的边缘?我最近遇到了裁剪和调整图像大小的问题。我需要裁剪图像的“主要内容”,例如,如果我有这样的图像:alttexthttp://sofzh.miximages.com/c%23/结果应该是没有白色边框的msn内容(左和右)图像。我在X轴上搜索第一个和最后一个颜色变化,在Y轴上搜索相同的东西。问题是逐行浏览图像需要一段时间...对于2000x1600px图像,返回CropRect=>x1,y1,x2,y2数据需要2秒。我尝试为每个坐标做一个循环并在找到的第一个值处停止,但它在所有测试用例中都不起作用。有时返回的数据不是预期的,并且操作的持续时间相似。知道如何减少遍历时间并发现“主要内容”周围的矩形吗?publicstaticCropRectEdgeDetection(BitmapImage,floatThreshold){CropRectcropRectangle=newCropRect();int最低X=0;int最低Y=0;int最大X=0;int最大Y=0;lowestX=Image.Width;最低Y=图片。高度;//找到最低的X边界;for(inty=0;yx)lowestX=x;}if(largestX阈值)){if(lowestY>y)lowestY=y;如果(最大Y图像.Width?Image.Width:largestX-lowestX+8;cropRectangle.Height=largestY+8>Image.Height?Image.Height-lowestY:largestY-lowestY+8;returncropRectangle;}}一种可能的优化是使用Lockbits来直接访问颜色值,而不是通过慢得多的GetPixel。如果您搜索Lockbits,您首先找到的是http://www.bobpowell.net/lockingbits.htm。这是一个好的参考。另一方面,我的测试表明,如果您尝试使GetPixelFast等同于GetPixel并将其作为替代品,与Lockbits相关的开销将使该方法变慢。相反,您需要确保所有像素访问都是通过一次点击而不是多次点击完成的。如果您不锁定/解锁每个像素,这应该适用于您的代码。这是一个示例BitmapDatabmd=b.LockBits(newRectangle(0,0,b.Width,b.Height),System.Drawing.Imaging.ImageLockMode.ReadOnly,b.PixelFormat);byte*row=(byte*)bmd.Scan0+(y*bmd.Stride);//蓝绿红颜色c=Color.FromArgb(row[x*pixelSize+2],row[x*pixelSize+1],row[x*pixelSize]);b.UnlockBits(bmd);还有两点需要注意:这段代码不安全,因为它使用指针这种方法取决于位图数据中的像素大小,所以你需要从位图中派生出pixelSize。PixelFormatGetPixel可能是你的罪魁祸首(我建议运行一些分析teststotrackitdown),但你可以像这样重构算法:从左到右和从右到左扫描第一行(y=0)并记录第一个和最后一个边缘位置。没有必要检查所有像素,因为您需要极端边缘。扫描所有后续行,但现在我们只需要从我们最后已知的最小边缘开始向外搜索(从中心到边缘)。我们要找到极值边界,所以我们只需要在可以找到新极值的区域进行搜索。对列重复前两个步骤以建立初始极值,然后使用这些极值迭代绑定搜索。如果您的图像通常主要是内容,这应该会大大减少比较的次数。最坏的情况是完全空白的图像,对于这种情况,这可能不如穷举搜索有效。在极端情况下,图像处理也可以受益于并行性(拆分图像并在多核CPU上以多个线程处理),但这是额外的工作,您可以进行其他更简单的更改。线程开销往往会限制此技术的适用性,如果您想“实时”运行并专门重复处理传入数据(以弥补初始设置成本),则该技术最有用。这不会使订单变得更好......但是如果你平衡你的阈值,你就不需要做一个非常昂贵的平方根。这应该会显着提高速度。以上就是C#学习教程:Howtobestdeterminingtheedgesintheimage?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: