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


15

Вступ

Гострі краї, чесно кажучи, просто небезпечні, тому, даючи PNG як вхід, розмийте зображення, використовуючи описаний нижче метод, і затупіть ці прокляті гострі краї.

Метод

Щоб отримати значення RGB кожного пікселя, використовуйте наступні три рівняння:

R=1.5×а=1нRа2н
Г=1.5×а=1нГа2н
Б=1.5×а=1нБа2н

Де а=1нRа2 - сума червоних значень кожного з сусідніх пікселів у квадраті. Значення н - кількість сусідніх пікселів (наприклад, кутовий піксель матиме н значення 3, тоді як піксель навколо центру зображення матиме н значення 8).

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

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

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

R=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 для другого рівня, потім Tab + пробіл та 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.