關於python相似圖片分類的信息

本文目錄一覽:

相似圖片檢測:感知哈希算法之dHash的Python實現

某些情況下,我們需要檢測圖片之間的相似性,進行我們需要的處理:刪除同一張圖片、標記盜版等。

如何判斷是同一張圖片呢?最簡單的方法是使用加密哈希(例如MD5, SHA-1)判斷。但是局限性非常大。例如一個txt文檔,其MD5值是根據這個txt的二進制數據計算的,如果是這個txt文檔的完全複製版,那他們的MD5值是完全相同的。但是,一旦改變副本的內容,哪怕只是副本的縮進格式,其MD5也會天差地別。因此加密哈希只能用於判斷兩個完全一致、未經修改的文件,如果是一張經過調色或者縮放的圖片,根本無法判斷其與另一張圖片是否為同一張圖片。

那麼如何判斷一張被PS過的圖片是否與另一張圖片本質上相同呢?比較簡單、易用的解決方案是採用感知哈希算法(Perceptual Hash Algorithm)。

感知哈希算法是一類算法的總稱,包括aHash、pHash、dHash。顧名思義,感知哈希不是以嚴格的方式計算Hash值,而是以更加相對的方式計算哈希值,因為「相似」與否,就是一種相對的判定。

如果我們要計算上圖的dHash值,第一步是把它 縮放到足夠小 。為什麼需要縮放呢?因為原圖的分辨率一般都非常高。一張 200*200 的圖片,就有整整4萬個像素點,每一個像素點都保存着一個RGB值,4萬個RGB,是相當龐大的信息量,非常多的細節需要處理。因此,我們需要把圖片縮放到非常小,隱藏它的細節部分,只見森林,不見樹木。建議縮放為9*8,雖然可以縮放為任意大小,但是這個值是相對合理的。而且寬度為9,有利於我們轉換為hash值,往下面看,你就明白了。

(感謝評論區 隔壁萬能的小黑 同學,建議在 image.resize 中加上Image.ANTIALIAS參數,加上此參數將會對所有可以影響輸出像素的輸入像素進行高質量的重採樣濾波)

dHash全名為差異值hash,通過計算相鄰像素之間的顏色強度差異得出。我們縮放後的圖片,細節已經被隱藏,信息量已經變少。但是還不夠,因為它是彩色的,由RGB值組成。白色表示為(255,255,255),黑色表示為(0,0,0),值越大顏色越亮,越小則越暗。每種顏色都由3個數值組成,也就是紅、綠、藍的值 。如果直接使用RGB值對比顏色強度差異,相當複雜,因此我們轉化為灰度值——只由一個0到255的整數表示灰度。這樣的話就將三維的比較簡化為了一維比較。

差異值是通過計算每行相鄰像素的強度對比得出的。我們的圖片為9*8的分辨率,那麼就有8行,每行9個像素。差異值是每行分別計算的,也就是第二行的第一個像素不會與第一行的任何像素比較。每一行有9個像素,那麼就會產生8個差異值,這也是為何我們選擇9作為寬度,因為8bit剛好可以組成一個byte,方便轉換為16進制值。

如果前一個像素的顏色強度大於第二個像素,那麼差異值就設置為True(也就是1),如果不大於第二個像素,就設置為False(也就是0)。

我們將差異值數組中每一個值看做一個bit,每8個bit組成為一個16進制值,將16進制值連接起來轉換為字符串,就得出了最後的dHash值。

漢明距離這個概念不止運用於圖片對比領域,也被使用於眾多領域,具體的介紹可以參見Wikipedia。

漢明距離表示將A修改成為B,需要多少個步驟。比如字符串「abc」與「ab3」,漢明距離為1,因為只需要修改「c」為「3」即可。

dHash中的漢明距離是通過計算差異值的修改位數。我們的差異值是用0、1表示的,可以看做二進制。二進制0110與1111的漢明距離為2。

我們將兩張圖片的dHash值轉換為二進制difference,並取異或。計算異或結果的「1」的位數,也就是不相同的位數,這就是漢明距離。

如果傳入的參數不是兩張圖的dHash值,而是直接比較兩張圖片,那麼不需要生成dHash值,直接用Step3中的difference數組,統計不相同的位數,就是漢明距離。

一般來說,漢明距離小於5,基本就是同一張圖片。大家可以根據自己的實際情況,判斷漢明距離臨界值為多少。

如何使用python來判斷圖片相似度

from PIL import Imageimport os#import hashlib def getGray(image_file): tmpls=[] for h in range(0, image_file.size[1]):#h for w in range(0, image_file.size[0]):#w tmpls.append( image_file.getpixel((w,h)) ) return tmpls def getAvg(ls):#獲取平均灰度值 return sum(ls)/len(ls) def getMH(a,b):#比較100個字符有幾個字符相同 dist = 0; for i in range(0,len(a)): if a[i]==b[i]: dist=dist+1 return dist def getImgHash(fne): image_file = Image.open(fne) # 打開 image_file=image_file.resize((12, 12))#重置圖片大小我12px X 12px image_file=image_file.convert(“L”)#轉256灰度圖 Grayls=getGray(image_file)#灰度集合 avg=getAvg(Grayls)#灰度平均值 bitls=”#接收穫取0或1 #除去變寬1px遍歷像素 for h in range(1, image_file.size[1]-1):#h for w in range(1, image_file.size[0]-1):#w if image_file.getpixel((w,h))=avg:#像素的值比較平均值 大於記為1 小於記為0 bitls=bitls+’1′ else: bitls=bitls+’0′ return bitls”’ m2 = hashlib.md5() m2.update(bitls) print m2.hexdigest(),bitls return m2.hexdigest()”’ a=getImgHash(“./Test/測試圖片.jpg”)#圖片地址自行替換files = os.listdir(“./Test”)#圖片文件夾地址自行替換for file in files: b=getImgHash(“./Test/”+str(file)) compare=getMH(a,b) print file,u’相似度’,str(compare)+’%’

使用Python 製作對比圖片相似度的程序怎麼比較?

需要使用Python Imaging Library,下代是python2.x的代碼:

from itertools import izip

import Image

 

i1 = Image.open(“image1.jpg”)

i2 = Image.open(“image2.jpg”)

assert i1.mode == i2.mode, “Different kinds of images.”

assert i1.size == i2.size, “Different sizes.”

 

pairs = izip(i1.getdata(), i2.getdata())

if len(i1.getbands()) == 1:

    # for gray-scale jpegs

    dif = sum(abs(p1-p2) for p1,p2 in pairs)

else:

    dif = sum(abs(c1-c2) for p1,p2 in pairs for c1,c2 in zip(p1,p2))

 

ncomponents = i1.size[0] * i1.size[1] * 3

print “Difference (percentage):”, (dif / 255.0 * 100) / ncomponents

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/282712.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-22 08:05
下一篇 2024-12-22 08:05

相關推薦

  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29

發表回復

登錄後才能評論