3

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

我已经试过了

  1. 分析 RGB 直方图(平均图片有直方图的空箱),
  2. 分析 HSV 直方图(平均图片没有太多颜色),
  3. 搜索轮廓(平均而言,图片上的轮廓数量少于照片上的数量)。

所以我有 7% 的错误(在 2000 张图像上测试)。我有点困惑,因为我在众多计算机视觉手段方面没有太多经验。

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

照片 1

还有一个例子:

照片 2

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

图片示例: 图片1 图 2

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

你能告诉我我还可以尝试什么方法吗?

4

3 回答 3

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 轴上有百分比):

在此处输入图像描述

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

在此处输入图像描述

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

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

在此处输入图像描述

模型

然后我使用决策树、随机森林、逻辑回归和神经网络创建了简单的模型(保持 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 和散点图的代码(其他输出使用 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))
于 2013-01-02T11:03:17.743 回答
1

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

我从来没有研究过这个问题,但是快速的谷歌搜索让我找到了 Cutzu等人的这篇论文。人。 区分绘画和照片

于 2012-12-28T09:12:07.347 回答
1

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

于 2012-12-28T20:08:19.980 回答