Smussa le immagini


15

introduzione

I bordi taglienti sono, francamente, semplicemente pericolosi, quindi, dato un PNG come input, sfocare l'immagine usando il metodo descritto di seguito e smussare quei dannati bordi taglienti.

Metodo

Per ottenere il valore RGB di ciascun pixel, utilizzare le tre equazioni seguenti:

R=1.5×Σun'=1nRun'2n
sol=1.5×Σun'=1nsolun'2n
B=1.5×Σun'=1nBun'2n

Dove Σun'=1nRun'2 è la somma dei valori rossi di ciascuno dei pixel adiacenti al quadrato. Il valore di n è il numero di pixel adiacenti (ad esempio, un pixel d'angolo avrà un valore n di 3, mentre un pixel attorno al centro dell'immagine avrà un valore n di 8).

Un pixel adiacente è un pixel a 1 pixel di distanza dal pixel originale in tutte le direzioni (sinistra, destra, su, giù e su tutte le diagonali).

Ad esempio, nella seguente immagine 3 x 1:

Il valore RGB sfocato del pixel centrale sarà:

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

dove le uscite decimali sono arrotondate all'unità più vicina. Non dovresti semplicemente esprimere il risultato.

Pertanto, il pixel centrale sarà il colore (0, 221, 221) o:

Risultato nell'immagine:

Dovresti ripetere questo processo per ogni pixel dell'immagine. (Nota che lo fai con i pixel originali e non con i pixel modificati. Fondamentalmente, non dovresti sovrascrivere l'immagine originale e tenerla completamente separata dalla nuova immagine sfocata ).

Se calcoli che qualsiasi valore sia maggiore di 255, supponi che il suo valore sia 255 (vale a dire, un valore di 374 verrebbe impostato su 255).

L'output risultante dovrebbe essere un'immagine PNG separata (puoi nominarla come preferisci).

Esempi

Super Mario

Originale:

Sfocato:

Scacchiera

Originale:

Sfocato:

Patatine

Originale

Sfocato

Non più così nitido

gotico americano

Originale:

Sfocato:

Per vedere la sfocatura su immagini più grandi, è meglio eseguire nuovamente il programma sull'immagine sfocata:

Sfida

Vince il codice più corto per sfocare una determinata immagine PNG.

Puoi utilizzare le librerie di elaborazione delle immagini (come PIL) ma non devi usare le funzioni di sfocatura incorporate (Mathematica, ti sto guardando).

Nota

Come dice @orlp di seguito:

Per la cronaca, (per quanto ne so) questo non è un metodo di sfocatura standard. Questa sfida non è una risorsa educativa.


Non sono davvero contento di quel ridimensionamento. ndovrebbe apparire nel denominatore.
Karl Napf,

Ho pensato a qualcosa di molto diverso quando ho visto "Blunt": P.
Adnan,

3
Per la cronaca, (per quanto ne so) questo non è un metodo di sfocatura standard. Questa sfida non è una risorsa educativa.
orlp

Se avessi un pixel bianco circondato da 8 pixel bianchi (tutti rgb (255.255.255)), il pixel sfocato sarebbe rgb (312.312.312). Dobbiamo solo bloccare i valori nell'intervallo [0,255]?
kamoroso94,

1
@ kamoroso94 1: Sì, supponiamo che qualsiasi numero maggiore di 255 sia 255. 2: L'immagine di esempio dovrebbe rappresentare un'immagine 3 x 1.
Decadimento beta

Risposte:


5

Python, 354 313 byte

Non il migliore, ma ehi ...

Usando Spazio per rientro di 1 ° livello, Tab per 2 ° livello, quindi Tab + Spazio e 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: sostituzione math.sqrt()con ()**.5grazie al decadimento beta
  • Edit2: utilizzando minper il serraggio (risparmiando un sacco!) E 0per passgrazie al Loovjo
  • Edit3: +=[]per .append()salvare 5 byte
  • Edit4: usando la variabile sper lo stencil

1
Sicuramente n**0.5è più corto di import math;math.sqrt(n)? C'è un motivo per quest'ultimo?
Decadimento beta

Sì lo è, no non c'è motivo. Ho appena dimenticato.
Karl Napf,

2
v if v<256 else 255può essere abbreviato inmin(v,255)
Loovjo

Puoi anche sostituire passcon0
Loovjo

Devi indicare quale libreria di immagini stai utilizzando. Se stai usando PIL / Pillow (e sembra che tu sia), dovrebbe leggere la dichiarazione di importazione in alto from PIL import Image as I.
Mego

0

MATLAB, 130 byte

Prende un'immagine come input e salva l'output come 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')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.