Tępe obrazy


15

Wprowadzenie

Ostre krawędzie są, szczerze mówiąc, po prostu niebezpieczne, więc biorąc pod uwagę PNG jako wejście, rozmyj obraz przy użyciu metody opisanej poniżej i stęp te przeklęte ostre krawędzie.

metoda

Aby uzyskać wartość RGB każdego piksela, użyj następujących trzech równań:

R=1.5×za=1nRza2)n
sol=1.5×za=1nsolza2)n
b=1.5×za=1nbza2)n

Gdzie to suma czerwonych wartości każdego z sąsiednich pikseli do kwadratu. Wartość jest liczbą sąsiednich pikseli (np. Piksel narożny będzie miał wartość 3, podczas gdy piksel wokół środka obrazu będzie miał wartość 8).za=1nRza2)nnn

Piksel sąsiadujący to piksel oddalony od oryginalnego piksela o 1 piksel we wszystkich kierunkach (w lewo, w prawo, w górę, w dół i na wszystkich przekątnych).

Na przykład na poniższym obrazie 3 x 1:

Zamazana wartość RGB środkowego piksela będzie wynosić:

R=1.5(02)+02))2)=0
sol=1.5(02)+2552))2)=220,836=221
b=1.5(2552)+02))2)=220,836=221

gdzie wszelkie dane dziesiętne są zaokrąglane do najbliższej jednostki. Nie powinieneś po prostu ogłaszać wyniku.

Dlatego środkowy piksel będzie kolorem (0, 221, 221) lub:

Wynikające z obrazu:

Powtórz ten proces dla każdego piksela na obrazie. (Pamiętaj, że robisz to z oryginalnymi pikselami, a nie ze zmodyfikowanymi pikselami. Zasadniczo nie powinieneś nadpisywać oryginalnego obrazu i powinien on być całkowicie oddzielony od nowego, zamazanego obrazu ).

Jeśli obliczysz, że jakieś wartości są większe niż 255, przyjmij, że jego wartość to 255 (tj. Wartość 374 zostanie ustawiona na 255).

Wynikowy wynik powinien być osobnym obrazem PNG (możesz nazwać to, co chcesz).

Przykłady

Super Mario

Oryginalny:

Zamazany:

Szachownica

Oryginalny:

Zamazany:

Chipsy

Oryginalny

Zamazany

Już nie tak ostro

amerykański gotyk

Oryginalny:

Zamazany:

Aby zobaczyć rozmycie na większych obrazach, najlepiej uruchomić program ponownie na zamazanym obrazie:

Wyzwanie

Wygrywa najkrótszy kod do rozmycia danego obrazu PNG.

Możesz używać bibliotek przetwarzania obrazu (takich jak PIL), ale nie wolno używać wbudowanych funkcji rozmycia (Mathematica, patrzę na ciebie).

Uwaga

Jak mówi @orlp poniżej:

Dla przypomnienia (o ile mi wiadomo) nie jest to standardowa metoda rozmycia. To wyzwanie nie jest zasobem edukacyjnym.


Nie jestem zadowolony z tego skalowania. npowinien pojawić się w mianowniku.
Karl Napf

Pomyślałem o czymś zupełnie innym, kiedy zobaczyłem „Blunt”: P.
Adnan

3
Dla przypomnienia (o ile mi wiadomo) nie jest to standardowa metoda rozmycia. To wyzwanie nie jest zasobem edukacyjnym.
lub

Jeśli miałbyś biały piksel otoczony 8 białymi pikselami (wszystkie rgb (255,255,255)), zamazany piksel miałby rgb (312,312,312). Czy mamy po prostu ograniczyć wartości do zakresu [0,255]?
kamoroso94,

1
@ kamoroso94 1: Tak, załóżmy, że dowolna liczba większa niż 255 to 255. 2: Przykładowy obraz ma reprezentować obraz 3 x 1.
Rozpad

Odpowiedzi:


5

Python, 354 313 bajtów

Nie najlepszy, ale hej ...

Używanie spacji dla wcięcia 1. poziomu, Tab dla 2. poziomu, a następnie Tab + Spacja i 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: zastąpienie math.sqrt()ze ()**.5dzięki rozpadu beta
  • Edit2: używając mindo mocowania (oszczędzając dużo!) I 0dla passdzięki Loovjo
  • Edycja3: +=[]do .append()zapisania 5 bajtów
  • Edycja4: użycie zmiennej sdla szablonu

1
Z pewnością n**0.5jest krótszy niż import math;math.sqrt(n)? Czy istnieje powód tego drugiego?
Rozpad

Tak, nie, nie ma powodu. Właśnie zapomniałem.
Karl Napf,

2
v if v<256 else 255można skrócić domin(v,255)
Loovjo

Można również wymienić passz0
Loovjo

Musisz określić, której biblioteki obrazów używasz. Jeśli używasz PIL / Pillow (i wygląda na to, że jesteś), należy przeczytać górną instrukcję importu from PIL import Image as I.
Mego

0

MATLAB, 130 bajtów

Pobiera obraz jako dane wejściowe i zapisuje dane wyjściowe jako 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')
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.