繁体   English   中英

在大图像中查找16x16像素相同正方形的有效算法-C#

[英]Effective algorithm for finding 16x16 pixel same squares in a big image - C#

我正在使用C#在Visual Studio 2010上编码软件。 该软件的作用是在选择一个正方形后在图像上找到相同的正方形。 每个正方形由16x16像素组成。 我目前的算法是从第一个像素开始,然后逐个像素扫描整个图像,以确定与所选像素相同的像素平方。 这需要很多时间。 你能建议我更好的办法吗?

每个广场也是有序的。 所以他们开始像0-16-32-48

一个正方形不能以5或65等开头

谢谢

您可以缓存每个图像区域的校验和。 然后,您只需要检查与校验和匹配的项是否相等即可。

假设每个图像都是16x16 rgb元素。 您可以这样做(是的,它将有整数溢出。)

所有这些都是伪代码-您应该可以将其转换为C#。

将int添加到字段图像类中,或创建一个以int作为“校验和”的图像包装器

int checksum = 0
for each pixel in image {
   checksum += pixel.red + pixel.blue + pixel.green
   // you could do anything you wanted here, like
   // checksum *= 17 + pixel.red
   // checksum *= 17 + pixel.blue
   // checksum *= 17 + pixel.green
   // just make it "unique enough", like a hashcode
}
image.checksum = checksum

现在,当您进行搜索时,您可以像这样:

/**
 * equals method before: 
 */
boolean equals(image a, image b) {
  for x = 0..15 do /* all 16 pixels in X */
    for y = 0..15 do /* all 16 pixels in Y */
      if a.getPixel(x,y) != b.getPixel(x,y) return false;
  return true;
}

/**
 * equals method after: 
 *.
boolean equals(image a, image b) {
  /* this check lets you skip the loop in most cases */
  /* still have to verify that the image is equal pixel for pixel though */
  if a.checksum != b.checksum return false;
  for x = 0..15 do /* all 16 pixels in X */
    for y = 0..15 do /* all 16 pixels in Y */
      if a.getPixel(x,y) != b.getPixel(x,y) return false;
  return true;
}

我知道用来比较两个图像有多相似的一种算法是均方根算法。 我已经在多个程序中使用了它,并且一直非常快。 这简单地总结了差异,进行了一些数学运算,差异将是两个图像彼此之间的“距离”。

但是,如果访问速度较慢,无法比较每个像素,则访问速度仍然会很慢(尽管速度稍快),将它们全部加起来(或校验和)。

另一种选择是增加短路。 第二个像素根本不匹配,您可以声称整个图片不匹配。

我会很好奇为什么速度会变慢。 图像必须非常大才能不计数。 您正在使用Bitmap.GetPixel()吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM