【问题标题】:Image Classification - Detecting an image is cartoon-like图像分类 - 检测图像类似于卡通
【发布时间】:2019-04-28 21:05:11
【问题描述】:

我有大量尺寸从 120x90 到 320x240 不等的 JPEG 缩略图图像,我想将它们归类为真实生活类或卡通类。

如何使用ImageMagick 的实用程序来做到这一点:convertcompareidentify?还是有其他程序可以解决问题?

【问题讨论】:

  • 如果您正在搜索预制应用程序,这属于超级用户。
  • 我更感兴趣的是了解如何将图像分类为卡通形象的过程。话虽如此,如果现有的应用程序存在于此,那么我也想知道。

标签: image-processing


【解决方案1】:

我猜你最好的一点是直方图和像素数之间的无线电。一种卡通线条图像趋势,其颜色数量少于现实生活中的颜色。

你可以使用

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 是我女朋友站在大海前的照片,所以颜色的数量比平时少。这并不奇怪为什么会发生这种混乱。

我在这里向您展示的仍然是一个原始理论。如果您真的想要一个决定性的指示,您可能必须找到指标的数量并进行比较。比如局部对比的程度。

希望这会有所帮助。

【讨论】:

  • 我针对每组 200 张图片(卡通、真实)的样本集运行了您的解决方案,分类之间没有明显区别。
  • 我再次运行了这个解决方案,但它仍然是一样的。我相信您使用的样本尺寸与我使用的样本尺寸(120x90 - 320x240)相比,是两者之间几乎没有区别的原因。
  • 我刚刚看到你的图片分辨率很小。由于这种方法依赖于集体信息(直方图),因此不适用于小尺寸图片,因为每张图片中的颜色数量相差不大。在这种情况下,我真的不知道该为您提供什么帮助。对不起。
【解决方案2】:

理论上:

区分卡通场景图像和自然场景图像的一种方法是将给定图像与其“平滑”后的图像进行比较。这背后的动机是“平滑的”卡通图像在统计上不会发生太大变化,而自然场景图像。换句话说,拍摄一张图像,将其卡通化(即平滑)并从原始图像中减去结果

isNotACartoonIndex = mean( originalImage - smooth(originalImage) )

这种差异(即取其平均值)将给出由平滑引起的变化水平。对于非平滑的原始(自然场景)图像,该索引应该较高,而对于平滑的原始(卡通)图像,该索引应该较低。

一个 SO 问题already discusses how to cartoonify images

在实践中:

我建议使用 bilateral filtering 进行平滑/卡通化:

双边过滤可以通过 OpenCV 使用cvSmooth function with the CV_BILATERAL parameter 来完成。

至于从原始图像中减去卡通化图像,我会使用 HSV 图像的色调通道来做到这一点。这意味着您需要先将两个图像从 RGB 转换为 HSV。

附带说明,想要通过 ImageMagick 工作流程实现这一点可能会变得不必要地复杂。

【讨论】:

    【解决方案3】:

    作为第一遍,我会尝试计算图像颜色直方图的熵。类似卡通的图像应具有较少的不同颜色深浅,因此熵较低。

    这与 NawaMan 提出的类似,但这种方法更进了一步。颜色的数量超过像素的数量可能还不够。例如,可能存在 jpeg 伪影,它们会人为地增加图像中的颜色数量,但仅限于几个像素。在这种情况下,图像中的大多数像素仍然只有很少的颜色,这对应于低熵。

    假设您从 RGB 图像开始。对于每个像素,R、G 和 B 值的范围为 0 到 255。
    您可以将此范围划分为 n 个 bin,例如,其中 n 可以是 16。您将计算有多少像素落入这些 3 维箱中的每一个。然后你需要将垃圾箱的值除以 像素的总数,以便您的直方图总和为 1。然后计算熵,即 是 - sum_i p_i * log(p_i),其中 p_i 是第 i 个 bin 的值。

    尝试使用不同的 n 值,看看是否可以将真实图像与卡通图像分开。

    【讨论】:

      【解决方案4】:

      这是一个图像分类问题,AFAIK ImageMagick 将能够做到。

      opencv(处理计算机视觉)可能会提供更多帮助,以了解如何使用训练数据训练“图像分类器”。

      【讨论】:

        猜你喜欢
        • 2020-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-11
        • 2021-10-02
        • 2020-05-18
        • 2012-01-18
        相关资源
        最近更新 更多