Притупить изображения


15

Вступление

Острые края, честно говоря, просто опасны, поэтому, учитывая PNG в качестве входных данных, размыть изображение, используя метод, описанный ниже, и притупить эти проклятые острые края.

метод

Чтобы получить значение RGB каждого пикселя, используйте следующие три уравнения:

рзнак равно1,5×Σaзнак равно1Nрa2N
граммзнак равно1,5×Σaзнак равно1Nграммa2N
Взнак равно1,5×Σaзнак равно1NВa2N

Там , где Σaзнак равно1Nрa2 является суммой красных значений каждого из соседних пикселей в квадрате. Значение N - это количество соседних пикселей (например, угловой пиксель будет иметь N значение равное 3, в то время как пиксель вокруг центра изображения будет иметь значение N равное 8).

Смежный пиксель - это пиксель, который находится на расстоянии 1 пиксель от исходного пикселя во всех направлениях (влево, вправо, вверх, вниз и на всех диагоналях).

Например, на следующем изображении 3 x 1:

Размытое значение RGB среднего пикселя будет:

рзнак равно1,5*(02+02)2знак равно0
граммзнак равно1,5*(02+2552)2знак равно220,836знак равно221
Взнак равно1,5*(2552+02)2знак равно220,836знак равно221

где любые десятичные значения округляются до ближайшей единицы. Вы не должны просто указывать результат.

Следовательно, средний пиксель будет цвета (0, 221, 221) или:

В результате на изображении:

Вы должны повторить этот процесс для каждого пикселя в изображении. (Обратите внимание, что вы делаете это с оригинальными пикселями, а не с измененными пикселями. вы не должны перезаписывать исходное изображение и должны полностью отделять его от нового размытого изображения ).

Если вы рассчитываете, что любое значение больше 255, предположите, что его значение равно 255 (т. Е. Значение 374 будет установлено на 255).

Полученный результат должен быть отдельным PNG-изображением (вы можете назвать это как хотите).

Примеры

супер Марио

Оригинал:

Размытый:

шахматная доска

Оригинал:

Размытый:

чипсы

оригинал

Размытый

Уже не такой четкий

американская готика

Оригинал:

Размытый:

Чтобы увидеть размытие на больших изображениях, лучше всего запустить программу на размытом изображении:

Вызов

Самый короткий код для размытия заданного изображения PNG побеждает.

Вы можете использовать библиотеки обработки изображений (например, PIL), но вы не должны использовать встроенные функции размытия (Mathematica, я смотрю на вас).

Заметка

Как говорит @orlp ниже:

Для записи, (насколько мне известно) это не стандартный метод размытия. Эта задача не является образовательным ресурсом.


Я не очень доволен этим масштабированием. nдолжен появиться в знаменателе.
Карл Напф

Я подумал о чем-то совершенно ином, когда увидел «Тупое»: P.
Аднан

3
Для записи, (насколько мне известно) это не стандартный метод размытия. Эта задача не является образовательным ресурсом.
orlp

Если бы у вас был белый пиксель, окруженный 8 белыми пикселями (все rgb (255,255,255)), размытый пиксель был бы rgb (312,312,312). Должны ли мы просто фиксировать значения в диапазоне [0,255]?
kamoroso94

1
@ kamoroso94 1: Да, предположим, что любое число больше 255 равно 255. 2: Предполагается, что пример изображения представляет собой изображение 3 x 1.
бета-распад

Ответы:


5

Python, 354 313 байт

Не самый лучший, но эй ...

Используя пробел для отступа 1-го уровня, Tab для 2-го уровня, затем Tab + Space и Tab + Tab

import Image as I
A=I.open(raw_input())
w,h=A.size
B=I.new('RGB',(w,h))
s=[-1,1,0]
r=range
for x in r(w):
 for y in r(h):
    P=[]
    for d in s:
     for e in s:
        try:P+=[A.load()[x+e,y+d]]
        except:0
    P.pop()
    B.load()[x,y]=tuple(min(int(.5+(1.5*sum([v*v for v in t])/len(P))**.5),255)for t in zip(*P))
B.save("b.jpg")
  • Edit1: замена math.sqrt()с помощью ()**.5бета-распада
  • Edit2: использование minдля зажима (экономя много!) И 0за passспасибо Loovjo
  • Edit3: +=[]для .append()сохранения 5 байтов
  • Edit4: использование переменной sдля трафарета

1
Конечно n**0.5короче import math;math.sqrt(n)? Есть ли причина для последнего?
бета-распад

Да, нет, нет причин. Я просто забыл.
Карл Напф

2
v if v<256 else 255можно сократить доmin(v,255)
Loovjo

Вы также можете заменить passна0
Loovjo

Вам необходимо указать, какую библиотеку изображений вы используете. Если вы используете PIL / Pillow (и похоже, что вы используете), верхний оператор импорта должен читать from PIL import Image as I.
Мего

0

MATLAB, 130 байт

Принимает изображение в качестве входных данных и сохраняет выходные данные как b.png.

i=double(input(''));m=ones(3);m(5)=0;k=@(x)imfilter(x,m);imwrite(uint8(round((1.5*k(double(i.^2))./k(i(:,:,1)*0+1)).^.5)),'b.png')
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.