Blunt the Images


15

Introdução

As arestas vivas são, francamente, muito perigosas, portanto, dado um PNG como entrada, desfoque a imagem usando o método descrito abaixo e atenue essas arestas vivas.

Método

Para obter o valor RGB de cada pixel, use as três equações a seguir:

R=1.5×uma=1nRuma2n
G=1.5×uma=1nGuma2n
B=1.5×uma=1nBuma2n

Onde uma=1nRuma2 , é a soma dos valores de vermelho de cada um dos pixels adjacentes ao quadrado. O valor de n é o número de pixels adjacentes (por exemplo, um pixel de canto terá um valor n de 3, enquanto um pixel ao redor do centro da imagem terá um n valor de 8).

Um pixel adjacente é um pixel que fica a 1 pixel do pixel original em todas as direções (esquerda, direita, cima, baixo e em todas as diagonais).

Por exemplo, na imagem 3 x 1 a seguir:

O valor RGB borrado do pixel do meio será:

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

onde quaisquer saídas decimais são arredondadas para a unidade mais próxima. Você não deve simplesmente colocar o resultado no chão.

Portanto, o pixel do meio terá a cor (0, 221, 221) ou:

Resultando na imagem:

Você deve repetir esse processo para cada pixel da imagem. (Observe que você faz isso com os pixels originais e não com os pixels modificados. Basicamente, não deve sobrescrever a imagem original e deve mantê-la completamente separada da nova imagem borrada ).

Se você calcular quaisquer valores maiores que 255, suponha que seu valor seja 255 (ou seja, um valor de 374 seria definido como 255).

A saída resultante deve ser uma imagem PNG separada (você pode nomear isso como desejar).

Exemplos

Super Mario

Original:

Borrado:

Tabuleiro de damas

Original:

Borrado:

Batatas fritas

Original

Borrado

Não é mais tão nítido

gótico americano

Original:

Borrado:

Para ver o desfoque em imagens maiores, é melhor executar o programa novamente na imagem desfocada:

Desafio

O código mais curto para desfocar uma determinada imagem PNG vence.

Você pode usar bibliotecas de processamento de imagens (como PIL), mas não deve usar funções de desfoque internas (Mathematica, estou olhando para você).

Nota

Como @orlp diz abaixo:

Para o registro, (que eu saiba), esse não é um método de desfoque padrão. Este desafio não é um recurso educacional.


Não estou muito feliz com essa escala. ndeve aparecer no denominador.
precisa saber é o seguinte

Pensei em algo muito diferente quando vi "Blunt": p.
Adnan

3
Para o registro, (que eu saiba), esse não é um método de desfoque padrão. Este desafio não é um recurso educacional.
orlp

Se você tivesse um pixel branco cercado por 8 pixels brancos (todos rgb (255.255.255)), o pixel desfocado seria rgb (312.312.312). Devemos apenas fixar os valores no intervalo [0,255]?
kamoroso94

1
@ kamoroso94 1: Sim, suponha que qualquer número maior que 255 seja 255. 2: A imagem de exemplo deve representar uma imagem 3 x 1.
Beta Decay

Respostas:


5

Pitão, 354 313 bytes

Não é o melhor, mas ei ...

Usando Espaço para recuo no 1º nível, Tab para 2º nível, depois Tab + Espaço 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: substituindo math.sqrt()por()**.5 graças ao decaimento beta
  • Edit2: usando minpara fixação (economizando muito!) E 0parapass agradecimentos a Loovjo
  • Edit3: +=[]para.append() salvar 5 bytes
  • Edit4: usando a variável spara o estêncil

1
Certamente n**0.5é mais curto que import math;math.sqrt(n)? Existe uma razão para o último?
Beta Decay

Sim, é, não, não há razão. Eu apenas esqueci.
Karl Napf

2
v if v<256 else 255pode ser reduzido paramin(v,255)
Loovjo

Você também pode substituir passpor0
Loovjo 14/08

Você precisa indicar qual biblioteca de imagens você está usando. Se você estiver usando PIL / Pillow (e parece que você está), a declaração de importação principal deve ser lida from PIL import Image as I.
Mego

0

MATLAB, 130 bytes

Tira uma imagem como entrada e salva a saída como 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')
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.