簡體   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