差值平方和匹配_純前端實現圖片的模板匹配

基礎介紹

模板匹配是指在當前圖像A里尋找與圖像B最相似的部分,本文中將圖像A稱為模板圖像,將圖像B稱為搜索匹配圖像。

引言:一般在Opencv里實現此種功能非常方便:直接調用

result = cv2.matchTemplate(templ, search, method)
  • templ 為原始圖像
  • search 為搜索匹配圖像,它的尺寸必須小于或等于原始圖像
  • method 表示匹配方式

method一般取值:

type CompareWay =| "CV_TM_SQDIFF"| "CV_TM_SQDIFF_NORMED"| "CV_TM_CCORR"| "CV_TM_CCORR_NORMED"| "CV_TM_CCOEFF"| "CV_TM_CCOEFF_NORMED";

當然這里我們不是主要講Opencv的api的,只是單獨提出來,說明在前端實現對應的算法,就能進行模板匹配。

比如以CV_TM_SQDIFF算法為例:

  1. 遍歷的起始坐標從原圖A的左數第1個像素值開始
  2. 以搜索匹配B圖的大小(w * h)匹配比較原圖上對應空間上(w * h)的像素值
  3. 依次進行A圖右移一像素去匹配B圖,直到A圖右側(w)小于B圖的w,然后換行再匹配
  4. 重復進行到A圖距離底部不支持h大于B圖的高度
  5. 最后找出最小誤差值

我們的目標是實現這兩張圖的匹配:

5716d2c36017e333967ab618594681c5.png

b1c22a03f169d6ea2189519c863bddc5.png

這里實現對應的js算法

/*** 差值平方和匹配 CV_TM_SQDIFF* @param template 匹配的圖片灰度值[x,x,x,...] w * h 長度的灰度圖片數據* @param search 搜索的圖片灰度值[x,x,x,...] w * h 長度的灰度圖片數據* @param tWidth 匹配圖片的width* @param tHeight 匹配圖片的height* @param sWidth 搜索圖片的width* @param sHeight 搜索圖片的height*/
const cvTmSqDiff = (template, search, tWidth, tHeight, sWidth, sHeight) => {let minValue = Infinity;let x = -1;let y = -1;for (let th = 0; th < tHeight; th += 1) {for (let tW = 0; tW < tWidth; tW += 1) {if (tW + sWidth > tWidth || th + sHeight > tHeight) {continue;}let sum = 0;for (let sH = 0; sH < sHeight; sH += 1) {for (let sW = 0; sW < sWidth; sW += 1) {const tValue = template[(th + sH) * tWidth + tW + sW];const sValue = search[sH * sWidth + sW];sum += (tValue - sValue) * (tValue - sValue);}}if (minValue > sum) {minValue = sum;x = tW;y = th;}if (sum === 0) {return { x, y };}}}return { x, y };
};

因此根據上述算法的可行性,我們可以先將A圖和B圖進行RGB值轉Gary值: 借鑒OpenCV中的轉換方式

Gray = 0.299*r + 0.587*g + 0.114*b

再將轉換好A圖和B圖的灰度值進行匹配比較:

const {x, y} = cvTmSqDiff(template, search, tWidth, tHeight, sWidth, sHeight);

得到的xy則是在原圖A上的對應匹配成功的坐標,加上對應B圖的大小,我們則可以在原圖的基礎上畫出一個矩形框表示匹配的區域:

c1ceff22be1da67d56d425439fc01b5b.png

前端分步實現

上面大概講了匹配的大致實現思路,下面開始正式的js代碼實現:

  • 1、加載原圖A和原圖B
Promise.all([imgLoader("./lena.png"), imgLoader("./search.png")]).then((values: any) => {...}
);
  • 2、得到圖片數據的rgb值,并轉化為灰度值
Promise.all([getImageData(values[0]), getImageData(values[1])]).then((dataValues: any) => {const model = rgbToGary(dataValues[0]);const search = rgbToGary(dataValues[1]);...}
);
  • 3、獲取對應的匹配坐標
const posi = getTemplatePos(model,search,dataValues[0].width,dataValues[0].height,dataValues[1].width,dataValues[1].height,"CV_TM_CCOEFF_NORMED"
);
  • 4、繪制原圖和匹配到矩形框
const canvas = document.createElement("canvas");
canvas.width = dataValues[0].width;
canvas.height = dataValues[0].height;
const ctx = canvas.getContext("2d");ctx.drawImage(values[0], 0, 0);
ctx.strokeStyle = "red";
ctx.strokeRect(posi.x,posi.y,dataValues[1].width,dataValues[1].height
);
document.body.appendChild(canvas);

上述所用的的函數imgLoader getImageData rgbToGary getTemplatePos 都可以在這里找到xy-imageloader

