[英]How to find one image inside of another? Node.js
我有2張bmp圖片。 ImageA是屏幕截圖(示例),ImageB是其子集。 例如說一個圖標。
我想在ImageA中找到ImageB的X,Y坐標(如果存在)。
知道我會怎么做嗎?
這稱為光學識別。 它可能看起來很復雜,但是實現起來可能非常簡單,所以請不要回避!
假設Image A
是我們要尋找的圖像, Image B
是其中包含Image A
的較大圖像。
如果Image A
的規模Image B
沒有被改變,而且顏色都保留下來,您可以將Image B
上的HTML 5的畫布和遍歷像素數據。 您將從Image A
加載第一行像素,然后遍歷Image B
每個像素。 如果像素相同,則可以將該像素列存儲在變量中,然后檢查下一個是否也匹配。 如果第一行完全匹配,則跳至下一行並進行比較。 您將重復此操作,直到找到匹配項或達到不匹配的(或足夠)像素為止。 在這種情況下,您將重置所有變量,然后重新開始查找與第1行匹配的內容。
如果Image A
與Image B
不完全相同,則會出現新的復雜情況,並且事情會變得更加復雜。 如果只改變比例,我們可以對方法1進行一些調整,以得到可行的方法。 除了獲取任何像素並查看是否80%左右匹配之外,我們還需要跟蹤圖像的絕對/壓縮 。
在每一行中,逐步遍歷像素。 例如,我們將每十分之一像素檢查一次。 如果找到像素1的匹配項,則檢查距離像素10個像素,然后查看該像素是否存在於行中的任何位置 。 如果找到它,則從0到該像素的距離除以10(我們的增量)就是原始圖像的幾倍。
如果我們發現Image A
的像素從0開始有20個時隙,而Image B
像素僅相隔10個像素(請記住,我們的增量為10),那么我們的原始圖像要大2倍。 換句話說,新圖像是原始圖像大小的一半。
1) compression = target_width / original_width
2) compression = 20 / 10
3) compression = 2
這是一種檢測匹配的更為復雜但可靠的方法。 足夠的匹配行意味着您擁有匹配的圖像,但是垂直拉伸呢?
相似的邏輯。 如果找到匹配的行,則從0開始並向下移動10,然后在Image A
找到該像素的匹配項。
我提供的方法是用於在任何其他圖像中查找任何圖像的通用方法。 您可以想象這是性能密集型的。 我不知道您要檢測什么圖像,但是如果有常見的形狀,有時您可以使用其他算法。 例如,如果您有一個圓形,則只需檢查是否有半徑外的 像素匹配且半徑內的像素相同。
我介紹的方法也不能彌補翹曲 。 如果圖像被拉伸但保持矩形比例,則方法2應該很好。 例如,如果圖像變形為圓形,則情況將變得更加復雜。 對於這種情況,我唯一能給出的提示是檢查原始半徑內的像素是否匹配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.