答案1
使用 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++ 的角度來看,出錯的檔案可能是壞的或損壞的,但在通常較寬鬆的影像視覺化器上具有良好的可讀性。