有关解决此图像处理挑战的指针?

Soh*_*ury 6 c c++ image

IOI 2013中的第二个问题是:

您的艺术史考试即将来临,但您在学校的信息学比在艺术课上更受关注!您需要编写一个程序来为您参加考试.

考试将包括几幅画.每幅画都是四种独特风格之一的例子,编号为1,2,3和4.风格1包含赘生性的现代艺术.风格2包含印象派风景.Style 3包含表现主义动作画.风格4包含色场绘画.

在给定绘画的数字图像的情况下,您的任务是确定绘画所属的样式.

图像将作为H×W像素网格给出.图像的行从上到下编号为0,...,(H 1),并且列从左到右编号为0,...,W 1.使用二维阵列R,G和B描述像素,其分别在图像的每个像素中给出红色,绿色和蓝色的量.这些量的范围从0(无红色,绿色或蓝色)到255(红色,绿色或蓝色的最大量).

实现 您应该提交一个实现函数样式()的文件,如下所示:

int style(int H, int W, int R[500][500], int G[500][500], int B[500][500]);
Run Code Online (Sandbox Code Playgroud)

此功能应确定图像的样式.参数是:

  • H:图像中像素的行数.
  • W:图像中像素的列数.
  • R:尺寸为H×W的二维阵列,给出图像的每个像素中的红色量.
  • G:尺寸为H×W的二维阵列,给出图像的每个像素中的绿色量.
  • B:尺寸为H×W的二维阵列,给出图像的每个像素中的蓝色量.

示例图片在问题PDF中

想要一个现成的程序.让我开始的一两个提示会很好,因为我无能为力可能会解决这个问题.

The*_*ist 14

由于您提供了RGB格式的图像数据,因此首先在YUV中准备相同图像数据的副本.这是必不可少的,因为一些图像特征在Luma(Y)和Chroma(U,V)图中很容易识别模式.

根据提供的样本,以下是每种"艺术风格"的一些显着特征:


Style1 - Neoplastic现代艺术

肿瘤的现代艺术

  • 零颗粒度 - 检查具有均匀Luma(Y)的大区域
  • 区域边缘的黑色像素(不同色度之间的过渡).

Style2 - 印象派风景

印象派风景

  • 高颗粒度 - 检查Luma(Y)中的高熵(盐 - 胡椒 - 噪声)模式.
  • 主导绿色 - 绿色通道中的高值.
    绿色平均 >>红色平均
    绿色平均 >>蓝色平均

Style3 - 表现主义动作画

表现主义动作画


Style4 - 彩色场画

彩色场画

  • 零颗粒度 - 检查具有均匀Luma(Y)的大区域
  • 在不同色度之间的过渡处没有黑色(或接近黑色)像素.

只要输入图像属于这些类中的一个,就可以通过运行图像数据来识别上述特征,从而在分类中没有任何问题.

基本上它归结为以下代码流:

  • 图像有均匀的亮度吗?
    • (如果是)图像在色度过渡时有黑色像素
      • (如果是)Style1
      • (如果没有)Style4
    • (如果否)图像是绿色的
      • (如果是)Style2
      • (如果否)Style3