Làm cùn hình ảnh


15

Giới thiệu

Các cạnh sắc nét, thật ra, chỉ đơn giản là nguy hiểm, do đó, đưa ra một PNG làm đầu vào, làm mờ hình ảnh bằng phương pháp được mô tả dưới đây và làm cùn các cạnh sắc nhọn đáng nguyền rủa đó.

phương pháp

Để lấy giá trị RGB của từng pixel, hãy sử dụng ba phương trình sau:

R= =1,5×Σmột= =1nRmột2n
G= =1,5×Σmột= =1nGmột2n
B= =1,5×Σmột= =1nBmột2n

Trong đó Σmột= =1nRmột2 là tổng các giá trị màu đỏ của mỗi pixel liền kề bình phương. Giá trị của n là số pixel liền kề (ví dụ: pixel góc sẽ có giá trị n là 3, trong khi pixel quanh tâm ảnh sẽ có giá trị n là 8).

Một pixel liền kề là một pixel cách pixel gốc 1 pixel theo mọi hướng (trái, phải, lên, xuống và trên tất cả các đường chéo).

Ví dụ: trong hình ảnh 3 x 1 sau đây:

Giá trị RGB mờ của pixel giữa sẽ là:

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

trong đó bất kỳ đầu ra thập phân nào được làm tròn đến đơn vị gần nhất. Bạn không nên đơn giản sàn kết quả.

Do đó, pixel giữa sẽ là màu (0, 221, 221) hoặc:

Kết quả trong hình ảnh:

Bạn nên lặp lại quá trình này cho mọi pixel trong ảnh. (Lưu ý rằng bạn thực hiện việc này với các pixel gốc chứ không phải các pixel đã sửa đổi. Về cơ bản, bạn không nên ghi đè lên ảnh gốc và nên tách biệt hoàn toàn với ảnh mới, mờ ).

Nếu bạn tính toán bất kỳ giá trị nào lớn hơn 255, giả sử rằng giá trị của nó là 255 (Tức là, giá trị 374 sẽ được đặt thành 255).

Đầu ra kết quả phải là một hình ảnh PNG riêng biệt (bạn có thể đặt tên này là bất cứ điều gì bạn muốn).

Ví dụ

Siêu Mario

Nguyên:

Bị mờ:

Bàn cờ

Nguyên:

Bị mờ:

Khủng hoảng

Nguyên

Bị mờ

Không còn giòn nữa

Mỹ gothic

Nguyên:

Bị mờ:

Để xem mờ trên hình ảnh lớn hơn, tốt nhất là chạy lại chương trình trên hình ảnh mờ:

Thử thách

Mã ngắn nhất để làm mờ hình ảnh PNG nhất định sẽ thắng.

Bạn có thể sử dụng các thư viện xử lý hình ảnh (như PIL) nhưng bạn không được sử dụng các chức năng làm mờ tích hợp (Mathicala, tôi đang nhìn bạn).

Ghi chú

Như @orlp nói dưới đây:

Đối với hồ sơ, (theo hiểu biết của tôi) đây không phải là một phương pháp làm mờ tiêu chuẩn. Thách thức này không phải là một tài nguyên giáo dục.


Tôi không thực sự hài lòng với quy mô đó. nnên xuất hiện trong mẫu số.
Karl Napf

Tôi đã nghĩ về một cái gì đó rất khác khi tôi thấy "Blunt": P.
Adnan

3
Đối với hồ sơ, (theo hiểu biết của tôi) đây không phải là một phương pháp làm mờ tiêu chuẩn. Thách thức này không phải là một tài nguyên giáo dục.
orlp

Nếu bạn có một pixel trắng được bao quanh bởi 8 pixel trắng (tất cả rgb (255,255,255)), pixel bị mờ sẽ là rgb (312.312.312). Có phải chúng ta chỉ cần kẹp các giá trị vào phạm vi [0,255]?
kamoroso94

1
@ kamoroso94 1: Có, giả sử bất kỳ số nào lớn hơn 255 là 255. 2: Hình ảnh ví dụ được cho là đại diện cho hình ảnh 3 x 1.
Beta Decay

Câu trả lời:


5

Python, 354 313 byte

Không phải là tốt nhất, nhưng hey ...

Sử dụng Space cho thụt cấp 1, Tab cho cấp 2, sau đó Tab + Space và 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")
  • Chỉnh sửa1: thay thế math.sqrt() bằng ()**.5nhờ phân rã beta
  • Chỉnh sửa2: sử dụng min cho kẹp (tiết kiệm rất nhiều!) Và 0cho passnhờ Loovjo
  • Chỉnh sửa 3: +=[] để .append()lưu 5 byte
  • Edit4: sử dụng biến scho stprint

1
Chắc chắn n**0.5là ngắn hơn import math;math.sqrt(n)? Có một lý do cho sau này?
Beta Decay

Có nó là, không có không có lý do. Tôi vừa mới quên.
Karl Napf

2
v if v<256 else 255có thể rút ngắn thànhmin(v,255)
Loovjo

Bạn cũng có thể thay thế passbằng0
Loovjo

Bạn cần nói rõ thư viện hình ảnh nào bạn đang sử dụng. Nếu bạn đang sử dụng PIL / Gối (và có vẻ như bạn), câu lệnh nhập hàng đầu nên đọc from PIL import Image as I.
Mego

0

MATLAB, 130 byte

Lấy hình ảnh làm đầu vào và lưu đầu ra dưới dạng 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')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.