Künt Görüntüler


15

Giriş

Keskin kenarlar, açıkçası, sadece tehlikeli olduğundan giriş olarak bir PNG verildiğinde, görüntüyü aşağıda açıklanan yöntemi kullanarak bulanıklaştırın ve bu keskin kenarları köreltin.

Yöntem

Her pikselin RGB değerini almak için aşağıdaki üç denklemi kullanın:

R,=1.5xΣbir=1nR,bir2n
G,=1.5xΣbir=1nG,bir2n
B=1.5xΣbir=1nBbir2n

Burada Σbir=1nR,bir2 bitişik piksellerin her birinin kızıl değerlerinin toplamı kare. n değeri, bitişik piksellerin sayısıdır (örneğin, köşe pikselinin 3 değeri n olurken, görüntünün merkezinin çevresindeki bir pikseln 8 değeri).

Bitişik piksel, orijinal pikselden tüm yönlerde (sol, sağ, yukarı, aşağı ve tüm köşegenlerde) 1 piksel uzaklıktaki bir pikseldir.

Örneğin, aşağıdaki 3 x 1 görüntüde:

Orta pikselin bulanık RGB değeri:

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

burada ondalık çıktılar en yakın birime yuvarlanır. Sonucu basitçe katlamamalısınız.

Bu nedenle, orta piksel renk (0, 221, 221) veya:

Resmin sonucu:

Bu işlemi görüntüdeki her piksel için tekrarlamanız gerekir. (Bunu, değiştirilen piksellerle değil, orijinal piksellerle yaptığınızı unutmayın. orijinal görüntünün üzerine yazmamalısınız ve yeni, bulanık görüntüden tamamen ayrı tutmalısınız ).

255'ten büyük herhangi bir değer hesaplarsanız, değerinin 255 olduğunu varsayalım (yani, 374 değeri 255 olarak ayarlanır).

Ortaya çıkan çıktı ayrı bir PNG görüntüsü olmalıdır (bunu istediğiniz gibi adlandırabilirsiniz).

Örnekler

Süper Mario

Orijinal:

Bulanık:

Dama tahtası

Orijinal:

Bulanık:

Cips

orijinal

Bulanık

Artık çok net değil

Gotik amerikan

Orijinal:

Bulanık:

Daha büyük görüntülerde bulanıklığı görmek için programı bulanık görüntüde tekrar çalıştırmak en iyisidir:

Meydan okuma

Belirli bir PNG görüntüsünü bulanıklaştırmak için en kısa kod kazanır.

Görüntü işleme kitaplıklarını (PIL gibi) kullanabilirsiniz, ancak yerleşik bulanıklaştırma işlevlerini (Mathematica, size bakıyorum) kullanmamalısınız.

Not

@Orlp'nin dediği gibi:

Kayıt için, (bildiklerime göre) bu standart bir bulanıklaştırma yöntemi değildir. Bu zorluk bir eğitim kaynağı değildir.


Bu ölçeklemeden gerçekten memnun değilim. npaydada görünmelidir.
Karl Napf

"Künt" i gördüğümde çok farklı bir şey düşündüm: S.
Adnan

3
Kayıt için, (bildiklerime göre) bu standart bir bulanıklaştırma yöntemi değildir. Bu zorluk bir eğitim kaynağı değildir.
orlp

8 beyaz pikselle çevrelenmiş bir beyaz pikseliniz varsa (tümü rgb (255,255,255)), bulanık piksel rgb olur (312,312,312). Sadece değerleri [0,255] aralığına sıkıştırmamız gerekiyor mu?
kamoroso94

1
@ kamoroso94 1: Evet, 255'ten büyük herhangi bir sayının 255 olduğunu varsayalım. 2: Örnek görüntünün 3 x 1 görüntüyü temsil etmesi gerekiyor.
Beta Çürümesi

Yanıtlar:


5

Python, 354 bayt

En iyisi değil, ama hey ...

1. seviye girinti için Boşluk, 2. seviye için Sekme, ardından Sekme + Boşluk ve Sekme + Sekme tuşlarını kullanma

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: değiştirirken math.sqrt()ile()**.5 beta çözünmesi sayesinde
  • Edit2: kullanarak minsıkıştırma için (! Çok tasarruf) ve 0içinpass Loovjo sayesinde
  • Edit3: +=[]için.append() 5 bayt kaydetmek
  • Edit4: sşablon için değişkeni kullanma

1
Kesinlikle n**0.5daha kısadır import math;math.sqrt(n)? İkincisinin bir nedeni var mı?
Beta Çürümesi

Evet, hayır, sebep yok. Sadece unuttum.
Karl Napf

2
v if v<256 else 255kısaltılabilirmin(v,255)
Loovjo

Ayrıca yerini alabilir passile0
Loovjo

Hangi görüntü kitaplığını kullandığınızı belirtmeniz gerekir. PIL / Yastık kullanıyorsanız (ve öyle görünüyorsanız), en üstteki içe aktarma ifadesi okunmalıdır from PIL import Image as I.
Mego

0

MATLAB, 130 bayt

Görüntüyü girdi olarak alır ve çıktıyı olarak kaydeder 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')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.