成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

用JavaScript來計(jì)算兩個(gè)圖像的相似度

Leck1e / 1285人閱讀

摘要:最近看了阮一峰老師的相似圖片搜索的原理二,其中介紹了通過內(nèi)容特征法來對(duì)比兩個(gè)圖片的相似性。不知道是不是哪步出錯(cuò)了,感覺用這個(gè)方法計(jì)算出來的結(jié)果并不理想

最近看了阮一峰老師的相似圖片搜索的原理(二),其中介紹了通過內(nèi)容特征法來對(duì)比兩個(gè)圖片的相似性。

大致步驟:

把圖片都縮放到50x50大小

轉(zhuǎn)成灰度圖片

利用"大津法"(Otsu"s method)確定閾值

通過閾值再對(duì)圖片進(jìn)行二值化

對(duì)比兩個(gè)圖片對(duì)應(yīng)位置像素,得出結(jié)果

接下來,看看用JS怎么實(shí)現(xiàn)上面的步驟,理論部分就不多介紹了,還是看相似圖片搜索的原理(二)

首先,對(duì)圖片數(shù)據(jù)進(jìn)行操作當(dāng)然要使用canvas,所以先創(chuàng)建一個(gè)畫布和它的繪圖上下文

const canvas = document.createElement("canvas")
const context = canvas.getContext("2d")

把圖片縮放渲染到畫布,得到圖片像素?cái)?shù)據(jù):

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"
}

圖片灰度化,灰度就是圖片每個(gè)像素的r、gb設(shè)置相同的值,計(jì)算每個(gè)像素的值的方法有很多,這里使用加權(quán)算法:

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
}

在對(duì)圖片二值化,使之變成黑白圖片之前,要先確定一個(gè)閾值,根據(jù)這個(gè)閾值對(duì)圖片二值化,能使圖片的輪廓最明顯。
文章中提到了通過"大津法"(Otsu"s method)來求得這個(gè)閾值,并給了一個(gè)實(shí)例網(wǎng)站,提供了Java版算法,用JS改寫:

function toOtsu() {
  let ptr = 0
  let histData = Array(256).fill(0) // 記錄0-256每個(gè)灰度值的數(shù)量,初始值為0
  let total = grayData.length

  while (ptr < total) {
    let h = 0xFF & grayData[ptr++]
    histData[h]++
  }

  let sum = 0        // 總數(shù)(灰度值x數(shù)量)
  for (let i = 0; i < 256; i++) {
    sum += i * histData[i]
  }


  let wB = 0         // 背景(小于閾值)的數(shù)量
  let wF = 0         // 前景(大于閾值)的數(shù)量
  let sumB = 0       // 背景圖像(灰度x數(shù)量)總和
  let varMax = 0     // 存儲(chǔ)最大類間方差值
  let threshold = 0  // 閾值

  for (let t = 0; t < 256; t++) {
    wB += histData[t]       // 背景(小于閾值)的數(shù)量累加
    if (wB === 0) continue
    wF = total - wB         // 前景(大于閾值)的數(shù)量累加
    if (wF === 0) break

    sumB += t * histData[t] // 背景(灰度x數(shù)量)累加

    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
}

根據(jù)上面求得的閾值進(jìn)行二值化,小于閾值的灰度值為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)
}

最后計(jì)算兩個(gè)圖像每個(gè)像素的值相同的占總數(shù)的百分比。

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() + "%")
}

不知道是不是哪步出錯(cuò)了,感覺用這個(gè)方法計(jì)算出來的結(jié)果并不理想

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/106306.html

