從命令行檢測“壞”圖像
我已經從磁碟的意外格式化中恢復了大量的圖像。
大量這些圖像已損壞,即。100% 綠色或 70% 灰色。不幸的是,它們仍然有 EXIF 數據,所以我不能隨便用它來找出哪些圖像不好。
使用 Imagemagick
這個給你圖像中的像素總數:
identify -verbose ~/www/pictures/ISTI-F.jpg | sed -n '/.*Pixels: /s///p'
這個給你主要的顏色名稱和像素數:
convert ~/www/pictures/ISTI-F.jpg -format "%c" histogram:info: | sort -nr -t: | head -1 | sed 's/\(.*\):.*#\(......\).*/\2\1/'
例子:
$ identify -verbose ISTI-F.jpg | sed -n '/.*Pixels: /s///p' 1920000 $ convert ISTI-F.jpg -format "%c" histogram:info: | sort -nr -t: | head -1 | sed 's/\(.*\):.*#\(......\).*/\2\1/' FFFFFF 1667711
這可以作為編寫 shell 腳本的基礎,但它不擅長檢查許多文件,因為 Imagemagick 非常靈活,但速度很慢
使用八度
可以直接從命令行呼叫以下 Octave 腳本。它的參數應該是兩個目錄名
errdir
和baddir
一個圖像文件列表。Octave 使用的 LibMagick++ 庫給出警告或錯誤的文件移至errdir
; 最後 25% 行顏色相同的文件移至baddir
; 其他文件保持不變。在標準輸出上給出了一個簡潔的報告。如果您只想要報告而不移動文件,請不要將目錄名稱作為前兩個參數。
#!/usr/bin/octave -qf threshold = 0.25; usage = "Usage is: badfiles <file...> OR badfiles <errdir> <baddir> <file...>\n"; files\n"; assert(nargin>0, usage); dryrun = isfile(argv{1}); if !dryrun errdir = argv{1}; baddir = argv{2}; assert(isfolder(errdir) && isfolder(baddir) && isfile(argv{3}), usage); endif start = 1 + 2*(!dryrun); for fname = argv()(start:end)' q = []; f = fname{}; warning error try q = imread(fname{}); catch err end_try_catch warning on if isempty(q) printf("error\t"); dryrun || movefile(f, errdir); else qt = all(q == q(end,1,:) ,2); qtt = squeeze(all(qt, 3)); r = 1 - find(qtt==0, 1, 'last') / size(q, 1); if (r > threshold) printf("bad--%02d\t", ceil(100*r)); dryrun || movefile(f, baddir); else printf("good-%02d\t", ceil(100*r)); endif endif disp(f); endfor
您需要安裝 Octave 才能正常工作。將上述內容複製到一個名為 的文件中
badimage
,使其可執行chmod +x badimage
並測試腳本,如下所示./badimage *.jpg
:您將看到一個文件列表及其狀態(好、壞、錯誤)。查看輸出並可能更改腳本內的門檻值以獲得更激進(較低門檻值)或更保守(較高門檻值)的行為。您可以根據需要對其進行測試,因為如果您僅將圖像文件名作為參數,它不會移動或更改文件。
對結果滿意後,創建兩個目錄
mkdir errpics badpics
。然後將腳本稱為./badimage errpics badpics *.jpg
. 這樣,腳本將您的文件移動到上述目錄中。警告:使用此腳本後,請務必在刪除之前檢查標記為壞或錯誤的圖像的良好樣本!
檢測不良圖像的算法對於照片是可靠的,但對於可能包含相同顏色的廣泛合法區域的繪圖、徽標、圖表、圖形不一定是可靠的。從 LibMagick++ 的角度來看,錯誤的文件可能是壞的或損壞的,但在通常更寬鬆的圖像視覺化器上可讀性很好。