摘要:最近看了阮一峰老師的相似圖片搜索的原理二,其中介紹了通過內容特征法來對比兩個圖片的相似性。不知道是不是哪步出錯了,感覺用這個方法計算出來的結果并不理想
最近看了阮一峰老師的相似圖片搜索的原理(二),其中介紹了通過內容特征法來對比兩個圖片的相似性。
大致步驟:
把圖片都縮放到50x50大小
轉成灰度圖片
利用"大津法"(Otsu"s method)確定閾值
通過閾值再對圖片進行二值化
對比兩個圖片對應位置像素,得出結果
接下來,看看用JS怎么實現上面的步驟,理論部分就不多介紹了,還是看相似圖片搜索的原理(二)
首先,對圖片數據進行操作當然要使用canvas,所以先創建一個畫布和它的繪圖上下文
const canvas = document.createElement("canvas") const context = canvas.getContext("2d")
把圖片縮放渲染到畫布,得到圖片像素數據:
function toZoom() { canvas.width = 50 canvas.height = 50 const img = new Image img.onload = function () { context.drawImage(this, 0, 0, this.width, this.height, 0, 0, 50, 50) const imageData = context.getImageData(0, 0, 50, 50) } img.src = "test.jpg" }
圖片灰度化,灰度就是圖片每個像素的r、g、b設置相同的值,計算每個像素的值的方法有很多,這里使用加權算法:
function toGray() { const grayData = [] const data = imageData.data canvas.width = 50 canvas.height = 50 for (let i = 0; i < data.length; i += 4) { const gray = data[i] * .299 + data[i + 1] * .587 + data[i + 2] * .114 | 0 data[i] = data[i + 1] = data[i + 2] = gray grayData.push(gray) } context.putImageData(imageData, 0, 0) return grayData }
在對圖片二值化,使之變成黑白圖片之前,要先確定一個閾值,根據這個閾值對圖片二值化,能使圖片的輪廓最明顯。
文章中提到了通過"大津法"(Otsu"s method)來求得這個閾值,并給了一個實例網站,提供了Java版算法,用JS改寫:
function toOtsu() { let ptr = 0 let histData = Array(256).fill(0) // 記錄0-256每個灰度值的數量,初始值為0 let total = grayData.length while (ptr < total) { let h = 0xFF & grayData[ptr++] histData[h]++ } let sum = 0 // 總數(灰度值x數量) for (let i = 0; i < 256; i++) { sum += i * histData[i] } let wB = 0 // 背景(小于閾值)的數量 let wF = 0 // 前景(大于閾值)的數量 let sumB = 0 // 背景圖像(灰度x數量)總和 let varMax = 0 // 存儲最大類間方差值 let threshold = 0 // 閾值 for (let t = 0; t < 256; t++) { wB += histData[t] // 背景(小于閾值)的數量累加 if (wB === 0) continue wF = total - wB // 前景(大于閾值)的數量累加 if (wF === 0) break sumB += t * histData[t] // 背景(灰度x數量)累加 let mB = sumB / wB // 背景(小于閾值)的平均灰度 let mF = (sum - sumB) / wF // 前景(大于閾值)的平均灰度 let varBetween = wB * wF * (mB - mF) ** 2 // 類間方差 if (varBetween > varMax) { varMax = varBetween threshold = t } } return threshold }
根據上面求得的閾值進行二值化,小于閾值的灰度值為0,大于閾值的灰度值為255:
function toBinary() { const threshold = toOtsu(grayData, index) const imageData = context.createImageData(50, 50) const data = imageData.data const temp = [] grayData.forEach((v, i) => { let gray = v > threshold ? 255 : 0 data[i * 4] = data[i * 4 + 1] = data[i * 4 + 2] = gray data[i * 4 + 3] = 255 temp.push(gray > 0 ? 0 : 1) }) canvas.width = 50 canvas.height = 50 context.putImageData(imageData, 0, 0) }
最后計算兩個圖像每個像素的值相同的占總數的百分比。
function toCompare() { let sameCount = 0 // img1_data // img2_data const total = img1_data.length for (let i = 0; i < total; i++) { sameCount += img1_data[i] === img2_data[i] } console.log((sameCount / total * 100).toLocaleString() + "%") }
不知道是不是哪步出錯了,感覺用這個方法計算出來的結果并不理想
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/106306.html
摘要:文和,創意實驗室創意技術專家在機器學習和計算機視覺領域,姿勢預測或根據圖像數據探測人體及其姿勢的能力,堪稱最令人興奮而又最棘手的一個話題。使用,用戶可以直接在瀏覽器中運行機器學習模型,無需服務器。 文 / ?Jane Friedhoff 和 Irene Alvarado,Google 創意實驗室創意技術專家在機器學習和計算機視覺領域,姿勢預測或根據圖像數據探測人體及其姿勢的能力,堪稱最令人興...
摘要:隨著復雜和高效的神經網絡架構的出現,卷積神經網絡的性能已經優于傳統的數字圖像處理方法,如和。子網絡由多個卷積層組成,而子網絡由幾個完全連接層組成。結論總而言之,模型用信號分析的角度為我們剖析了卷積神經網絡。 隨著復雜和高效的神經網絡架構的出現,卷積神經網絡(CNN)的性能已經優于傳統的數字圖像處理方法,如 SIFT 和 SURF。在計算機視覺領域,學者們開始將研究重點轉移到 CNN,并相信 ...
摘要:特征匹配改變了生成器的損失函數,以最小化真實圖像的特征與生成的圖像之間的統計差異。我們建議讀者檢查上使用的損失函數和相應的性能,并通過實驗驗證來設置。相反,我們可能會將注意力轉向尋找在生成器性能不佳時不具有接近零梯度的損失函數。 前 ?言GAN模型相比較于其他網絡一直受困于三個問題的掣肘:?1. 不收斂;模型訓練不穩定,收斂的慢,甚至不收斂;?2. mode collapse; 生成器產生的...
摘要:當前,很多學者和研究機構都嘗試基于深度學習進行服裝檢索技術的探究與創新。下文將回顧三篇基于深度學習來解決跨域服裝檢索問題的文章。總的來說,以上深度學習方法的探索與創新都將為商品檢索技術趨 摘要商品檢索是一門綜合了物體檢測、 圖像分類以及特征學習的技術。 近期, 很多研究者成功地將深度學習方法應用到這個領域。 本文對這些方法進行了總結, 然后概括地提出了商品特征學習框架以及垂類數據挖掘方式, ...
閱讀 1542·2023-04-26 02:08
閱讀 3134·2021-10-14 09:42
閱讀 7217·2021-09-22 15:34
閱讀 3243·2019-08-30 13:16
閱讀 2737·2019-08-26 13:49
閱讀 1352·2019-08-26 11:59
閱讀 1281·2019-08-26 10:31
閱讀 2174·2019-08-23 17:19