ทื่อรูปภาพ


15

บทนำ

ขอบที่คมชัดตรงไปตรงมาก็แค่อันตรายธรรมดา ๆ ซึ่งกำหนดให้ PNG เป็นอินพุททำให้ภาพเบลอโดยใช้วิธีการที่อธิบายไว้ด้านล่างและทื่อขอบคมที่สาปแช่งเหล่านั้น

วิธี

ในการรับค่า RGB ของแต่ละพิกเซลให้ใช้สมการสามข้อต่อไปนี้:

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

โดยที่Σa=1nRa2คือผลรวมของค่าสีแดงของแต่ละพิกเซลที่อยู่ติดกันยกกำลังสอง ค่าของnคือจำนวนของพิกเซลที่อยู่ติดกัน (เช่นพิกเซลมุมจะมีค่าnเป็น3 ในขณะที่พิกเซลรอบจุดศูนย์กลางของภาพจะมีค่าn 8)

พิกเซลที่อยู่ติดกันคือพิกเซลซึ่งอยู่ห่างจากพิกเซลดั้งเดิม 1 พิกเซลในทุกทิศทาง (ซ้าย, ขวา, ขึ้น, ลงและบนทุกเส้นทแยงมุม)

ตัวอย่างเช่นในรูปภาพ 3 x 1 ต่อไปนี้:

ค่า RGB เบลอของพิกเซลกลางจะเป็นดังนี้:

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

โดยที่ทศนิยมใด ๆ ถูกปัดเศษเป็นหน่วยที่ใกล้ที่สุด คุณไม่ควรเพียงวางผลลัพธ์

ดังนั้นพิกเซลกลางจะเป็นสี (0, 221, 221) หรือ:

ส่งผลให้ภาพ:

คุณควรทำขั้นตอนนี้ซ้ำสำหรับทุกพิกเซลในภาพ (โปรดทราบว่าคุณทำเช่นนี้ด้วยพิกเซลดั้งเดิมไม่ใช่พิกเซลที่แก้ไขแล้วโดยทั่วไปคุณไม่ควรเขียนทับภาพต้นฉบับและควรแยกมันออกจากรูปภาพใหม่ที่เบลออย่างสมบูรณ์โดยสิ้นเชิง )

หากคุณคำนวณค่าใด ๆ ที่จะมากกว่า 255 สมมติว่าค่าของมันคือ 255 (Ie ค่า 374 จะถูกตั้งค่าเป็น 255)

ผลลัพธ์ที่ได้ควรเป็นภาพ PNG แยกต่างหาก (คุณอาจตั้งชื่อสิ่งนี้ตามที่คุณต้องการ)

ตัวอย่าง

ซูเปอร์มาริโอ

เดิม:

เบลอ:

กระดานหมากรุก

เดิม:

เบลอ:

มันฝรั่งทอดกรอบ

เป็นต้นฉบับ

เบลอ

ไม่กรอบอีกต่อไป

โกธิคอเมริกัน

เดิม:

เบลอ:

หากต้องการดูภาพเบลอในภาพขนาดใหญ่ขอแนะนำให้รันโปรแกรมอีกครั้งบนภาพเบลอ:

ท้าทาย

รหัสที่สั้นที่สุดในการทำให้ภาพ PNG ที่ได้มานั้นพร่ามัว

คุณสามารถใช้ไลบรารีการประมวลผลภาพ (เช่น PIL) แต่คุณต้องไม่ใช้ฟังก์ชั่นการเบลอในตัว (Mathematica ฉันกำลังมองคุณอยู่)

บันทึก

ดังที่ @ orlp กล่าวไว้ด้านล่าง:

สำหรับบันทึก (ความรู้ของฉัน) นี่ไม่ใช่วิธีการเบลอมาตรฐาน ความท้าทายนี้ไม่ใช่ทรัพยากรทางการศึกษา


ฉันไม่ได้มีความสุขกับการปรับขนาดนั้น nควรปรากฏในตัวส่วน
Karl Napf

ฉันคิดถึงบางสิ่งที่แตกต่างอย่างมากเมื่อฉันเห็น "บลันท์": พี
Adnan

3
สำหรับบันทึก (ความรู้ของฉัน) นี่ไม่ใช่วิธีการเบลอมาตรฐาน ความท้าทายนี้ไม่ใช่ทรัพยากรทางการศึกษา
orlp

หากคุณมีพิกเซลสีขาวล้อมรอบด้วยพิกเซลสีขาว 8 พิกเซล (rgb ทั้งหมด (255,255,255)) พิกเซลเบลอจะเป็น rgb (312,312,312) เราควรจะยึดค่าเข้าไปในช่วง [0,255] หรือไม่?
kamoroso94

1
@ kamoroso94 1: ใช่สมมติว่าตัวเลขใด ๆ ที่มากกว่า 255 คือ 255 2: ภาพตัวอย่างควรจะเป็นตัวแทนของรูปภาพ 3 x 1
สลายตัวเบต้า

คำตอบ:


5

งูหลาม 354 313 ไบต์

ไม่ใช่สิ่งที่ดีที่สุด แต่เฮ้ ...

ใช้ Space สำหรับการเยื้องระดับ 1, Tab สำหรับระดับที่ 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สำหรับหนีบ (ประหยัดมาก!) และ0สำหรับpassขอบคุณที่ Loovjo
  • Edit3: +=[]สำหรับ.append()การบันทึก 5 ไบต์
  • Edit4: ใช้ตัวแปรsสำหรับ stencil

1
n**0.5สั้นกว่าแน่นอนimport math;math.sqrt(n)ใช่ไหม มีเหตุผลสำหรับหลังหรือไม่
สลายตัวเบต้า

ใช่มันคือไม่มีเหตุผล ฉันแค่ลืม
Karl Napf

2
v if v<256 else 255สามารถย่อให้เหลือmin(v,255)
Loovjo

คุณสามารถแทนที่passด้วย0
Loovjo

คุณต้องระบุว่าไลบรารีภาพใดที่คุณใช้อยู่ หากคุณกำลังใช้ PIL / หมอน (และดูเหมือนว่าคุณมี) from PIL import Image as Iคำสั่งนำเข้าด้านบนควรอ่าน
Mego

0

MATLAB, 130 ไบต์

นำภาพที่เป็น input 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.