Émousser les images


15

introduction

Franchement, les bords tranchants sont tout simplement dangereux, donc, étant donné un PNG en entrée, brouillez l'image en utilisant la méthode décrite ci-dessous et émoussez ces maudits bords tranchants.

Méthode

Pour obtenir la valeur RVB de chaque pixel, utilisez les trois équations suivantes:

R=1,5×une=1nRune2n
g=1,5×une=1ngune2n
B=1,5×une=1nBune2n

une=1nRune2 est la somme des valeurs rouges de chacun des pixels adjacents au carré. La valeur de n est le nombre de pixels adjacents (par exemple, un pixel d'angle aura une valeur n de 3, tandis qu'un pixel autour du centre de l'image aura un n valeur de 8).

Un pixel adjacent est un pixel qui est à 1 pixel du pixel d'origine dans toutes les directions (gauche, droite, haut, bas et sur toutes les diagonales).

Par exemple, dans l'image 3 x 1 suivante:

La valeur RVB floue du pixel central sera:

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

où toutes les sorties décimales sont arrondies à l'unité la plus proche. Vous ne devez pas simplement étayer le résultat.

Par conséquent, le pixel du milieu sera la couleur (0, 221, 221), ou:

Résultat dans l'image:

Vous devez répéter ce processus pour chaque pixel de l'image. (Notez que vous faites cela avec les pixels d'origine et non les pixels modifiés. Fondamentalement, vous ne devez pas écraser l'image d'origine et la garder complètement séparée de la nouvelle image floue ).

Si vous calculez des valeurs supérieures à 255, supposez que sa valeur est 255 (c'est-à-dire qu'une valeur de 374 serait définie sur 255).

La sortie résultante doit être une image PNG distincte (vous pouvez la nommer comme vous le souhaitez).

Exemples

Super mario

Original:

Flou:

Damier

Original:

Flou:

Chips

Original

Flou

Plus croustillant

gothique americain

Original:

Flou:

Pour voir le flou sur des images plus grandes, il est préférable d'exécuter à nouveau le programme sur l'image floue:

Défi

Le code le plus court pour flouter une image PNG donnée l'emporte.

Vous pouvez utiliser des bibliothèques de traitement d'image (telles que PIL) mais vous ne devez pas utiliser de fonctions de flou intégrées (Mathematica, je vous regarde).

Remarque

Comme le dit @orlp ci-dessous:

Pour mémoire, (à ma connaissance) ce n'est pas une méthode de flou standard. Ce défi n'est pas une ressource éducative.


Je ne suis pas vraiment satisfait de cette mise à l'échelle. ndevrait apparaître dans le dénominateur.
Karl Napf

J'ai pensé à quelque chose de très différent quand j'ai vu "Blunt": P.
Adnan

3
Pour mémoire, (à ma connaissance) ce n'est pas une méthode de flou standard. Ce défi n'est pas une ressource éducative.
orlp

Si vous aviez un pixel blanc entouré de 8 pixels blancs (tous RVB (255,255,255)), le pixel flou serait RVB (312,312,312). Sommes-nous simplement censés limiter les valeurs dans la plage [0,255]?
kamoroso94

1
@ kamoroso94 1: Oui, supposons que tout nombre supérieur à 255 soit 255. 2: L'exemple d'image est censé représenter une image 3 x 1.
Beta Decay

Réponses:


5

Python, 354 313 octets

Pas le meilleur, mais bon ...

Utiliser Espace pour le retrait de 1er niveau, Tabulation pour 2e niveau, puis Tabulation + Espace et Tabulation + Tabulation

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: remplacement math.sqrt()par()**.5 grâce à la désintégration bêta
  • Edit2: utiliser minpour le serrage (économiser beaucoup!) Et 0pourpass remercier Loovjo
  • Edit3: +=[]pour.append() économiser 5 octets
  • Edit4: utilisation de la variable spour le gabarit

1
Sûrement n**0.5plus court que import math;math.sqrt(n)? Y a-t-il une raison à cela?
Beta Decay

Oui c'est vrai, non il n'y a pas de raison. J'ai juste oublié.
Karl Napf

2
v if v<256 else 255peut être raccourci àmin(v,255)
Loovjo

Vous pouvez également remplacer passpar0
Loovjo

Vous devez indiquer la bibliothèque d'images que vous utilisez. Si vous utilisez PIL / Pillow (et il semble que vous l'êtes), la première déclaration d'importation devrait être lue from PIL import Image as I.
Mego

0

MATLAB, 130 octets

Prend une image comme entrée et enregistre la sortie sous 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')
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.