相關(guān)文章

  • Move Mirror:使 TensorFlow.js 在瀏覽器中預(yù)測(cè)姿勢(shì)之 AI 實(shí)驗(yàn)

    摘要:文和,創(chuàng)意實(shí)驗(yàn)室創(chuàng)意技術(shù)專家在機(jī)器學(xué)習(xí)和計(jì)算機(jī)視覺領(lǐng)域,姿勢(shì)預(yù)測(cè)或根據(jù)圖像數(shù)據(jù)探測(cè)人體及其姿勢(shì)的能力,堪稱最令人興奮而又最棘手的一個(gè)話題。使用,用戶可以直接在瀏覽器中運(yùn)行機(jī)器學(xué)習(xí)模型,無需服務(wù)器。 文 / ?Jane Friedhoff 和 Irene Alvarado,Google 創(chuàng)意實(shí)驗(yàn)室創(chuàng)意技術(shù)專家在機(jī)器學(xué)習(xí)和計(jì)算機(jī)視覺領(lǐng)域,姿勢(shì)預(yù)測(cè)或根據(jù)圖像數(shù)據(jù)探測(cè)人體及其姿勢(shì)的能力,堪稱最令人興...

    MiracleWong 評(píng)論0 收藏0
  • 如何從信號(hào)分析角理解卷積神經(jīng)網(wǎng)絡(luò)復(fù)雜機(jī)制?

    摘要:隨著復(fù)雜和高效的神經(jīng)網(wǎng)絡(luò)架構(gòu)的出現(xiàn),卷積神經(jīng)網(wǎng)絡(luò)的性能已經(jīng)優(yōu)于傳統(tǒng)的數(shù)字圖像處理方法,如和。子網(wǎng)絡(luò)由多個(gè)卷積層組成,而子網(wǎng)絡(luò)由幾個(gè)完全連接層組成。結(jié)論總而言之,模型用信號(hào)分析的角度為我們剖析了卷積神經(jīng)網(wǎng)絡(luò)。 隨著復(fù)雜和高效的神經(jīng)網(wǎng)絡(luò)架構(gòu)的出現(xiàn),卷積神經(jīng)網(wǎng)絡(luò)(CNN)的性能已經(jīng)優(yōu)于傳統(tǒng)的數(shù)字圖像處理方法,如 SIFT 和 SURF。在計(jì)算機(jī)視覺領(lǐng)域,學(xué)者們開始將研究重點(diǎn)轉(zhuǎn)移到 CNN,并相信 ...

    Aomine 評(píng)論0 收藏0
  • GAN--提升GAN訓(xùn)練技巧匯總

    摘要:特征匹配改變了生成器的損失函數(shù),以最小化真實(shí)圖像的特征與生成的圖像之間的統(tǒng)計(jì)差異。我們建議讀者檢查上使用的損失函數(shù)和相應(yīng)的性能,并通過實(shí)驗(yàn)驗(yàn)證來設(shè)置。相反,我們可能會(huì)將注意力轉(zhuǎn)向?qū)ふ以谏善餍阅懿患褧r(shí)不具有接近零梯度的損失函數(shù)。 前 ?言GAN模型相比較于其他網(wǎng)絡(luò)一直受困于三個(gè)問題的掣肘:?1. 不收斂;模型訓(xùn)練不穩(wěn)定,收斂的慢,甚至不收斂;?2. mode collapse; 生成器產(chǎn)生的...

    amuqiao 評(píng)論0 收藏0
  • 基于深學(xué)習(xí)商品檢索技術(shù)

    摘要:當(dāng)前,很多學(xué)者和研究機(jī)構(gòu)都嘗試基于深度學(xué)習(xí)進(jìn)行服裝檢索技術(shù)的探究與創(chuàng)新。下文將回顧三篇基于深度學(xué)習(xí)來解決跨域服裝檢索問題的文章??偟膩碚f,以上深度學(xué)習(xí)方法的探索與創(chuàng)新都將為商品檢索技術(shù)趨 摘要商品檢索是一門綜合了物體檢測(cè)、 圖像分類以及特征學(xué)習(xí)的技術(shù)。 近期, 很多研究者成功地將深度學(xué)習(xí)方法應(yīng)用到這個(gè)領(lǐng)域。 本文對(duì)這些方法進(jìn)行了總結(jié), 然后概括地提出了商品特征學(xué)習(xí)框架以及垂類數(shù)據(jù)挖掘方式, ...

    Half 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<