#P2716. Open and Close

Open and Close

描述

形态学操作是用于提取图像组件以表示和描述区域形状的工具。两种常见的形态学操作是开操作和闭操作。在定义这些操作之前,我们首先需要定义图像的表示方法。

给定一个具有 MMNN 列的二值图像 A,我们可以将 A 表示为一组坐标 (r,c)(r, c)(其中 1rM1 ≤ r ≤ M, 1cN1 ≤ c ≤ N),使得指定坐标处的像素值为 11。左上角的坐标为 (1, 1)。同时,我们还给定了一个二值图像 B(称为结构元素),它的行数和列数均为 2S+12S+1。结构元素同样可以用集合来表示,不过这里左上角的像素坐标为 (-S, -S)。

在形态学图像处理中,两个重要的操作是膨胀和腐蚀。图像 A 经过结构元素 B 的膨胀定义为:

AB=a+baA,bBZA ^ B = { a + b | a ∈ A, b ∈ B } ∩ Z

其中坐标加法是分量加法,而 Z 是所有满足 1 ≤ i ≤ M 且 1 ≤ j ≤ N 的坐标 (i, j) 的集合。同样,A 经过 B 的腐蚀定义为:

AvB=w对于B中的每个b,有w+bAA v B = { w | 对于 B 中的每个 b,有 w + b ∈ A }

在定义了这两个操作之后,图像 A 的开操作定义为

AoB=(AvB)BA o B = (A v B) ^ B

而闭操作定义为

A.B=(AB)vBA . B = (A ^ B) v B

大致来说,开操作用于去除小的细节,同时保持整体形状;闭操作用于填补间隙,同时保持整体形状。

输入

输入由若干个测试实例组成。每个实例的第一行包含整数 M、N 和 S,这些数字之间用空格分隔(10 ≤ M, N ≤ 256, 1 ≤ S ≤ 4)。接下来的 M 行包含图像 A 的各行,每行由 N 个字符构成,这些字符为 '.'(表示 0)或 '*'(表示 1)。接下来的 2S+1 行以类似的方式给出结构元素 B。当 M = N = S = 0 时,输入结束。

输出

对于每个测试实例,首先输出案例编号,然后空一行。接着输出 A o B 的结果,再空一行,最后输出 A . B 的结果。输出图像的格式与输入图像相同。不同测试实例之间用一行由 75 个等号 (=) 组成的分隔线分开。


10 12 1
............
..*.........
.***...***..
.***...***..
.*********..
.**********.
.*********..
.***...*.*..
............
............
***
***
***
10 12 1
............
..*.........
.***...***..
.***...***..
.*********..
.**********.
.*********..
.***...*.*..
............
............
.*.
***
.*.
0 0 0
Case 1

............
............
.***...***..
.***...***..
.*********..
.*********..
.*********..
.***........
............
............

............
..*.........
.***...***..
.***...***..
.*********..
.**********.
.*********..
.***...***..
............
............
===========================================================================
Case 2

............
..*.........
.***....*...
.***...***..
.*********..
.**********.
.*********..
..**...*....
............
............

............
..*.........
.***...***..
.****.****..
.*********..
.**********.
.*********..
.***...*.*..
............
............

提示

大量输入和输出数据,建议使用 scanf 和 printf。

来源

Rocky Mountain 2005