ECNU Coder 新生程序设计挑战赛

H. 局部二值

单点时限: 2.0 sec

内存限制: 512 MB

LBP (Local Binary Pattern,局部二值模式) 是用于描述图像局部特征的算子,其具备灰度不变性和旋转不变性。

(灰度不变性:光照变化不会对提取的特征产生影响。旋转不变性:对图像进行旋转后,提取的特征不会发生变化)

LBP主要用在人脸检测和目标检测方面。

LBP特征原理:
原始的LBP算子定义在 $3*3$ 的区域中,以区域中心像素为阈值,四周 8个像素与其比较大小,最终产生。

如上面左图所示的图像中(每个元素表示图像的一个像素值),在黄色的 $3*3$ 区域中,周围 8个像素点与中心点像素值120 比较,大于或等于120的记为 1,小于120的记为 0,得到右图。再取左上点做为起始点,按顺时针方向,得到一个二进制表示01001100,转化为十进制76,即为该区域的 LBP值。

按上述方法得到的LBP值,在图像旋转时会发生改变。为使LBP值具有旋转不变性,依次取周围8个点分别做为起始点,得到8个不同的二进制表示,如下图所示。取8个值中的最小值19,做为LBP值。

对一个给定的图像 (大小为 $ W * H ,3 \leq W, H \leq 100 $ ),依次计算以每个像素点(边缘点除外)为中心的 $3 *3 $ 区域的 LBP 值。

输入格式

第一行包含两个整数 $W$ 和 $H$ $(3 \leq W, H \leq 100)$,中间用一个空格分开,分别表示图像的宽度和高度。

接下来 $H$ 行,每行 $W$ 个整数,每两个整数之间用一个空格分开,表示图像的像素 $(0 \leq 像素值 \leq 255)$ 。

输出格式

依次(由上到下,由左到右) 输出以每个像素点(边缘点除外)为中心的 $3*3$ 区域的LBP值,共计 $H-2$ 行,每行 $W-2$ 个整数,每两个整数之间用一个空格分开,最后一个整数后没有空格。

样例

Input
3 3
1 1 1
1 1 1
1 1 1
Output
255
Input
5 5
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9
Output
31 31 31
31 31 31
31 31 31
Input
10 8
25 36 150 43 110 38 99 98 55 79
26 98 152 45 44 48 110 39 38 92
23 100 120 78 38 63 114 42 120 89
22 79 163 140 92 67 67 58 112 43
38 78 120 138 98 78 87 69 138 50
67 56 123 150 111 89 89 74 129 25
44 221 135 222 123 92 90 59 150 21
58 220 147 255 252 100 99 83 111 10
Output
15 0 61 91 47 1 127 255
7 19 31 255 31 0 63 0
15 0 1 7 63 61 127 17
15 31 19 15 63 3 63 0
95 31 1 15 63 7 119 17
0 63 3 15 31 7 255 0