обзор
Для входного изображения в формате простого PPM (P3) для каждого пикселя p
в изображении замените каждый из следующих 4 пикселей, красный, зеленый и синий, средним значением соответствующих каналов всех 4 пикселей:
p
самПиксель, расположенный на
p
месте, когда изображение перевернуто вертикальноПиксель, расположенный в том
p
месте, где изображение перевернуто горизонтальноПиксель, расположенный на
p
месте, когда изображение переворачивается как вертикально, так и горизонтально
Выведите полученное изображение в формате обычного PPM (P3).
Для дальнейшего объяснения рассмотрим это изображение 8x8, увеличенное до 128x128:
Позвольте p
быть красным пикселем. Чтобы вычислить новое значение для p
(и 3 синих пикселя), значения p
и 3 синих пикселя будут усреднены вместе:
p1 = (255, 0, 0)
p2 = (0, 0, 255)
p3 = (0, 0, 255)
p4 = (0, 0, 255)
p_result = (63, 0, 191)
Примеры
Реализация эталона
#!/usr/bin/python
import sys
from itertools import *
def grouper(iterable, n, fillvalue=None):
args = [iter(iterable)] * n
return list(izip_longest(*args, fillvalue=fillvalue))
def flatten(lst):
return sum(([x] if not isinstance(x, list) else flatten(x) for x in lst), [])
def pnm_to_bin(p):
w,h = map(int,p[1].split(' '))
data = map(int, ' '.join(p[3:]).replace('\n', ' ').split())
bin = []
lines = grouper(data, w*3)
for line in lines:
data = []
for rgb in grouper(line, 3):
data.append(list(rgb))
bin.append(data)
return bin
def bin_to_pnm(b):
pnm = 'P3 {} {} 255 '.format(len(b[0]), len(b))
b = flatten(b)
pnm += ' '.join(map(str, b))
return pnm
def imageblender(img):
h = len(img)
w = len(img[0])
for y in range(w):
for x in range(h):
for i in range(3):
val = (img[x][y][i] + img[x][~y][i] + img[~x][y][i] + img[~x][~y][i])//4
img[x][y][i],img[x][~y][i],img[~x][y][i],img[~x][~y][i] = (val,)*4
return img
def main(fname):
bin = pnm_to_bin(open(fname).read().split('\n'))
bin = imageblender(bin)
return bin_to_pnm(bin)
if __name__ == '__main__':
print main(sys.argv[1])
Эта программа принимает одно имя файла в качестве входных данных, форматируется как выходные данные pngtopnm <pngfile> -plain
и выводит одну строку данных PPM, разделенных пробелами.
Краткое описание формата P3
Открытый текстовый файл PPM pngtopnm <pngfile> -plain
будет выглядеть так:
P3
<width in pixels> <height in pixels>
<maximum value as defined by the bit depth, always 255 for our purposes>
<leftmost 24 pixels of row 1, in RGB triples, space-separated; like (0 0 0 1 1 1 ...)>
<next 24 pixels of row 1>
<...>
<rightmost (up to) 24 pixels of row 1>
<leftmost 24 pixels of row 2>
<next 24 pixels of row 2>
<...>
<rightmost (up to) 24 pixels of row 2>
<...>
Это формат, используемый в примерах файлов ввода и вывода. Однако PNM очень плохо разбирается в своем форматировании - любой пробел может разделять значения. Вы можете заменить все символы новой строки в приведенном выше файле на один пробел, и при этом иметь действительный файл. Например, этот файл и этот файл являются действительными и представляют одно и то же изображение. Единственными другими требованиями являются то, что файл должен заканчиваться завершающим символом новой строки, и после него должны быть width*height
тройки RGB 255
.
правила
- Это код-гольф , поэтому выигрывает самое короткое из возможных решений.
- Вы можете вводить и выводить данные PPM, отформатированные любым удобным и согласованным способом, при условии, что они действительны в соответствии с форматом PPM, описанным выше. Единственным исключением является то, что вы должны использовать простой (P3) формат, а не двоичный (P6) формат.
- Вы должны убедиться, что ваше решение выводит правильные изображения для указанных тестовых изображений.
- Все изображения будут иметь битовую глубину 8 бит.
Дополнительное чтение: страница википедии в формате Netpbm
Ответы:
Pyth,
3029 байтМоя программа ожидает все метаданные в первой строке, а данные изображения построчно в строках после ввода в stdin. Чтобы помочь, это небольшая программа на Python для преобразования любого действительного файла PPM в файл PPM, который моя программа может понять:
Если у вас есть данные изображения строка за строкой, операции действительно просты. Сначала я считываю данные изображения в список списков целых чисел (
JrR7.z
), затем создаю версию с горизонтальным зеркальным отображением, группируя каждые 3 целых числа и обращая их в обратном порядке для каждой строки (Km_cd3J
). Тогда версии с вертикальным зеркальным отображением просты_J_K
, так как мы можем просто перевернуть строки.Я беру все эти матрицы, объединяю каждую из них в одномерный массив с помощью
.nM
, транспонирую с,C
чтобы получить список списков каждого из компонентов пикселя, усредняю и усекаю до int каждого из этих списков (ms.Od
), и, наконец, печатаю, присоединяя новые строкиj
.Обратите внимание, что моя программа генерирует вывод в другом формате (но все еще действительный PPM). Демо-изображения можно посмотреть в этом альбоме imgur .
источник
Bash (+ ImageMagick), 64 + 1 = 65 байт
Правильный инструмент для работы.
Должен выполняться в каталоге, содержащем один файл
a
, содержащий данные PPM для преобразования. Поскольку это имя файла является значительным, я добавил один байт к числу байтов.Вывод миниатюр PNG (не уверен, почему это необходимо, потому что они все равно одинаковы, но вопрос так говорит, так что ...):
Спасибо nneonneo за сохранение 2 байта!
источник
-flop
, я очень хочу удивляться, что это флаг.C=convert
и$C
вместоalias
.Matlab,
1068280 байтИзображение загружается в виде
n*m*3
матрицы. Затем мы переворачиваем матрицу и добавляем к себе обе оси и снова записываем ее в файл.Я не смог найти место для загрузки таких текстовых файлов, поэтому вот версии PNG:
источник
<img
теги!Mathematica,
8684 байтаСпасибо DavidC за совет. (сохраняет 2 байта)
Первый и второй параметры являются путями к входному и выходному изображениям соответственно.
Контрольные примеры
Результат
(PNG-версии изображений загружены ниже)
источник
Join[#,(r=Reverse)/@#]
Юлия, 157 байт
Это лямбда-функция, которая принимает строку, содержащую полный путь к файлу PPM, и перезаписывает ее преобразованным изображением. Чтобы вызвать его, присвойте его переменной.
Ungolfed:
Пример выходов:
источник
питон 2 + PIL, 268
Теперь я широко использую PIL, используя переворачивание изображения и альфа-смешение
Результирующие изображения доступны здесь
источник