画像を鈍らせる


15

前書き

鋭いエッジは、率直に言って、単に危険なので、PNGを入力として、以下に説明する方法を使用して画像をぼかし、それらのとがった鋭いエッジを鈍らせます。

方法

各ピクセルのRGB値を取得するには、次の3つの式を使用します。

R=1.5×a=1nRa2n
G=1.5×a=1nGa2n
B=1.5×a=1nBa2n

ここで、a=1nRa2は、隣接する各ピクセルの赤の値の2乗の合計です。nの値は、隣接するピクセルの数です(たとえば、コーナーピクセルのn値は3で、画像の中心付近のピクセルのn値は8です)。

隣接するピクセルとは、すべての方向(左、右、上、下、およびすべての対角線)で元のピクセルから1ピクセル離れたピクセルです。

たとえば、次の3 x 1の画像では:

中央のピクセルのぼやけたRGB値は次のようになります。

R=1.502+022=0
G=1.502+25522=220.836=221
B=1.52552+022=220.836=221

ここで、小数出力は最も近い単位に丸められます。結果を単純にフロアリングしないでください。

したがって、中央のピクセルは色(0、221、221)、または:

画像になります:

画像内のすべてのピクセルに対してこのプロセスを繰り返す必要があります。(変更されたピクセルではなく、元のピクセルでこれを行うことに注意してください。基本的に、元のイメージを上書きしないくださいまた、新しいぼやけたイメージとは完全に分離してください。)

255を超える値を計算する場合、その値が255であると想定します(つまり、374の値は255に設定されます)。

結果の出力は、個別のPNG画像になります(好きな名前を付けることができます)。

スーパーマリオ

元の:

ぼやけた:

チェッカーボード

元の:

ぼやけた:

ポテトチップス

元の

ぼやけた

もうそれほど鮮明ではない

ゴシックアメリカ

元の:

ぼやけた:

大きな画像でぼかしを見るには、ぼかした画像でプログラムを再度実行するのが最善です。

チャレンジ

特定のPNG画像をぼかすための最短コードが優先されます。

画像処理ライブラリ(PILなど)を使用できますが、組み込みのぼかし関数を使用しないでください(Mathematica、私はあなたを見ています)。

注意

@orlpが以下のように言っているように:

記録のために、(私の知る限り)これは標準的なぼかし方法ではありません。この課題は教育資源ではありません。


私はそのスケーリングに本当に満足していません。n分母に表示されるはずです。
カールナップ

「ブラント」を見たとき、私は非常に異なる何かを考えました:P。
アドナン

3
記録のために、(私の知る限り)これは標準的なぼかし方法ではありません。この課題は教育資源ではありません。
orlp

8つの白いピクセル(すべてrgb(255,255,255))で囲まれた白いピクセルがある場合、ぼやけたピクセルはrgb(312,312,312)になります。値を[0,255]の範囲に固定するだけですか?
kamoroso94

1
@ kamoroso94 1:はい、255より大きい数は255であると仮定します。2:サンプル画像は3 x 1の画像を表すことになっています。
ベータ崩壊

回答:


5

Python、354 313バイト

最高ではありませんが、ちょっと...

第1レベルのインデントにスペースを使用し、第2レベルにタブを使用してから、Tab + Spaceおよび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:交換 math.sqrt()()**.5ベータ崩壊のおかげで
  • Edit2:を使用して min(!たくさんの保存)クランプ用と0passLoovjoに感謝
  • 編集3: +=[].append() 5バイトの保存用
  • Edit4:sステンシルに変数を使用する

1
きっとn**0.5よりも短くなっていますかimport math;math.sqrt(n)?後者の理由はありますか?
ベータ崩壊

はい、そうです、理由はありません。忘れた
カールナップ

2
v if v<256 else 255短縮することができますmin(v,255)
Loovjo

また、置き換えることができpass0
Loovjo

使用している画像ライブラリを明記する必要があります。PIL / Pillowを使用している場合(そして、あなたのように見える場合)、一番上のimportステートメントはになりますfrom PIL import Image as I
メゴ

0

MATLAB、130バイト

画像を入力として受け取り、出力をとして保存します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')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.