我猜你最好的一点是直方图和像素数之间的无线电。一种卡通线条图像趋势,其颜色数量少于现实生活中的颜色。
你可以使用
COLORS=`convert picture.jpg -format %c histogram:info:- | wc -l`
计算图片有多少种颜色。并使用如下命令:
WIDTH=`jpeginfo picture.jpg | sed -r "s/.* ([0-9]+) x.*/\1/"`
和
HEIGHT=`jpeginfo picture.jpg | sed -r 's/.*x ([0-9]+) .*/\1/'`
提取宽度和高度。
然后用这个命令求比例:
echo $WIDTH $HEIGHT $COLORS | awk '{ print $3/($1 * $2);}'
然后由你来定义什么比例符合卡通风格,什么不是。
对于卡通类,该比例大多低于现实生活中的比例。
只是一个想法。
编辑:我刚刚看到您的评论,您不想知道如何只是一个退出。所以请忽略我的回答。
编辑2:我稍微修改了一下,让它更容易看到。
注意 1: 你应该注意到我交换了比率,因为像素数总是比颜色数大得多,所以前面的程序导致
一个较低的数字。这就是为什么你很难区分它们。
注意 2: 我也从“jpeginfo”更改为“identity”,因为 jpeginfo 只能做 jpg,它不是 ImageMagick 的一部分。
~/test/CheckCartoon.sh
#!/bin/sh
IMAGE=$1
COLORS=convert $IMAGE -format %c histogram:info:- | wc -l
WIDTH=<b>identify</b> $IMAGE | sed -r "s/.* ([0-9]+)x[0-9]+ .*/\1/"
HEIGHT=<b>identify</b> $IMAGE | sed -r 's/.* [0-9]+x([0-9]+) .*/\1/'
RATIO=echo $WIDTH $HEIGHT $COLORS | awk '{ print <b>($1 * $2)/$3</b>;}'
echo $RATIO | awk '{ printf "%020.5f",$1 }'
~/test/CheckAll.sh
#!/bin/sh
cd images
FILES=ls
for FILE in $FILES; do
IsIMAGE=identify $FILE 2>&1 | grep " no decode delegate " | grep -o "no"
if [ "$IsIMAGE" = "no" ]; then continue; fi
IsIMAGE=`identify $FILE 2>&1 | grep " Improper image header " | grep -o "Improper"`
if [ "$IsIMAGE" = "Improper" ]; then continue; fi
echo `.././CheckCartoon.sh $FILE` $FILE
done
cd ..
现在用于测试,您在此处复制文件。
图一:~/test/images/Cartoon-01.jpg
图2:~/test/images/Cartoon-02.png
图3:~/test/images/Cartoon-03.gif
图4:~/test/images/Real-01.jpg
图5:@987654325@
图6:~/test/images/Real-03.jpg
http://dl.getdropbox.com/u/1961549/StackOverflow/SO1518347/Images.png
然后我运行./CheckAll.sh | sort(在test 文件夹中)。这是我想要的。
00000000000003.31362 Real-03.jpg
00000000000004.61574 Real-02.jpg
00000000000009.89920 Cartoon-01.jpg
00000000000013.05870 Real-01.jpg
00000000000020.55470 Cartoon-03.gif
00000000000032.21900 Cartoon-02.png
如您所见,结果通常很好。您可以使用像 15 这样的数字作为分隔符。
Cartoon-01.jpg 是一幅画,但它看起来很逼真,因此很容易混淆。另外Real-01.jpg 是我女朋友站在大海前的照片,所以颜色的数量比平时少。这并不奇怪为什么会发生这种混乱。
我在这里向您展示的仍然是一个原始理论。如果您真的想要一个决定性的指示,您可能必须找到指标的数量并进行比较。比如局部对比的程度。
希望这会有所帮助。