也可以npm安裝:npm i xy-imageloader

完整代碼

import imgLoader, { getImageData, rgbToGary } from "xy-imageloader";
import { getTemplatePos } from "xy-imageloader/lib/utils";
Promise.all([imgLoader("./lena.png"), imgLoader("./search.png")]).then((values: any) => {Promise.all([getImageData(values[0]), getImageData(values[1])]).then((dataValues: any) => {const model = rgbToGary(dataValues[0]);const search = rgbToGary(dataValues[1]);const posi = getTemplatePos(model,search,dataValues[0].width,dataValues[0].height,dataValues[1].width,dataValues[1].height,"CV_TM_CCOEFF_NORMED");const canvas = document.createElement("canvas");canvas.width = dataValues[0].width;canvas.height = dataValues[0].height;const ctx = canvas.getContext("2d");ctx.drawImage(values[0], 0, 0);ctx.strokeStyle = "red";ctx.strokeRect(posi.x,posi.y,dataValues[1].width,dataValues[1].height);document.body.appendChild(canvas);});}
);

附算法思想:

* CV_TM_SQDIFF

9d67763fb7da6a597289f66b10159c5a.png
  • CV_TM_SQDIFF_NORMED

738b33955fe4d6d8400ec3bfb47df945.png
  • CV_TM_CCORR

e0ede50c0f63c44290abf3af1fae329d.png
  • CV_TM_CCORR_NORMED

4fe0c681e7b27eb6b724e9f4bfe898f6.png
  • CV_TM_CCOEFF

0769b98b9696663f84eab7ae7e6f28db.png
  • CV_TM_CCOEFF_NORMED

5bfc05de6fb7837beb49dcb8ad1fad8c.png
算法具體實現可參考 xy-imageloader

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388981.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388981.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388981.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

藍牙耳機音量大解決辦法_長時間使用藍牙耳機的危害這么大?我們到底該選什么藍牙耳機呢?...

藍牙耳機避免了耳機線纏結&#xff0c;使人活動更自由&#xff0c;給人們帶來了更加方便、舒適的聽覺體驗。但近日&#xff0c;英國《每日郵報》刊文表示&#xff0c;藍牙耳機可能會危害人體健康。美國加州大學伯克利分校公共健康教授喬爾莫斯科維茨博士表示&#xff0c;已有研…

JVM基礎系列第10講:垃圾回收的幾種類型

我們經常會聽到許多垃圾回收的術語&#xff0c;例如&#xff1a;Minor GC、Major GC、Young GC、Old GC、Full GC、Stop-The-World 等。但這些 GC 術語到底指的是什么&#xff0c;它們之間的區別到底是什么&#xff1f;今天我們就來詳細說說。 Minor GC 從年輕代空間回收內存被…

模擬退火學習

模擬退火學習 作業部落網上講的不錯的(他好像還有一些其他的東西、、、) 引入 對于一些題目&#xff0c;無法直接算出答案或者想不到正解&#xff0c;想到隨機找答案&#xff0c;那么模擬退火就是一種有系統方法的隨機算法 沒用的不需要了解的來源 百度百科...... 模擬退火算法…

spotify 數據分析_我的Spotify流歷史分析

spotify 數據分析Spotisis /spo-ti-sis/ noun The analysis of one’s Spotify streaming history using Python.Spotisis / spo-ti-sis / 名詞使用Python分析一個人的Spotify流歷史。 I was reading through a lot of data science related guides and project ideas when I …

idea 搜索不到gsonformat_Idea中GsonFormat插件安裝

這個教不的期是范添事大部會基近說小間進圍磚本的程主要是學習IntelliJ IDEA 如何通過GsonFormat插件將JSONObject格式的String 支器事的后功發久這含層請間業在屏有隨些氣和域&#xff0c;實按控幻近持的前時來能過后些的處求也務瀏蔽等機站風滾或默現鈕制燈近持的前時來能過后…

intellig idea中jsp或html數據沒有自動保存和更換字體

主題一:保存數據jsp intellig idea是自動保存數據的,看到沒有保存 解決方案&#xff1a; 成功解決 主題二:更換字體: 或者快捷鍵CtelAlts 成功解決 轉載于:https://www.cnblogs.com/weibanggang/p/9398498.html

java 環境變量

1.確保安裝jrd jdk 2.環境變量配置 (1)新建->變量名"JAVA_HOME"&#xff0c;變量值"C:\Java\jdk1.8.0_05"&#xff08;JDK的安裝路徑&#xff09; (2)編輯->變量名"Path"&#xff0c;在原變量值的最后面加上“;%JAVA_HOME%\bin;%JAVA_HOME…

