#P2716. Open and Close
Open and Close
描述
形态学操作是用于提取图像组件以表示和描述区域形状的工具。两种常见的形态学操作是开操作和闭操作。在定义这些操作之前,我们首先需要定义图像的表示方法。
给定一个具有 行 列的二值图像 A,我们可以将 A 表示为一组坐标 (其中 , ),使得指定坐标处的像素值为 。左上角的坐标为 (1, 1)。同时,我们还给定了一个二值图像 B(称为结构元素),它的行数和列数均为 。结构元素同样可以用集合来表示,不过这里左上角的像素坐标为 (-S, -S)。
在形态学图像处理中,两个重要的操作是膨胀和腐蚀。图像 A 经过结构元素 B 的膨胀定义为:
其中坐标加法是分量加法,而 Z 是所有满足 1 ≤ i ≤ M 且 1 ≤ j ≤ N 的坐标 (i, j) 的集合。同样,A 经过 B 的腐蚀定义为:
在定义了这两个操作之后,图像 A 的开操作定义为
而闭操作定义为
大致来说,开操作用于去除小的细节,同时保持整体形状;闭操作用于填补间隙,同时保持整体形状。
输入
输入由若干个测试实例组成。每个实例的第一行包含整数 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