2017-10-06 89 views
0

我有2個bmp圖像。 ImageA是一個截圖(示例)ImageB是其中的一個子集。比方說,一個圖標。如何在另一個內部找到一個圖像? Node.js

我想在ImageA中找到ImageB的X,Y座標(如果存在的話)。

任何想法我會怎麼做?

+0

檢查此 https://stackoverflow.com/questions/8416414/opencv-finding-image-cordinates-on-another-image –

+1

你做了什麼努力試圖自己解決這個問題嗎? – Andy

回答

2

這被稱爲光學識別。它看起來可能很複雜(它是),但實現起來可能很簡單,所以不要回避它!

Image A成爲我們正在尋找的圖像,Image B是其中的Image A的較大圖像。

方法1

如果Image A的在Image B規模沒有改變,而且顏色都保留下來,你可以把Image B上的HTML 5的畫布和遍歷像素數據。您可以從Image A加載第一行像素,然後遍歷Image B中的每個像素。如果像素相同,則應將該像素列存儲在變量中,並檢查下一個是否匹配。如果第一行是完全匹配的,則跳到下一行並比較這些行。你會重複這一點,直到你得到一個匹配或者打到一個(或者足夠的)不匹配的像素。在這種情況下,你會重置所有變量,並重新開始尋找匹配一行1

方法2

如果Image AImage 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應該很好,如果圖像被拉伸但保持矩形比例。如果圖像已被翹曲成圓形,事情變得無限複雜。對於這種情況,我可以給出的唯一提示是檢查原始半徑內匹配的像素。

+0

如果你想要一些JS庫這樣做,我也可以爲你取幾個,但是輸入光學識別應該可以獲得足夠多的信息!祝你好運。 – Lite20

+0

我在npm尋找圖書館,但我發現的只有一個是OpenCV,並沒有太多關於這個主題的教程:( – greyb3ast

+0

我正在研究一個帶光學識別的項目,一旦我把它放入圖書館,但是目前,這是一項相當不重要的任務,大多數人必須隨時發明輪子。 – Lite20

相關問題