在图像上执行反射式中央垫

时间:2018-09-24 01:50:28

标签: python numpy image-processing linear-algebra scikit-image

活跃的Kaggle竞赛中的

This forum thread提到了作者称为“反射中心垫”的东西。基本上,这是一种变换,它采用图像的边缘并将其向外反射,从而在图像的边缘上产生镜像,作者对此进行了略微显示,但显着改善了模型性能。

作为参考,这是他们发布的演示此技术的图像:

我的问题是双重的:

  1. 此转换是否具有规范名称? “反光中垫”听起来是非正式的。
  2. 使用代码numpy和类似skimage之类的代码来表达这种转换的简单方法是什么?

2 个答案:

答案 0 :(得分:3)

  

此转换是否具有规范名称? “反光中心   垫”听起来是非官方的。

“对称填充”是引用此转换的常用表达方式。

  

用代码表达这种转变的简单方法是什么

我认为最简单的方法是使用Numpy的padmode='symmetric'

演示

import numpy as np
from skimage import data
import matplotlib.pyplot as plt

img = data.astronaut()
padded = np.pad(img, pad_width=((100, 200), (100, 500), (0, 0)), mode='symmetric')

fig, (ax1, ax2) = plt.subplots(2, 1)
ax1.imshow(img)
ax2.imshow(padded)
fig.show()

Padding results

答案 1 :(得分:1)

要回答您的第二个问题:

import Image
import numpy as np
from scipy.misc import face

# example input
f = face()[200:500:2, 400:800:2]
# example output size
outy, outx = 480, 640

iny, inx, *_ = f.shape
iny -= 1; inx -= 1
yoffs, xoffs = (outy - iny) // 2, (outx - inx) // 2

Y, X = np.ogrid[:outy, :outx]
# transformation logic is essentially contained in line below
out = f[np.abs((Y - yoffs + iny) % (2*iny) - iny), np.abs((X - xoffs + inx) % (2*inx) - inx)]

Image.fromarray(out).save('m.png')

结果:

enter image description here