如何区分照片和图片?

时间:2012-12-28 08:57:23

标签: image-processing opencv computer-vision

我有以下问题: 我获得了一组图像,我需要使用OpenCV库将它们分配给照片和图片(图形)

我已经尝试了

  1. 分析RGB直方图(平均图片中有空格的直方图),
  2. 分析HSV直方图(平均图片颜色不多),
  3. 搜索轮廓(平均而言,图片上的轮廓数量少于照片上的轮廓数量。)
  4. 所以我有7%的错误(在2000张图片上测试过)。我有点困惑,因为我在很多计算机视觉方面都没有很多经验。

    例如,下面这张照片。它的直方图(RGB和HSV)非常差,轮廓数量相当小。此外还有很多背景颜色,所以我需要找到一个对象来计算它的直方图(我为此使用了findContours())。但无论如何我的算法会将此图像检测为图片

    photo 1

    还有一个例子:

    photo 2

    图片问题是噪音。我有小尺寸(200 * 150)的图像,在某些情况下噪点是如此明显,我的算法将此图像检测为照片。我试图模糊图像,但在这种情况下,由于混合像素,颜色数量增加,并且它减少了轮廓的数量(一些暗淡的边界变得无法区分)。

    图片示例: picture 1 picture 2

    我也尝试了颜色分割和MSER,但我最好的结果仍然是7%。

    你能告诉我我还可以尝试哪些方法吗?

3 个答案:

答案 0 :(得分:3)

我已经使用你的数据集来创建非常简单的模型。为此,我在R中使用了Rattle库。

输入数据

 rgbh1 - number of bins in RGB histogram, which value > @param@, in my case @param@ = 30 (340 is maximum value)
 rgbh2 - number of bins in RGB histogram, which value > 0 (not empty)
 hsvh1 - number of bins in HSV histogram, which value > @param@, in my case @param@ = 30 (340 is maximum value)
 hsvh2 - number of bins in HSV histogram, which value > 0 (not empty)
 countours - number of contours on image
 PicFlag - flag indicating picture/photo (picture = 1, photo = 0)

数据探索

为了更好地理解您的数据,下面是按照图片/照片组分布各个变量的图表(y轴上有百分比):

enter image description here

它清楚地表明存在具有预测能力的变量。其中大部分都可以在我们的模型中使用。接下来,我创建了简单的散点图矩阵,以查看某些变量组合是否有用:

enter image description here

你可以看到例如countours和rgbh1的组合看起来很有希望。

在下面的图表中,您可以注意到变量之间也存在很强的相关性。 (通常,我们希望有很多变量具有低相关性,而您只有有限数量的相关变量)。饼图显示相关性有多大 - 全圆表示1,空圆表示0,我的观点是如果相关性超过.4,则在模型中同时包含两个变量可能不是一个好主意。

enter image description here

<强>模型

然后我使用决策树,随机森林,逻辑回归和神经网络创建了简单的模型(保持Rattle的默认值)。作为输入,我已将您的数据用于60/20/20拆分(培训,验证,测试数据集)。这是我的结果(如果你不理解错误矩阵,请参考谷歌):

Error matrix for the Decision Tree model on pics.csv [validate] (counts):

      Predicted
Actual   0   1
     0 167  22
     1   6 204

Error matrix for the Decision Tree model on pics.csv [validate] (%):

      Predicted
Actual  0  1
     0 42  6
     1  2 51

Overall error: 0.07017544

Rattle timestamp: 2013-01-02 11:35:40 
======================================================================
Error matrix for the Random Forest model on pics.csv [validate] (counts):

      Predicted
Actual   0   1
     0 170  19
     1   8 202

Error matrix for the Random Forest model on pics.csv [validate] (%):

      Predicted
Actual  0  1
     0 43  5
     1  2 51

Overall error: 0.06766917

Rattle timestamp: 2013-01-02 11:35:40 
======================================================================
Error matrix for the Linear model on pics.csv [validate] (counts):

      Predicted
Actual   0   1
     0 171  18
     1  13 197

Error matrix for the Linear model on pics.csv [validate] (%):

      Predicted
Actual  0  1
     0 43  5
     1  3 49

Overall error: 0.07769424

Rattle timestamp: 2013-01-02 11:35:40 
======================================================================
Error matrix for the Neural Net model on pics.csv [validate] (counts):

      Predicted
Actual   0   1
     0 169  20
     1  15 195

Error matrix for the Neural Net model on pics.csv [validate] (%):

      Predicted
Actual  0  1
     0 42  5
     1  4 49

Overall error: 0.0877193

Rattle timestamp: 2013-01-02 11:35:40 
======================================================================

<强>结果

正如您所看到的,整体错误率介于6.5%和8%之间。我不认为通过调整使用方法的参数可以显着改善这一结果。有两种方法可以降低整体错误率:

  • 添加更多不相关的变量(我们通常在建模数据集中有100多个输入变量,+ / - 5-10在最终模型中)
  • 添加更多数据(我们可以调整模型而不会过度拟合)

使用过的软件:

用于创建corrgram和scatterplot的代码(其他输出是使用Rattle GUI生成的):

# install.packages("lattice",dependencies=TRUE)
# install.packages("car")

library(lattice)
library(car)

setwd("C:/")

indata <- read.csv2("pics.csv")

str(indata)


# Corrgram
corrgram(indata, order=TRUE, lower.panel=panel.shade,
         upper.panel=panel.pie, text.panel=panel.txt,
         main="Picture/Photo correlation matrix")

# Scatterplot Matrices
attach(indata)
scatterplotMatrix(~rgbh1+rgbh2+hsvh1+hsvh2+countours|PicFlag,main="Picture/Photo scatterplot matrix",
                  diagonal=c("histogram"),legend.plot=TRUE,pch=c(1,1))

答案 1 :(得分:1)

一般的建议是增加功能的数量(或获得更好的功能),并使用这些功能构建分类器,并使用适当的机器学习算法进行训练。 OpenCV已经有了几个很好的machine learning算法,您可以使用它们。

我从来没有解决过这个问题,但是快速的谷歌搜索让我看到了Cutzu et。的这篇论文。 al。 Distinguishing paintings from photographs

答案 2 :(得分:1)

一个应该有用的功能是渐变直方图。自然图像具有特定的梯度强度分布。