陸濤喜歡夏琳嗎_夏琳·香布利斯(Charlene Chambliss):從心理學到自然語言處理和應用研究

陸濤喜歡夏琳嗎技術系列中的女性 (WOMEN IN TECHNOLOGY SERIES) Interest in data science has been exponentially increasing over the past decade, and more and more people are working towards making a career switch into the field. In 2020, articles and YouTube v…

【angularJS】簡介

簡介 AngularJS 是一個 JavaScript 框架。它可通過 <script> 標簽添加到 HTML 頁面。 AngularJS 通過 指令 擴展了 HTML&#xff0c;且通過 表達式 綁定數據到 HTML。 AngularJS 是一個 JavaScript 框架。它是一個以 JavaScript 編寫的庫。 AngularJS 是以一個 JavaScrip…

爬取淘寶商品信息selenium+pyquery+mongodb

爬取淘寶商品信息,通過selenium獲得渲染后的源碼,pyquery解析,mongodb存儲 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import Timeout…

紋個雞兒天才小熊貓_給熊貓用戶的5個提示

紋個雞兒天才小熊貓A popular Python library used by those working with data is pandas, an easy and flexible data manipulation and analysis library. There are a myriad of awesome methods and functions in pandas, some of which are probably less well-known tha…

本人服務器遭受黑客長期攻擊,特把這幾天做的一些有用的安全方面總結出來,以方便以后查閱

消息隊列iis360northrarsql2000 netscren本人服務器遭受黑客長期攻擊&#xff0c;特把這幾天做的一些有用的安全方面總結出來&#xff0c;以方便以后查閱&#xff0c;希望這次徹底解覺黑客的攻擊&#xff0c;特次謝謝“冷雨夜”的一些提示。 windows 2003服務器安全設置方法 0…

用戶與用戶組管理

linux最優秀的地方之一&#xff0c;就在于他的多用用戶、多任務環境。 用戶及用戶組的概念 1、文件所有者 由于linux是一個多用戶、多任務的系統。因此可能常常會有很多人同時使用這臺主機來進行工作的情況發生&#xff0c;為了考慮每個人的隱私權以及每個人的喜好的工作環境&a…

代碼 摳圖_3 行 Python 代碼 5 秒摳圖的 AI 神器,根本無需 PS,附教程

曾幾何時&#xff0c;「摳圖」是一個難度系數想當高的活兒&#xff0c;但今天要介紹的這款神工具&#xff0c;只要 3 行代碼 5 秒鐘就可以完成高精度摳圖&#xff0c;甚至都不用會代碼&#xff0c;點兩下鼠標就完成了。感受下這款摳圖工具摳地有多精細&#xff1a;是不是很贊&a…

python函數使用易錯舉例

關于嵌套&#xff1a; 嵌套使用中&#xff0c; retrun inner ---> 返回的是函數的地址 retrun inner() &#xff1a; ---> 運行inner()函數 ---> 運行inner()函數后的返回值a&#xff08;假設&#xff09;返回上級 --> retrun inner()得到返回值a 如…

圖像離群值_什么是離群值?

圖像離群值你是&#xff01; (You are!) Actually not. This is not a text about you.其實并不是。 這不是關于您的文字。 But, as Gladwell puts it in Outliers, if you find yourself being that type of outlier, you’re quite lucky. And rare.但是&#xff0c;正如Gla…

混合模型和EM---混合高斯

2019獨角獸企業重金招聘Python工程師標準>>> 混合高斯 最大似然 用于高斯混合模型的EM 轉載于:https://my.oschina.net/liyangke/blog/2986520

永恒python地速_立竿見影地把你的 Python 代碼提速7倍

之前曾經測試計算斐波那契數列的幾種方法&#xff0c;其中基于遞歸的方法是速度最慢的&#xff0c;例如計算第 40 項的值&#xff0c;需要 36 秒。如下圖所示。要提高運算速度&#xff0c;根本辦法當然是改進算法。不過算法的提高是一個長期積累加上靈機一動的過程。我們今天要…

頂尖大學實驗室的科研方法_這是來自頂尖大學的5門免費自然語言處理課程

頂尖大學實驗室的科研方法Data Science continues to be a hot topic, but more specifically, Natural Language Processing (NLP) is increasing in demand.數據科學仍然是一個熱門話題&#xff0c;但更具體地說&#xff0c;自然語言處理(NLP)的需求正在增長。 Broadly spea…

Python學習---django知識補充之CBV

Django知識補充之CBV Django: url --> def函數 FBV[function based view] 用函數和URL進行匹配 url --> 類 CBV[function based view] 用類和URL進行匹配 POSTMAN插件 http://blog.csdn.net/zzy1078689276/article/details/77528249 基于CBV的登…