Stumpfe die Bilder

15

Einführung

Scharfe Kanten sind, ehrlich gesagt, einfach gefährlich. Wenn Sie ein PNG als Eingabe verwenden, können Sie das Bild mit der unten beschriebenen Methode verwischen und die verdammten scharfen Kanten stumpf machen.

Methode

Verwenden Sie die folgenden drei Gleichungen, um den RGB-Wert jedes Pixels zu ermitteln:

R=1.5×ein=1nRein2n
G=1.5×ein=1nGein2n
B=1.5×ein=1nBein2n

Wobei die Summe der jedes der benachbarten quadrierten Pixel ist. Der Wert von ist die Anzahl benachbarter Pixel (z. B. hat ein Eckpixel einen Wert von 3, während ein Pixel um die Bildmitte einen Wert von 8 hat).ein=1nRein2nnn

Ein benachbartes Pixel ist ein Pixel, das in alle Richtungen (links, rechts, oben, unten und auf allen Diagonalen) 1 Pixel vom ursprünglichen Pixel entfernt ist.

Zum Beispiel im folgenden 3 x 1-Bild:

Der unscharfe RGB-Wert des mittleren Pixels ist:

R=1.5(02+02)2=0
G=1.5(02+2552)2=220.836=221
B=1.5(2552+02)2=220.836=221

Dabei werden Dezimalausgaben auf die nächste Einheit gerundet. Sie sollten das Ergebnis nicht einfach verraten.

Daher hat das mittlere Pixel die Farbe (0, 221, 221) oder:

Ergebnis im Bild:

Sie sollten diesen Vorgang für jedes Pixel im Bild wiederholen. (Beachten Sie, dass Sie dies mit den Originalpixeln und nicht mit den geänderten Pixeln tun. Grundsätzlich sollten Sie das Originalbild nicht überschreiben und es vollständig von dem neuen, unscharfen Bild trennen .)

Wenn Sie Werte berechnen, die größer als 255 sind, nehmen Sie an, dass der Wert 255 ist (dh, ein Wert von 374 würde auf 255 gesetzt).

Die resultierende Ausgabe sollte ein separates PNG-Bild sein (Sie können dies beliebig benennen).

Beispiele

Super Mario

Original:

Verschwommen:

Schachbrett

Original:

Verschwommen:

Kartoffelchips

Original

Verschwommen

Nicht mehr so ​​knusprig

Amerikanische Gotik

Original:

Verschwommen:

Um die Unschärfe auf größeren Bildern zu sehen, führen Sie das Programm am besten erneut auf dem unscharfen Bild aus:

Herausforderung

Der kürzeste Code, um ein bestimmtes PNG-Bild zu verwischen, gewinnt.

Sie können Bildverarbeitungsbibliotheken (wie PIL) verwenden, aber Sie dürfen keine integrierten Unschärfefunktionen verwenden (Mathematica, ich sehe Sie an).

Hinweis

Wie @orlp unten sagt:

Für die Aufzeichnung ist dies (meines Wissens) keine Standard-Unschärfemethode. Diese Herausforderung ist keine Bildungsressource.

Beta-Zerfall
quelle
Ich bin mit dieser Skalierung nicht wirklich zufrieden. nsollte im Nenner erscheinen.
Karl Napf
Ich dachte an etwas ganz anderes, als ich "Blunt" sah: P.
Adnan
3
Meines Wissens nach handelt es sich hierbei nicht um eine Standardmethode zum Weichzeichnen. Diese Herausforderung ist keine Bildungsressource.
Orlp
Wenn Sie ein weißes Pixel von 8 weißen Pixeln umgeben hätten (alle RGB (255,255,255)), wäre das unscharfe Pixel RGB (312,312,312). Sollen wir nur Werte in den Bereich [0,255] klemmen?
Kamoroso94
1
@ kamoroso94 1: Ja, es wird davon ausgegangen, dass eine beliebige Zahl größer als 255 255 ist. 2: Das Beispielbild soll ein 3 x 1-Bild darstellen.
Beta Decay

Antworten:

5

Python, 354 313 Bytes

Nicht das beste, aber hey ...

Verwenden von Leerzeichen für Einrückungen der ersten Ebene, Tab für die zweite Ebene, dann Tab + Leerzeichen und 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: Ersetzen math.sqrt()durch ()**.5dank Beta-Zerfall
  • Edit2: Verwendung minzum Spannen (Einsparung viel!) Und 0für passdank Loovjo
  • Edit3: +=[]zum .append()Speichern von 5 Bytes
  • Edit4: Verwenden Sie die Variable sfür die Schablone
Karl Napf
quelle
1
Ist n**0.5doch kürzer als import math;math.sqrt(n)? Gibt es einen Grund für Letzteres?
Beta Decay
Ja, nein, es gibt keinen Grund. Ich habe es einfach vergessen.
Karl Napf
2
v if v<256 else 255kann verkürzt werden aufmin(v,255)
Loovjo
Sie können auch passmit0
Loovjo
Sie müssen angeben, welche Bildbibliothek Sie verwenden. Wenn Sie PIL / Pillow verwenden (und es sieht so aus, als wären Sie es), sollte die oberste Importanweisung lauten from PIL import Image as I.
Mego
0

MATLAB, 130 Bytes

Nimmt ein Bild als Eingabe und speichert die Ausgabe als 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')
fehlerhaft
quelle