ให้ภาพขาวดำในรูปแบบ lossless ที่เหมาะสมในรูปแบบอินพุตเอาต์พุต ASCII art ที่ใกล้เคียงกับภาพอินพุตมากที่สุด
กฎระเบียบ
- สามารถใช้ได้เฉพาะไลน์ฟีดและ ASCII ไบต์ 32-127
- ภาพอินพุตจะถูกครอบตัดเพื่อไม่ให้มีพื้นที่ว่างภายนอกล้อมรอบภาพ
- การส่งจะต้องสามารถทำให้คลังข้อมูลคะแนนทั้งหมดสำเร็จภายในเวลาไม่ถึง 5 นาที
- ข้อความดิบเท่านั้นที่ยอมรับได้; ไม่มีรูปแบบ Rich Text
- ตัวอักษรที่ใช้ในการให้คะแนนคือ 20-PT ลินุกซ์ศีลธรรม
- ไฟล์ข้อความออกเมื่อแปลงเป็นภาพตามที่อธิบายไว้ด้านล่างจะต้องมีขนาดเท่ากับภาพที่ป้อนภายใน 30 พิกเซลในมิติใดมิติหนึ่ง
เกณฑ์การให้คะแนน
ภาพเหล่านี้จะถูกใช้เพื่อให้คะแนน:
คุณสามารถดาวน์โหลด zipfile ของภาพได้ที่นี่
ไม่ควรส่งข้อมูลที่เหมาะสมสำหรับคลังข้อมูลนี้ แต่ควรใช้กับภาพดำและขาว 8 ภาพที่มีขนาดใกล้เคียงกัน ฉันขอสงวนสิทธิ์ในการเปลี่ยนภาพในคลังข้อมูลหากฉันสงสัยว่ามีการเพิ่มประสิทธิภาพการส่งสำหรับภาพเหล่านี้
การให้คะแนนจะดำเนินการผ่านสคริปต์นี้:
#!/usr/bin/env python
from __future__ import print_function
from __future__ import division
# modified from http://stackoverflow.com/a/29775654/2508324
# requires Linux Libertine fonts - get them at https://sourceforge.net/projects/linuxlibertine/files/linuxlibertine/5.3.0/
# requires dssim - get it at https://github.com/pornel/dssim
import PIL
import PIL.Image
import PIL.ImageFont
import PIL.ImageOps
import PIL.ImageDraw
import pathlib
import os
import subprocess
import sys
PIXEL_ON = 0 # PIL color to use for "on"
PIXEL_OFF = 255 # PIL color to use for "off"
def dssim_score(src_path, image_path):
out = subprocess.check_output(['dssim', src_path, image_path])
return float(out.split()[0])
def text_image(text_path):
"""Convert text file to a grayscale image with black characters on a white background.
arguments:
text_path - the content of this file will be converted to an image
"""
grayscale = 'L'
# parse the file into lines
with open(str(text_path)) as text_file: # can throw FileNotFoundError
lines = tuple(l.rstrip() for l in text_file.readlines())
# choose a font (you can see more detail in my library on github)
large_font = 20 # get better resolution with larger size
if os.name == 'posix':
font_path = '/usr/share/fonts/linux-libertine/LinLibertineO.otf'
else:
font_path = 'LinLibertine_DRah.ttf'
try:
font = PIL.ImageFont.truetype(font_path, size=large_font)
except IOError:
print('Could not use Libertine font, exiting...')
exit()
# make the background image based on the combination of font and lines
pt2px = lambda pt: int(round(pt * 96.0 / 72)) # convert points to pixels
max_width_line = max(lines, key=lambda s: font.getsize(s)[0])
# max height is adjusted down because it's too large visually for spacing
test_string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
max_height = pt2px(font.getsize(test_string)[1])
max_width = pt2px(font.getsize(max_width_line)[0])
height = max_height * len(lines) # perfect or a little oversized
width = int(round(max_width + 40)) # a little oversized
image = PIL.Image.new(grayscale, (width, height), color=PIXEL_OFF)
draw = PIL.ImageDraw.Draw(image)
# draw each line of text
vertical_position = 5
horizontal_position = 5
line_spacing = int(round(max_height * 0.8)) # reduced spacing seems better
for line in lines:
draw.text((horizontal_position, vertical_position),
line, fill=PIXEL_ON, font=font)
vertical_position += line_spacing
# crop the text
c_box = PIL.ImageOps.invert(image).getbbox()
image = image.crop(c_box)
return image
if __name__ == '__main__':
compare_dir = pathlib.PurePath(sys.argv[1])
corpus_dir = pathlib.PurePath(sys.argv[2])
images = []
scores = []
for txtfile in os.listdir(str(compare_dir)):
fname = pathlib.PurePath(sys.argv[1]).joinpath(txtfile)
if fname.suffix != '.txt':
continue
imgpath = fname.with_suffix('.png')
corpname = corpus_dir.joinpath(imgpath.name)
img = text_image(str(fname))
corpimg = PIL.Image.open(str(corpname))
img = img.resize(corpimg.size, PIL.Image.LANCZOS)
corpimg.close()
img.save(str(imgpath), 'png')
img.close()
images.append(str(imgpath))
score = dssim_score(str(corpname), str(imgpath))
print('{}: {}'.format(corpname, score))
scores.append(score)
print('Score: {}'.format(sum(scores)/len(scores)))
กระบวนการให้คะแนน:
- รันการส่งสำหรับอิมเมจ corpus แต่ละภาพแล้วส่งผลลัพธ์ไปยัง
.txt
ไฟล์ที่มีต้นกำเนิดเดียวกันกับไฟล์ corpus (ทำด้วยตนเอง) - แปลงไฟล์ข้อความแต่ละไฟล์ให้เป็นภาพ PNG โดยใช้แบบอักษร 20 จุดตัดช่องว่างออก
- ปรับขนาดภาพผลลัพธ์เป็นขนาดของภาพต้นฉบับโดยใช้การสุ่มภาพใหม่ของ Lanczos
dssim
เปรียบเทียบภาพข้อความแต่ละคนมีภาพต้นฉบับใช้- เอาต์พุตคะแนน dssim สำหรับแต่ละไฟล์ข้อความ
- เอาท์พุทคะแนนเฉลี่ย
ความคล้ายคลึงกันของโครงสร้าง (ตัวชี้วัดที่dssim
คำนวณคะแนน) เป็นตัวชี้วัดตามการมองเห็นของมนุษย์และการระบุวัตถุในภาพ ที่จะนำมันชัดถ้อยชัดคำ: ถ้าสองภาพที่มีลักษณะคล้ายกับมนุษย์พวกเขาจะ (อาจจะ) dssim
มีคะแนนต่ำ
การส่งที่ชนะจะได้รับการส่งด้วยคะแนนเฉลี่ยต่ำสุด
.txt
ไฟล์"? ข้อความที่โปรแกรมส่งออกซึ่งจะถูกไพพ์ไปยังไฟล์หรือเราควรส่งออกไฟล์โดยตรง?