5

IOI 2013 中的第二个问题指出:

您即将参加艺术史考试,但您在学校更关注信息学而不是艺术课!您需要编写一个程序来为您参加考试。

考试将包括几幅画。每幅画都是四种独特风格之一的一个例子,编号为 1、2、3 和 4。风格 1 包含肿瘤现代艺术。风格 2 包含印象派风景。风格 3 包含表现主义动作画。风格 4 包含色域绘画。

你的任务是,给定一幅绘画的数字图像,确定这幅画属于哪种风格。

图像将以 H×W 像素网格的形式给出。图像的行从上到下编号为 0, …, (H 1),列从左到右编号为 0, …, W 1。使用二维数组 R、G 和 B 来描述像素,它们分别给出图像每个像素中的红色、绿色和蓝色的数量。这些数量的范围从 0(没有红色、绿色或蓝色)到 255(红色、绿色或蓝色的最大数量)。

实现 你应该提交一个实现函数 style() 的文件,如下:

int style(int H, int W, int R[500][500], int G[500][500], int B[500][500]);

此函数应确定图像的样式。参数是

  • H:图像中像素的行数。
  • W:图像中像素的列数。
  • R:大小为 H×W 的二维数组,给出图像每个像素中的红色量。
  • G:大小为 H×W 的二维数组,给出图像每个像素中的绿色量。
  • B:大小为 H×W 的二维数组,给出图像每个像素中的蓝色量。

示例图片在问题 PDF中

想要现成的程序。让我开始的一两个提示会很好,因为我对此一无所知可能会解决。

4

2 回答 2

15

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

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


Style1 - 肿瘤现代艺术

肿瘤现代艺术

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

Style2 - 印象派风景

印象派风景

  • 高颗粒度- 检查 Luma(Y) 中的高熵(salt-n-pepper-noise like)模式。
  • 主要是绿色- 绿色通道中的高值。
    绿色平均>>红色平均
    绿色平均>>蓝色平均

Style3 - 表现主义动作画

表现主义动作画


Style4 - 色域画

色域画

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

只要输入图像属于这些类之一,您就可以通过为识别上述特征而实现的函数运行图像数据来进行分类。

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

  • 图像具有均匀的亮度
    • (如果是)图像在色度过渡处有黑色像素
      • (如果是)样式 1
      • (如果否)样式 4
    • (如果否)图像是绿色的
      • (如果是)样式 2
      • (如果否)样式 3
于 2013-08-02T08:55:41.367 回答
0

也许你可以使用颜色和形状做第一种方法......在新塑料现代中,很可能只有少数颜色,占据几何区域,就像在色域绘画中一样。

这可能会为您提供一种区分样式 1 和 4 与样式 2 和 3 的方法。

在样式 1 和 4 中,您有大面积的颜色相同,但在样式 4 中,颜色很少是纯色,而是颜色阴影的笔触。

无论如何,您应该研究每种样式的特点,即通常的颜色和方法,然后尝试使您的功能“看到”它。

于 2013-08-02T08:34:57.870 回答