以程式方式確定圖像的“均勻性”
我正在嘗試編寫一個腳本來縮略圖我們成千上萬的資產。這些資產大部分使用 Flash,我通過命令行上的 chromium-browser 擷取它們。我現在非常需要站在它上面讓它工作,它是一個 PITA。什麼會幫助我的腳本知道它何時製作了失敗的縮略圖,這似乎發生了很多。
“失敗”往往是統一的顏色,深灰色或白色,我想我可以使用這種“均勻度”作為以程式方式評估縮略圖成功的方式。這裡有一些例子:
https://dl.dropboxusercontent.com/u/846812/permanent/thumb_examples/fail_1.jpg https://dl.dropboxusercontent.com/u/846812/permanent/thumb_examples/fail_2.jpg https://dl.dropboxusercontent.com/u/846812/permanent/thumb_examples/success1.jpg https://dl.dropboxusercontent.com/u/846812/permanent/thumb_examples/success2.jpg
使這(我假設)更加困難的是深灰色不是統一的顏色,而是像素的重複圖案,近距離看起來像這樣:
所以它是統一的,但它是一個統一的重複模式。
誰能想到我可以在命令行中執行此操作的方法?
我不知道您如何以程式方式執行此操作,這不是 100% 準確的事情,但是,由於您正在做一些接近螢幕抓取的事情,我建議您實際在螢幕上啟動圖像並使用
xdtool
,您可以隨機採樣許多圖像上的點並檢測像素顏色。如果所有或者說超過 95% 的顏色都是相同的,那麼可以肯定地說圖像是純色。另一種方法是儲存經常遇到的錯誤圖像並將圖像大小與錯誤圖像的大小進行比較。我正在使用 VLC 為我的影片庫從影片中提取靜止圖像,在這樣做的同時,我意識到,圖像的對比度越高,我擷取的 png 文件的大小就越大。所以,看看圖像尺寸是否太小。畢竟,圖像壓縮就是要盡量減少重複圖案的儲存量。您可以利用這一事實來發揮自己的優勢。
您可以嘗試FotoForensics 的名人Neal Krawetz 所做的一種方法:
- 減小尺寸。Krawetz 將圖像“粉碎”成一個 8x8 的正方形。
- 將 8x8 圖像的顏色降低為灰度。
- 計算得到的 64 種顏色的平均值。
- 計算一個 64 位數字 (8 * 8 = 64) - “每個位都是根據顏色值是高於還是低於平均值來簡單設置的。
- 構造一個雜湊。看起來 Krawetz 只是使用 64 位作為雜湊值。
這類事情會使你的灰度圖像和黑白圖像作為非常不同的雜湊值消失。您可能必須為此編寫或找到一些非 shell 腳本程式碼。
另一個想到的是在圖像中找到主色。那傢伙使用 Imagemagick 和
awk
,但我不確定您將如何測試您的案例中的相等性或相似性。更新
我偶然發現了 libpuzzle,“一個查找相似圖片的庫”。只需要一點編碼就可以用它來做你想做的事情。
還有pHash,一個開源的感知散列庫。這個可能需要相同數量的編碼。
這些都不完全符合您的要求,因為 libpuzzle 有一個 PHP 介面,而 pHash 似乎需要您編寫一個 C 程序。