В этой ветке форума активного конкурса Kaggle что-то упоминается автор называет «отражающей центральной подушкой». По сути, это преобразование, которое берет края изображения и отражает их наружу, вызывая зеркальное отражение по краям изображения, что автор показывает немного, но заметно улучшает производительность модели.

Для справки, вот изображение, которое они публикуют, демонстрируя эту технику:

Мой вопрос двоякий:

  1. Есть ли у этого преобразования каноническое название? «Светоотражающая центральная панель» звучит неофициально.
  2. Какой простой способ выразить это преобразование в коде, возможно, используя numpy и что-то вроде skimage?
2
Aleksey Bilogur 24 Сен 2018 в 04:50

2 ответа

Лучший ответ

Есть ли у этого преобразования каноническое название? «Светоотражающая центральная панель» звучит неофициально.

«Симметричное заполнение» - это часто используемое выражение для обозначения этого преобразования.

Какой простой способ выразить это преобразование в коде

Я думаю, что самый простой способ добиться этого - использовать {{ X0}} с mode='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

3
Tonechas 24 Сен 2018 в 08:31

Чтобы ответить на второй вопрос:

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

1
Paul Panzer 24 Сен 2018 в 04:11