[英]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.