<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          還在用肉眼找不同嗎?這個(gè)技術(shù)輕松搞定

          共 5076字,需瀏覽 11分鐘

           ·

          2021-06-13 14:12

          點(diǎn)擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

          重磅干貨,第一時(shí)間送達(dá)

          本文轉(zhuǎn)自:AI算法與圖像處理
          概述


          我想應(yīng)該很多人都玩過騰訊的這款游戲《大家來找茬》,想當(dāng)年不知道多少人用鼠標(biāo)對(duì)著美女圖一頓輸出,就是找不到哪里不一樣。

          今天我們要用到圖像技術(shù)可以應(yīng)用到這個(gè)上面。



          今天,我們將使用擴(kuò)展ssim(結(jié)構(gòu)相似性索引)方法,以便使用OpenCV和python可視化圖像之間的差異。具體來說,我們將在兩個(gè)輸入圖片的不同處繪制邊界框。

          為了計(jì)算兩張圖片的不同,我們將使用結(jié)構(gòu)相似性索引(由wang等人首次提出)。在他們的2004年論文中,圖像質(zhì)量評(píng)估:從可視化誤差到結(jié)構(gòu)相似性。該方法已經(jīng)在scikit-image庫中應(yīng)用于圖像處理。

          https://ece.uwaterloo.ca/~z70wang/publications/ssim.pdf

          要去學(xué)習(xí)的技巧是我們?nèi)绾稳?zhǔn)確確定圖片不同點(diǎn)的坐標(biāo)位置(x,y)。



          要實(shí)現(xiàn)這一點(diǎn),首先我們要確定系統(tǒng)已經(jīng)安裝好python、OpenCV、scikit-image和imutils。


          你可以使用下面的OpenCV安裝教程學(xué)習(xí)如何在系統(tǒng)上配置和安裝python和OpenCV。

          https://www.pyimagesearch.com/opencv-tutorials-resources-guides/

          如果你還沒安裝或更新scikit-image包,你可以使用下面的操作:

          pip3 install --upgrade scikit-image

          同樣的,如果你還為安裝或更新imutils,你可以使用下面的操作:

          pip3 install --upgrade imutils

          現(xiàn)在我們的系統(tǒng)已經(jīng)準(zhǔn)備好了,可以繼續(xù)往下操作了。


          計(jì)算圖片的差異



          思考:你能分辨出下面這兩幅圖片的區(qū)別嗎?


          如果你利用一點(diǎn)時(shí)間研究這兩種信用卡,你會(huì)發(fā)現(xiàn)左邊的圖片上是有一個(gè)logo的,但是右邊的圖片已經(jīng)用ps消除了。

          你可能會(huì)馬上注意到這個(gè)差異,或者說花費(fèi)一點(diǎn)時(shí)間。不管怎樣,這都說明了比較圖片的差異是一個(gè)重要的方面——有時(shí)圖片的差異是微小的——這將導(dǎo)致肉眼難以立刻發(fā)現(xiàn)這些差異(文章的后面會(huì)有一個(gè)這樣子的例子)。


          為什么計(jì)算圖片的差異如此重要?


          一個(gè)例子是網(wǎng)絡(luò)釣魚。

          攻擊者可以輕而易舉地操縱圖片,以欺騙那些不驗(yàn)證url的用戶,讓他們認(rèn)為自己正在登錄銀行網(wǎng)絡(luò),但后面卻發(fā)現(xiàn)這是一個(gè)騙局。
          在網(wǎng)站上存在一個(gè)數(shù)據(jù)庫對(duì)比logo和已知用戶界面(UI)元素幫助減少釣魚網(wǎng)站的攻擊。(這要?dú)w功于Chris Cleveland的論文——通過監(jiān)視來檢測(cè)釣魚網(wǎng)站,作為一個(gè)例子應(yīng)用于計(jì)算機(jī)視覺來阻止釣魚網(wǎng)站)
          http://www1.icsi.berkeley.edu/~sadia/papers/phishzoo-icsc_final.pdf
          開發(fā)一個(gè)網(wǎng)絡(luò)釣魚檢測(cè)系統(tǒng)顯然比簡(jiǎn)單的圖片差異對(duì)比要復(fù)雜得多,但是我們?nèi)匀豢梢詰?yīng)用這些技術(shù)來確定一個(gè)給定的圖片是否被處理過。
          現(xiàn)在,讓我們計(jì)算兩張圖片的差異,并使用OpenCV、scikit-Image和python可視化這些差異。


          打開一個(gè)新文件并命名為image_diff.py,并插入下面的代碼:
          # 導(dǎo)入必要的包from skimage.measure import compare_ssimimport argparseimport imutilsimport cv2
          # 構(gòu)造解析參數(shù)ap = argparse.ArgumentParser()ap.add_argument("-f","--first",required=True, help="first input image")ap.add_argument("-s","second",required=True, help="second")args = vars(ap.parse_args())
          第2-5行為導(dǎo)入的必要包。

          我們將使用compare_ssim(scikit0-image)、argparse、imutils和cv2
          我們建立兩個(gè)命令行參數(shù)--first和--second,這是我們想要比較的兩張圖片的路徑(第8-13行)
          接下來,我們將從磁盤中導(dǎo)入圖片并將他們轉(zhuǎn)換為灰度圖:
          # 導(dǎo)入圖片imageA = cv2.imread(args["--first"])imageB = cv2.imread(args["--second"])
          # 把圖片轉(zhuǎn)換為灰度圖grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)
          我們導(dǎo)入第一張和第二張圖片,并將它們各自存儲(chǔ)為imageA和imageB。(第2-3行)

          然后我們將其轉(zhuǎn)為灰度圖(第6-7行)

          接下來,開始計(jì)算兩會(huì)在那個(gè)圖片之間的結(jié)構(gòu)相似性索引(SSIM)

          # 計(jì)算兩張圖片的結(jié)構(gòu)相似性索引# 確保差分圖片(score, diff) = compare_ssim(grayA, grayB, full=True)diff = (diff*255).astype("uint8")print("SSIM:{}".format(score))

          在第3行中使用scikit-image中的compare_ssim函數(shù),我們計(jì)算得到一個(gè)score和差分圖片diff

          score代表兩張輸入圖片的結(jié)構(gòu)相似性索引。
          該值的范圍在[-1, 1],其中值為1時(shí)為“完美匹配”。
          差分圖片包含了我們希望可視化的兩張輸入圖片的實(shí)際圖片不同點(diǎn)。差分圖片當(dāng)前表示為范圍[0, 1]的浮點(diǎn)數(shù),因此在我們繼續(xù)用OpenCV進(jìn)處理之前,首先要將數(shù)組轉(zhuǎn)換為范圍[0, 256]的8位無符號(hào)整數(shù)。

          現(xiàn)在,找到這些輪廓,這樣我們可以在被標(biāo)識(shí)為“不同”的區(qū)域畫出矩形。

          # 閾值分割差分圖像,然后查找輪廓以獲得兩個(gè)輸入圖片的不同區(qū)域thresh = cv2.threshold(diff, 0, 255,                      cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,                        cv2.CHAIN_APPROX_SIMPLE)cnts = imutils.grab_contours(cnts)

          在第2-3行中,我們使用cv2.THRESH_BINARY_INV  和 cv2.THRESH_OTSU來閾值處理我們的差分圖片——這兩個(gè)設(shè)置使用豎線或符號(hào) “|” 來同時(shí)應(yīng)用。


          有關(guān)OTSU雙峰閾值設(shè)置的詳細(xì)信息可以參考:
          https://docs.opencv.org/trunk/d7/d4d/tutorial_py_thresholding.html

          中文版的:cv2.threshold參數(shù)詳細(xì)說明如下:

          https://blog.csdn.net/sinat_21258931/article/details/61418681
          接下來,第4-6行為找閾值的輪廓。第6行中的三元運(yùn)算符只處理不同版本的OpenCV中的cv2.findcontours返回的特征差異。
          下圖清楚地顯示了被處理過的圖片的ROI區(qū)域


          現(xiàn)在我們已經(jīng)將輪廓存儲(chǔ)在一個(gè)列表中,然后在沿著每張圖片的不同區(qū)域畫出矩形。
          # 遍歷輪廓for c in cnts:  # 計(jì)算輪廓的邊界框,然后在兩張輸入圖片中代表圖片不同點(diǎn)的區(qū)域繪制邊界框  (x, y, w, h) = cv2.boundingRect(c)  cv2.rectangle(imageA, (x, y), (x + w, y + h), (0, 0, 255), 2)  cv2.rectangle(imageB, (x, y), (x + w, y + h), (0, 0, 255), 2) # 顯示輸出圖片cv2.imshow("Original", imageA)cv2.imshow("Modified", imageB)cv2.imshow("Diff", diff)cv2.imshow("Thresh", thresh)cv2.waitKey(0)
          第2行,我們遍歷所有的輪廓,cnts。

          首先,我們使用cv2.boundingRect計(jì)算輪廓周圍的邊界框。

          我們將相關(guān)的(x,y)坐標(biāo)存儲(chǔ)為x和y,此外將矩形的寬和高分別用w和h存儲(chǔ)。
          然后,我們使用這些值利用函數(shù)cv2.rectangle在每個(gè)圖片上繪制一個(gè)紅色的矩形。
          最后,我們顯示對(duì)比圖片的結(jié)果,包含將不同處框選出來的和閾值圖片。
          我們調(diào)用cv2.waitKey函數(shù),讓程序等待一個(gè)按鍵輸入。



          接下來讓我們運(yùn)行代碼,并可視化更多不同的圖片。
          可視化圖片的不同處
          打開終端,并輸入下面的命令:
          python3 image_diff.py --first images/original_02.png --second images/modified_02.png

          如下圖所示,安全芯片和賬戶持有者的姓名都被刪除。

          再嘗試另一個(gè)例子,一張支票。

          python3 image_diff.py --first images/original_03.png --second images/modified_03.png


          注意到這些地方發(fā)生了改變:


          • 名字被刪除
          • 支票編號(hào)被刪除
          • 日期旁邊的符號(hào)被刪除
          • 最后的名字被刪除
          肉眼通常在一個(gè)復(fù)制的圖片中找到所有的不同點(diǎn)。幸運(yùn)的是,我們現(xiàn)在可以通過python、OpenCV和scikit-image輕松的計(jì)算這些不同點(diǎn)和可視化結(jié)果。

          總結(jié)


          今天的文章,我們學(xué)習(xí)了如何使用OpenCV、python和scikit-image的結(jié)構(gòu)相似性所有(SSIM)來計(jì)算圖片的不同點(diǎn)?;趫D片的不同點(diǎn),我們也學(xué)習(xí)了如何標(biāo)記和可視化兩張圖片中的不同區(qū)域,后臺(tái)回復(fù)“找不同”獲取源碼和示例圖片

          更多關(guān)于SSIM的內(nèi)容,可以參考https://www.pyimagesearch.com/2014/09/15/python-compare-two-images/和scikit-image的文檔https://scikit-image.org/docs/dev/api/skimage.measure.html#skimage.measure.compare_ssim

          https://www.pyimagesearch.com/2017/06/19/image-difference-with-opencv-and-python/


          下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
          在「小白學(xué)視覺」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講
          小白學(xué)視覺公眾號(hào)后臺(tái)回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測(cè)、車道線檢測(cè)、車輛計(jì)數(shù)、添加眼線、車牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。

          下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
          小白學(xué)視覺公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

          交流群


          歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請(qǐng)按照格式備注,否則不予通過。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~


          瀏覽 72
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  波多野42部无码喷潮更新时间 | 靠逼视频网站在线观看 | 无码精品一区二区在线 | 高清欧美一区 | 操逼内射网站 |