ความท้าทายการเข้ารหัสภาพ Twitter [ปิด]


597

หากรูปภาพมีค่า 1,000 คำคุณสามารถบรรจุรูปภาพได้เท่าใดใน 140 ตัวอักษร?

หมายเหตุ : นั่นคือคน! Bounty เส้นตายอยู่ที่นี่และหลังจากใคร่ครวญยากผมได้ตัดสินใจว่ารายการ Boojum ของเพียงแค่ขยับตัวแทบไม่ออกแซม Hocevar ฉันจะโพสต์บันทึกรายละเอียดเพิ่มเติมเมื่อฉันมีโอกาสเขียนขึ้น แน่นอนว่าทุกคนควรรู้สึกยินดีที่จะส่งโซลูชั่นต่อไปและปรับปรุงวิธีแก้ปัญหาเพื่อให้ผู้คนโหวต ขอบคุณทุกคนที่ส่งและเข้าร่วม; ฉันสนุกกับมันทั้งหมด มันสนุกมากสำหรับฉันที่จะวิ่งและฉันหวังว่ามันจะสนุกสำหรับทั้งผู้เข้าแข่งขันและผู้ชม

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

ฉันขอให้คุณสร้างระบบจุดประสงค์ทั่วไปสำหรับการเข้ารหัสภาพเป็นข้อความ Twitter จำนวน 140 ตัวและถอดรหัสให้เป็นภาพอีกครั้ง คุณสามารถใช้อักขระ Unicode เพื่อให้คุณได้รับมากกว่า 8 บิตต่ออักขระ แม้จะอนุญาตให้ใช้อักขระ Unicode ได้คุณจะต้องบีบอัดรูปภาพให้มีขนาดเล็กมาก สิ่งนี้จะเป็นการบีบอัดที่สูญเสียไปอย่างแน่นอนและดังนั้นจะต้องมีการตัดสินตามอัตวิสัยว่าผลลัพธ์แต่ละอย่างนั้นดูดีแค่ไหน

นี่คือผลลัพธ์ที่ผู้แต่งดั้งเดิมQuasimondoได้รับจากการเข้ารหัสของเขา (ภาพได้รับอนุญาตภายใต้สัญญาอนุญาตครีเอทีฟคอมมอนส์แบบแสดงที่มา - ไม่ใช่เพื่อการค้า ): Mona Lisa

คุณทำได้ดีกว่านี้ไหม

กฎระเบียบ

  1. โปรแกรมของคุณจะต้องมีสองโหมด: การเข้ารหัสและการถอดรหัส
  2. เมื่อเข้ารหัส :
    1. โปรแกรมของคุณจะต้องป้อนกราฟิกในรูปแบบกราฟิกแรสเตอร์ใด ๆ ที่คุณต้องการ เราจะบอกว่ารูปแบบแรสเตอร์ใด ๆ ที่สนับสนุนโดยImageMagickนับว่าสมเหตุสมผล
    2. โปรแกรมของคุณจะต้องส่งข้อความที่สามารถแสดงในจุดรหัส Unicode ได้ 140 จุดหรือน้อยกว่านั้น 140 จุดรหัสในช่วงU+0000- U+10FFFFไม่รวมตัวละครที่ไม่ใช่ ( U+FFFE, U+FFFF, U+nFFFE , U+nFFFFที่nคือ1- 10เลขฐานสิบหกและช่วงU+FDD0- U+FDEF) และจุดรหัสตัวแทน ( U+D800- U+DFFF) มันอาจจะส่งออกในการเข้ารหัสที่เหมาะสมที่คุณเลือก; การเข้ารหัสใด ๆ ที่สนับสนุนโดยGNUiconvจะถือว่าสมเหตุสมผลและการเข้ารหัสดั้งเดิมของแพลตฟอร์มของคุณหรือการเข้ารหัสตำแหน่งที่ตั้งอาจเป็นตัวเลือกที่ดี ดูหมายเหตุ Unicodeด้านล่างสำหรับรายละเอียดเพิ่มเติม
  3. เมื่อถอดรหัส :
    1. โปรแกรมของคุณควรใช้เป็นอินพุตเอาต์พุตของโหมดการเข้ารหัสของคุณ
    2. โปรแกรมของคุณจะต้องแสดงผลภาพในรูปแบบที่เหมาะสมตามที่คุณเลือกตามที่กำหนดไว้ข้างต้น
    3. เอาท์พุทภาพควรจะประมาณของภาพอินพุต; ยิ่งคุณเข้าใกล้ภาพอินพุตมากเท่าไหร่ก็ยิ่งดีเท่านั้น
    4. กระบวนการถอดรหัสอาจไม่มีสิทธิ์เข้าถึงเอาต์พุตอื่น ๆ ของกระบวนการเข้ารหัสนอกเหนือจากเอาต์พุตที่ระบุข้างต้น นั่นคือคุณไม่สามารถอัปโหลดภาพที่ใดที่หนึ่งและส่งออก URL สำหรับกระบวนการถอดรหัสที่จะดาวน์โหลดหรืออะไรทำนองนั้น
  4. เพื่อความสอดคล้องในส่วนต่อประสานผู้ใช้โปรแกรมของคุณจะต้องปฏิบัติดังนี้:

    1. โปรแกรมของคุณจะต้องเป็นสคริปต์ที่สามารถตั้งค่าให้ปฏิบัติการบนแพลตฟอร์มที่มีล่ามที่เหมาะสมหรือโปรแกรมที่สามารถคอมไพล์เป็นไฟล์ปฏิบัติการ
    2. โปรแกรมของคุณจะต้องเป็นอาร์กิวเมนต์แรกencodeหรือdecodeเพื่อตั้งค่าโหมด
    3. โปรแกรมของคุณต้องป้อนข้อมูลด้วยวิธีใดวิธีหนึ่งต่อไปนี้ (ถ้าคุณใช้ชื่อไฟล์คุณสามารถอ่านและเขียนจาก stdin และ stdout หากชื่อไฟล์หายไป):

      1. รับอินพุตจากมาตรฐานเข้าและสร้างเอาต์พุตตามมาตรฐาน

        my-program encode <input.png >output.txt
        my-program decode <output.txt >output.png
        
      2. รับอินพุตจากไฟล์ที่มีชื่อในอาร์กิวเมนต์ที่สองและสร้างเอาต์พุตในไฟล์ที่มีชื่อในอาร์กิวเมนต์ที่สาม

        my-program encode input.png output.txt
        my-program decode output.txt output.png
        
  5. สำหรับวิธีการแก้ปัญหาของคุณกรุณาโพสต์:
    1. รหัสของคุณเต็มและ / หรือลิงก์ไปยังโฮสต์ที่อื่น (ถ้ามันยาวมากหรือต้องใช้ไฟล์หลายไฟล์ในการคอมไพล์หรือบางอย่าง)
    2. คำอธิบายวิธีการใช้งานหากไม่ชัดเจนในทันทีจากรหัสหรือหากรหัสยาวและผู้คนจะสนใจสรุป
    3. ตัวอย่างรูปภาพที่มีรูปภาพต้นฉบับข้อความที่บีบอัดลงไปและรูปภาพที่ถอดรหัส
    4. หากคุณกำลังสร้างความคิดที่คนอื่นมีโปรดระบุพวกเขา มันเป็นการตกลงที่จะพยายามปรับแต่งความคิดของคนอื่น แต่คุณต้องให้ความสำคัญกับพวกเขา

แนวทาง

โดยทั่วไปเป็นกฎที่อาจทำให้เสียคำแนะนำหรือเกณฑ์การให้คะแนน:

  1. สุนทรียศาสตร์มีความสำคัญ ฉันจะตัดสินและแนะนำให้คนอื่นตัดสินตาม:
    1. ภาพที่ได้ออกมาดูดีขนาดไหนและมีลักษณะเหมือนภาพต้นฉบับมากแค่ไหน
    2. ข้อความดูดีแค่ไหน gobbledigook สุ่มโดยสมบูรณ์นั้นโอเคถ้าคุณมีรูปแบบการบีบอัดที่ฉลาดจริงๆ แต่ฉันต้องการเห็นคำตอบที่ทำให้ภาพกลายเป็นบทกวีหลายภาษาหรือสิ่งที่ฉลาดเช่นนั้น โปรดทราบว่าผู้เขียนโซลูชันดั้งเดิมตัดสินใจใช้ตัวอักษรจีนเท่านั้นเนื่องจากดูดีกว่าเช่นนั้น
    3. รหัสที่น่าสนใจและอัลกอริทึมที่ชาญฉลาดนั้นดีเสมอ ฉันชอบสั้น ๆ ตรงประเด็นและรหัสที่ชัดเจน แต่อัลกอริทึมที่ซับซ้อนจริงๆก็โอเคตราบใดที่พวกเขาให้ผลลัพธ์ที่ดี
  2. ความเร็วก็สำคัญเช่นกัน แต่ไม่สำคัญเท่ากับงานบีบอัดภาพที่คุณทำ ฉันควรมีโปรแกรมที่สามารถแปลงภาพในสิบวินาทีกว่าสิ่งที่จะใช้อัลกอริทึมทางพันธุกรรมสำหรับวันที่สิ้นสุด
  3. ฉันจะชอบวิธีแก้ปัญหาที่สั้นกว่าสำหรับผลิตภัณฑ์ที่มีความยาวมากกว่าตราบใดที่คุณภาพเทียบเคียงได้อย่างสมเหตุสมผล ความรัดกุมเป็นคุณธรรม
  4. โปรแกรมของคุณควรใช้งานในภาษาที่มีการติดตั้งใช้งานฟรีบน Mac OS X, Linux หรือ Windows ฉันต้องการที่จะสามารถเรียกใช้โปรแกรม แต่ถ้าคุณมีทางออกที่ดีที่ทำงานภายใต้MATLABหรือบางสิ่งเท่านั้นมันก็ใช้ได้
  5. โปรแกรมของคุณควรกว้างที่สุดเท่าที่จะเป็นไปได้ ควรใช้รูปภาพที่แตกต่างกันมากที่สุดเท่าที่จะเป็นไปได้แม้ว่าบางภาพอาจให้ผลลัพธ์ที่ดีกว่าภาพอื่น ๆ โดยเฉพาะอย่างยิ่ง:
    1. การมีอิมเมจสองสามตัวในโปรแกรมที่จับคู่และเขียนการอ้างอิงแล้วสร้างอิมเมจที่ตรงกันเมื่อทำการถอดรหัสนั้นเป็นสิ่งที่ค่อนข้างง่อยและจะครอบคลุมเฉพาะบางภาพเท่านั้น
    2. โปรแกรมที่สามารถถ่ายภาพของรูปทรงที่เรียบง่ายรูปทรงเรขาคณิตและย่อยสลายลงในเวกเตอร์ดั้งเดิมบางอันก็สวยดี แต่ถ้ามันล้มเหลวในภาพที่เกินความซับซ้อนบางอย่างมันอาจเป็นเรื่องทั่วไปที่ไม่เพียงพอ
    3. โปรแกรมที่สามารถถ่ายภาพในอัตราส่วนภาพคงที่โดยเฉพาะเท่านั้น
    4. คุณอาจพบว่าภาพขาวดำสามารถรับข้อมูลเพิ่มเติมในพื้นที่ขนาดเล็กกว่าภาพสี ในทางกลับกันนั่นอาจ จำกัด ประเภทของภาพที่ใช้ได้ ใบหน้าออกมาดีในสีดำและสีขาว แต่การออกแบบที่เป็นนามธรรมอาจไม่ดีนัก
    5. มันสมบูรณ์ดีถ้าภาพที่ออกมีขนาดเล็กกว่าอินพุทในขณะที่สัดส่วนประมาณเดียวกัน ไม่เป็นไรถ้าคุณต้องขยายภาพเพื่อเปรียบเทียบกับต้นฉบับ สิ่งที่สำคัญคือรูปลักษณ์
  6. โปรแกรมของคุณควรสร้างผลลัพธ์ที่สามารถผ่าน Twitter ได้และไม่ได้รับอันตราย นี่เป็นเพียงแนวทางมากกว่ากฎเนื่องจากฉันไม่สามารถหาเอกสารใด ๆ เกี่ยวกับชุดอักขระที่รองรับได้อย่างแม่นยำ แต่คุณควรหลีกเลี่ยงอักขระควบคุมอักขระรวมที่มองไม่เห็นขี้ขลาดตัวอักษรใช้งานส่วนตัวและสิ่งที่คล้ายกัน

เกณฑ์การให้คะแนน

ตามคู่มือทั่วไปเกี่ยวกับวิธีการจัดอันดับโซลูชันเมื่อเลือกโซลูชันที่ยอมรับของฉันสมมติว่าฉันอาจจะประเมินโซลูชันในระดับ 25 จุด (นี่หยาบมากและฉันจะไม่ให้คะแนนอะไรเลยเพียงแค่ใช้ นี่เป็นแนวทางพื้นฐาน):

  • 15 คะแนนสำหรับรูปแบบการเข้ารหัสที่สร้างภาพอินพุตที่หลากหลายได้ดีเพียงใด นี่เป็นการตัดสินใจเชิงอัตวิสัยและสุนทรียภาพ
    • 0 หมายความว่ามันใช้งานไม่ได้เลยมันให้ภาพเหมือนเดิมทุกครั้งหรือบางสิ่งบางอย่าง
    • 5 หมายความว่ามันสามารถเข้ารหัสภาพได้ไม่กี่ภาพแม้ว่ารุ่นถอดรหัสจะดูน่าเกลียดและอาจไม่ทำงานเลยในภาพที่ซับซ้อนมากขึ้น
    • 10 หมายความว่าใช้งานได้กับภาพที่หลากหลายและให้ภาพที่สวยงามซึ่งบางครั้งอาจแยกความแตกต่างได้
    • 15 หมายความว่ามันสร้างแบบจำลองที่สมบูรณ์แบบของบางภาพและแม้แต่สำหรับภาพที่ใหญ่ขึ้นและซับซ้อนขึ้น หรือบางทีมันอาจจะไม่ได้สร้างภาพที่ค่อนข้างเป็นที่จดจำ แต่ก็ให้ภาพที่สวยงามซึ่งได้มาจากต้นฉบับอย่างชัดเจน
  • 3 คะแนนสำหรับการใช้ชุดอักขระ Unicode อย่างชาญฉลาด
    • 0 คะแนนสำหรับการใช้อักขระที่อนุญาตทั้งชุด
    • 1 จุดสำหรับการใช้ชุดอักขระที่ จำกัด ซึ่งปลอดภัยสำหรับการถ่ายโอนผ่าน Twitter หรือในสถานการณ์ที่หลากหลาย
    • 2 คะแนนสำหรับการใช้ชุดอักขระที่มีเนื้อหาเฉพาะเรื่องเช่นเฉพาะอุดมคติของฮั่นหรือเฉพาะอักขระจากขวาไปซ้าย
    • 3 คะแนนสำหรับการทำสิ่งที่เรียบร้อยจริงๆเช่นการสร้างข้อความที่อ่านได้หรือใช้ตัวอักษรที่ดูเหมือนภาพในคำถาม
  • 3 คะแนนสำหรับวิธีคิดอัลกอริทึมที่ฉลาดและสไตล์โค้ด
    • 0 คะแนนสำหรับโค้ดที่มี 1,000 บรรทัดเท่านั้นเพื่อลดขนาดรูปภาพถือเป็น 1 บิตต่อพิกเซลและเข้ารหัส base64 ที่
    • 1 จุดสำหรับบางสิ่งที่ใช้เทคนิคการเข้ารหัสมาตรฐานและเขียนได้ดีและกระชับ
    • 2 คะแนนสำหรับสิ่งที่แนะนำเทคนิคการเข้ารหัสที่ค่อนข้างแปลกใหม่หรือสั้นและสะอาดอย่างน่าประหลาดใจ
    • 3 คะแนนสำหรับหนึ่งสายการบินที่ให้ผลลัพธ์ที่ดีจริง ๆ หรือสิ่งที่ทำลายพื้นใหม่ในการเข้ารหัสกราฟิก (ถ้านี่ดูเหมือนว่ามีจำนวนคะแนนต่ำสำหรับการทำลายพื้นใหม่โปรดจำไว้ว่าผลลัพธ์ที่ดีนี้น่าจะมีคะแนนสูงเพื่อความสวยงาม เช่นกัน)
  • 2 คะแนนสำหรับความเร็ว ทุกอย่างเท่าเทียมกันเร็วกว่าดีกว่า แต่เกณฑ์ข้างต้นล้วนสำคัญกว่าความเร็ว
  • 1 คะแนนสำหรับการใช้งานซอฟต์แวร์ฟรี (โอเพ่นซอร์ส) เพราะฉันชอบซอฟต์แวร์ฟรี (โปรดทราบว่า C # จะยังคงมีสิทธิ์ใช้งานได้ตราบใดที่มันทำงานบน Mono เช่นเดียวกันรหัส MATLAB จะมีสิทธิ์หากทำงานบน GNU Octave)
  • 1 คะแนนสำหรับการปฏิบัติตามกฎจริงทั้งหมด กฎเหล่านี้มีขนาดใหญ่และซับซ้อนไปหน่อยดังนั้นฉันอาจจะยอมรับคำตอบที่ดีเป็นอย่างอื่นที่มีรายละเอียดเล็ก ๆ น้อย ๆ แต่ฉันจะให้ประเด็นเพิ่มเติมกับวิธีการแก้ปัญหาที่ปฏิบัติตามกฎทั้งหมดจริง ๆ

รูปภาพอ้างอิง

บางคนถามหาภาพอ้างอิง นี่คือรูปภาพอ้างอิงบางส่วนที่คุณสามารถลองได้ รุ่นที่เล็กลงจะถูกฝังที่นี่พวกเขาทั้งหมดเชื่อมโยงไปยังรูปภาพขนาดใหญ่ขึ้นหากคุณต้องการ:

Lena Mona Lisa กล่องคอร์เนล โลโก้ StackOverflow

รางวัล

ฉันกำลังเสนอเงินรางวัล 500 ตัวแทน (บวก 50 ที่ StackOverflow เริ่มใช้) สำหรับโซลูชันที่ฉันชอบที่สุดตามเกณฑ์ข้างต้น แน่นอนฉันสนับสนุนให้คนอื่น ๆ ลงคะแนนให้กับโซลูชั่นที่พวกเขาชื่นชอบที่นี่เช่นกัน

หมายเหตุเกี่ยวกับกำหนดส่ง

การประกวดครั้งนี้จะดำเนินไปจนกว่าเงินรางวัลจะหมดประมาณ 18.00 น. ในวันเสาร์ที่ 30 พฤษภาคมฉันไม่สามารถบอกเวลาที่แน่นอนได้ว่าจะสิ้นสุดลง มันอาจจะอยู่ที่ไหนก็ได้ตั้งแต่ 5 โมงถึง 7 โมง ฉันจะรับประกันได้ว่าฉันจะดูรายการทั้งหมดที่ส่งมาภายในเวลา 14.00 น. และฉันจะพยายามอย่างเต็มที่เพื่อดูรายการทั้งหมดที่ส่งมาภายในเวลา 16.00 น. หากมีการส่งคำตอบหลังจากนั้นฉันอาจไม่มีโอกาสได้ดูอย่างเป็นธรรมก่อนที่จะตัดสินใจ ยิ่งคุณส่งเร็วเท่าไหร่โอกาสที่คุณจะได้รับคะแนนมากขึ้นก็จะช่วยให้ฉันเลือกทางออกที่ดีที่สุดได้ดังนั้นลองส่งใหม่เร็วกว่าที่จะถึงกำหนด

หมายเหตุ Unicode

นอกจากนี้ยังมีความสับสนในสิ่งที่ตัวละคร Unicode ได้รับอนุญาต ช่วงที่เป็นไปได้ Unicode จุดรหัสไปU+0000 U+10FFFFมีจุดรหัสบางอย่างที่ไม่สามารถใช้เป็นอักขระ Unicode ในการแลกเปลี่ยนข้อมูลแบบเปิดใด ๆ เหล่านี้เป็นnoncharactersและจุดรหัสตัวแทน Noncharacters กำหนดไว้ในUnidode มาตรฐาน 5.1.0 ส่วน 16.7เป็นค่าU+FFFE, U+FFFF, U+nFFFE , U+nFFFFที่nคือ1- 10เลขฐานสิบหกและช่วงU+FDD0-U+FDEF. ค่าเหล่านี้มีจุดประสงค์เพื่อใช้สำหรับการใช้งานภายในเฉพาะแอปพลิเคชันและแอปพลิเคชันที่สอดคล้องกันอาจตัดอักขระเหล่านี้ออกจากข้อความที่ประมวลผลโดยพวกเขา รหัสจุดตัวแทนที่กำหนดในUnicode Standard 5.1.0 ส่วน 3.8เป็นU+D800- U+DFFFใช้สำหรับการเข้ารหัสอักขระที่อยู่นอกเหนือจาก Basic Multilingual Plane ใน UTF-16 ดังนั้นจึงเป็นไปไม่ได้ที่จะเป็นตัวแทนของรหัสจุดเหล่านี้โดยตรงในการเข้ารหัส UTF-16 และมันไม่ถูกต้องที่จะเข้ารหัสพวกเขาในการเข้ารหัสอื่น ๆ ดังนั้นเพื่อจุดประสงค์ของการประกวดครั้งนี้ฉันจะอนุญาตให้โปรแกรมใด ๆ ที่เข้ารหัสภาพในลำดับไม่เกิน 140 จุดรหัส Unicode จากช่วงU+0000- U+10FFFFไม่รวมคู่ที่ไม่ใช่ตัวอักษรและตัวแทนตามที่กำหนดไว้ข้างต้น

ฉันจะชอบโซลูชันที่ใช้เฉพาะอักขระที่กำหนดและดีกว่าที่ใช้ชุดย่อยที่ชาญฉลาดของอักขระที่กำหนดหรือทำสิ่งที่น่าสนใจกับชุดอักขระที่พวกเขาใช้ สำหรับรายชื่อของตัวละครที่ได้รับมอบหมายให้ดูที่ฐานข้อมูลตัวอักษร Unicode ; โปรดทราบว่าตัวละครบางตัวมีการระบุไว้โดยตรงในขณะที่บางคนอยู่ในรายการเป็นเพียงจุดเริ่มต้นและจุดสิ้นสุดของช่วง โปรดทราบด้วยว่าจุดรหัสตัวแทนจะแสดงอยู่ในฐานข้อมูล แต่ไม่ได้รับอนุญาตตามที่กล่าวไว้ข้างต้น หากคุณต้องการใช้ประโยชน์จากคุณสมบัติบางอย่างของตัวอักษรเพื่อทำให้ข้อความที่คุณส่งออกน่าสนใจยิ่งขึ้นมีฐานข้อมูลข้อมูลอักขระที่หลากหลายเช่นรายการบล็อกโค้ดที่มีชื่อและคุณสมบัติอักขระต่างๆ.

เนื่องจาก Twitter ไม่ได้ระบุชุดอักขระที่แน่นอนที่พวกเขาสนับสนุนฉันจะผ่อนปรนเกี่ยวกับการแก้ปัญหาที่ไม่ได้ทำงานกับ Twitter เพราะตัวละครบางตัวนับเป็นพิเศษหรือตัวละครบางตัวถูกปล้น เป็นที่ต้องการ แต่ไม่จำเป็นว่าทุกผลการเข้ารหัสควรจะสามารถที่จะโอนเป็นอันตรายผ่านทาง Twitter หรือบริการ microblogging อีกเช่นidenti.ca ฉันได้เห็นเอกสารบางอย่างที่ระบุว่าตัวเข้ารหัสเอนทิตีของ Twitter <,> และ & และทำให้นับเป็นตัวอักษร 4, 4 และ 5 ตามลำดับ แต่ฉันไม่ได้ทดสอบตัวเองและตัวนับ JavaScript ของพวกเขาดูเหมือนจะไม่ เพื่อนับพวกเขาในแบบนั้น

เคล็ดลับ & ลิงค์

  • คำจำกัดความของอักขระ Unicode ที่ถูกต้องในกฎนั้นค่อนข้างซับซ้อน การเลือกตัวละครกลุ่มเดียวเช่น CJK Unified Ideographs (U + 4E00 – U + 9FCF) อาจทำได้ง่ายกว่า
  • คุณสามารถใช้ไลบรารีรูปภาพที่มีอยู่เช่นImageMagickหรือPython Imaging Libraryเพื่อจัดการภาพของคุณ
  • หากคุณต้องการความช่วยเหลือบางทำความเข้าใจชุดอักขระ Unicode และการเข้ารหัสต่างๆดูคู่มือที่รวดเร็วหรือคำถามที่พบบ่อยรายละเอียดเกี่ยวกับ UTF-8 ใน Linux และ Unix
  • ก่อนหน้านี้คุณจะได้รับการแก้ปัญหาของคุณยิ่งฉัน (และคนอื่น ๆ ลงคะแนน) มากเท่าไรก็จะต้องดูด้วย คุณสามารถแก้ไขโซลูชันของคุณหากคุณปรับปรุง ฉันจะยึดรางวัลของฉันเป็นเวอร์ชันล่าสุดเมื่อฉันดูการแก้ปัญหาล่าสุด
  • ถ้าคุณต้องการรูปแบบภาพที่ง่ายต่อการแยกและการเขียน (และไม่ได้ต้องการเพียงแค่ใช้รูปแบบที่มีอยู่) ผมขอแนะนำให้ใช้รูปแบบ PPM มันเป็นรูปแบบข้อความที่ใช้งานได้ง่ายมากและคุณสามารถใช้ImageMagickเพื่อแปลงเป็นและจากมันได้

อย่าลังเลที่จะให้คำแนะนำเกี่ยวกับกฎที่ฉันเขียนไว้ในความคิดเห็น แน่นอนฉันยินดีที่จะปรับแต่งพวกเขาหากผู้คนรู้สึกว่าพวกเขาต้องการคำชี้แจงหรือมีการระบุมากเกินไป
Brian Campbell

6
คุณอาจพูดได้ว่าการอัปโหลดภาพไปยังเซิร์ฟเวอร์และโพสต์ URL ไปยังภาพนั้นไม่ถูกต้อง
Shay Erlichmen

2
@Shay ฉันไม่ได้พูดอย่างนั้นเหรอ? "กระบวนการถอดรหัสอาจไม่สามารถเข้าถึงเอาต์พุตอื่น ๆ ของกระบวนการเข้ารหัสนอกเหนือจากเอาต์พุตที่ระบุข้างต้นนั่นคือคุณไม่สามารถอัปโหลดภาพที่ใดที่หนึ่งและส่ง URL สำหรับกระบวนการถอดรหัสเพื่อดาวน์โหลดหรืออะไรทำนองนั้น ."
Brian Campbell

1
@ Konrad Rudolph ฉันเห็นด้วย; ฉันไม่ได้หมายถึง "โง่" จากมุมมองเชิงปฏิบัติ (ชัดเจนการประกวดทั้งหมดนี้โง่จากมุมมองเชิงปฏิบัติ) ฉันหมายถึง "โง่" ในบริบทของการประกวดครั้งนี้ การใช้ URI ไม่ใช่ขั้นตอนวิธีการบีบอัดในแง่ทฤษฎีข้อมูลเนื่องจากไม่อนุญาตให้คุณถ่ายโอนข้อมูลเพิ่มเติมโดยไม่ต้องใช้ช่องทางอื่น คุณสามารถให้ตัวเข้ารหัสและตัวถอดรหัสฐานข้อมูลขนาดใหญ่ของภาพและเรียกมันว่าการบีบอัดที่ใช้งานได้เฉพาะกับภาพที่ จำกัด แต่ฉันระบุว่าคุณต้องสามารถจัดการกับภาพโดยพลการ
Brian Campbell

2
ต่อไปนี้เป็นลิงค์เชื่อมโยงที่ฉันสามารถใช้งานได้ซึ่งอาจช่วยคุณได้: azillionmonkeys.com/qed/unicode.htmlสำหรับคำอธิบายเกี่ยวกับช่วงของอักขระ Unicode โปรดทราบว่าการเข้ารหัส UTF เป็นรหัสที่สามารถเข้ารหัสช่วง Unicode ทั้งหมด UCS-4 เป็นชุดของ Unicode และ UCS-2 & ASCII เป็นชุดย่อย และที่ด้านหน้าของการบีบอัดนี่เป็นเทคนิคที่คล้ายกันกับโพสต์ต้นฉบับแม้ว่าเขาจะอนุญาตให้ตัวเอง 1k มากกว่า 350 ไบต์: screamingduck.com/Article.php?ArticleID=46&Show=ABCE
Brian Campbell

คำตอบ:


244

เอาล่ะนี่เป็นของฉัน: nanocrunch.cppและไฟล์CMakeLists.txtเพื่อสร้างโดยใช้CMake ขึ้นอยู่กับMagick ++ ImageMagick API สำหรับการจัดการรูปภาพส่วนใหญ่ นอกจากนี้ยังต้องการไลบรารีGMPสำหรับเลขคณิต bignum สำหรับการเข้ารหัสสตริง

ฉันใช้วิธีแก้ปัญหาของฉันจากการบีบอัดภาพเศษส่วนด้วยการบิดที่เป็นเอกลักษณ์ แนวคิดพื้นฐานคือการถ่ายภาพลดขนาดสำเนาลงเหลือ 50% และค้นหาชิ้นส่วนในทิศทางที่หลากหลายซึ่งมีลักษณะคล้ายกับบล็อกที่ไม่ทับซ้อนกันในภาพต้นฉบับ ใช้วิธีการที่ดุร้ายมากในการค้นหานี้ แต่นั่นทำให้ง่ายขึ้นที่จะแนะนำการแก้ไขของฉัน

การดัดแปลงครั้งแรกคือแทนที่จะมองแค่การหมุนและพลิกเก้าสิบองศาโปรแกรมของฉันก็พิจารณาการหมุน 45 องศาด้วย มันเป็นหนึ่งบิตต่อบล็อก แต่มันช่วยคุณภาพของภาพได้อย่างมาก

อีกอย่างคือการจัดเก็บการปรับความคมชัด / ความสว่างสำหรับองค์ประกอบแต่ละสีของแต่ละบล็อกนั้นแพงเกินไป แต่ฉันเก็บสีที่มีปริมาณมาก (พาเล็ตมีเพียง 4 * 4 * 4 = 64 สี) ที่ได้รับการผสมเพียงสัดส่วน ศาสตร์นี้เทียบเท่ากับความสว่างของตัวแปรและการปรับความคมชัดคงที่สำหรับแต่ละสี น่าเสียดายที่มันยังหมายความว่าไม่มีความแตกต่างในทางตรงกันข้ามกับการพลิกสี

เมื่อคำนวณตำแหน่งการวางแนวและสีของแต่ละบล็อกแล้วมันจะเข้ารหัสสิ่งนี้ลงในสตริง UTF-8 ก่อนอื่นมันจะสร้าง bignum ขนาดใหญ่มากเพื่อแสดงข้อมูลในตารางบล็อกและขนาดรูปภาพ วิธีการนี้คล้ายกับวิธีแก้ปัญหาของ Sam Hocevar - เป็นจำนวนมากที่มีเลขฐานที่แตกต่างกันไปตามตำแหน่ง

จากนั้นมันจะแปลงเป็นฐานของขนาดของชุดอักขระที่มีอยู่ โดยค่าเริ่มต้นจะใช้ประโยชน์อย่างเต็มที่จากชุดอักขระ Unicode ที่กำหนดลบด้วยอักขระที่น้อยกว่า, มากกว่า, เครื่องหมายแอมเปอร์แซนด์, การควบคุม, การรวมและอักขระตัวแทนและส่วนตัว มันไม่สวย แต่ใช้งานได้ คุณสามารถคอมเม้นท์ตารางเริ่มต้นและเลือก ASCII 7 บิตที่พิมพ์ได้ (อีกครั้งยกเว้น <,> และ & ตัวอักษร) หรือ CJK Unified Ideographs แทน ตารางที่มีรหัสตัวอักษรพร้อมใช้งานจะถูกจัดเก็บแบบเข้ารหัสความยาวการรันพร้อมการสลับแบบอักษรที่ไม่ถูกต้องและถูกต้อง

อย่างไรก็ตามนี่คือภาพและเวลาบางส่วน (วัดจาก 3.0GHz P4 เดิมของฉัน) และบีบอัดได้ถึง 140 ตัวอักษรในชุดยูนิโค้ดที่กำหนดเต็มรูปแบบตามที่อธิบายไว้ข้างต้น โดยรวมแล้วฉันค่อนข้างพอใจกับสิ่งที่พวกเขาเปิดออก ถ้าฉันมีเวลาทำสิ่งนี้มากขึ้นฉันอาจลองลดความบล็อกของภาพที่คลายการบีบอัด ถึงกระนั้นฉันคิดว่าผลลัพธ์จะค่อนข้างดีสำหรับอัตราส่วนการบีบอัดที่รุนแรง ภาพที่คลายบีบอัดเป็นบิตอิมเพรสชั่นนิสต์ แต่ฉันคิดว่ามันค่อนข้างง่ายที่จะดูว่าบิตสอดคล้องกับต้นฉบับอย่างไร

โลโก้ Stack Overflow (8.6 วินาทีในการเข้ารหัส 7.9 วินาทีในการถอดรหัส 485 ไบต์):
http://i44.tinypic.com/2w7lok1.png

Lena (การเข้ารหัส 32.8 วินาที, 13.0 วินาทีในการถอดรหัส 477 ไบต์):
http://i42.tinypic.com/2rr49wg.png http://i40.tinypic.com/2rhxxyu.png

Mona Lisa (การเข้ารหัส 43.2 วินาที, การถอดรหัส 14.5 วินาที, 490 ไบต์):
http://i41.tinypic.com/ekgwp3.png http://i43.tinypic.com/ngsxep.png

แก้ไข: ตัวอักษร Unified CJK

แซมถามถึงความคิดเห็นเกี่ยวกับการใช้สิ่งนี้กับ CJK นี่เป็นเวอร์ชั่นของ Mona Lisa ที่บีบอัดถึง 139 ตัวอักษรจากชุดอักขระ Unified CJK:

http://i43.tinypic.com/2yxgdfk.png 咏璘驞凄脒鵚据蛥鸂拗朐朖辿韩瀦魷歪痫栘璯緍脲蕜抱揎頻蓼債鑡嗞靊寞柮嚛嚵籥聚隤慛絖銓馿渫櫰矍昀鰛掾撄粂敽牙稉擎蔍螎葙峬覧絀蹔抆惫冧笻哜搀澐芯譶辍澮垝黟偞媄童竽梀韠镰猳閺狌而羶喙伆杇婣唆鐤諽鷍鴞駫搶毤埙誖萜愿旖鞰萗勹鈱哳垬濅鬒秀瞛洆认気狋異闥籴珵仾氙熜謋繴茴晋髭杍嚖熥勳縿餅珝爸擸萿

พารามิเตอร์การปรับค่าที่ด้านบนของโปรแกรมที่ฉันใช้สำหรับสิ่งนี้คือ: 19, 19, 4, 4, 3, 10, 11, 1000, 1000 นอกจากนี้ฉันยังแสดงความคิดเห็นคำจำกัดความแรกของ number_assigned และรหัสและไม่ใส่เครื่องหมาย คำจำกัดความสุดท้ายของพวกเขาเพื่อเลือกชุดอักขระ Unified CJK


ว้าว! งานที่ดี. ฉันสงสัยว่าการบีบอัดภาพเศษส่วนสำหรับภาพขนาดเล็ก แต่จริงๆแล้วมันให้ผลลัพธ์ที่ดีพอสมควร มันค่อนข้างง่ายในการรวบรวมและเรียกใช้
Brian Campbell

1
ขอบคุณเพื่อน! Sam, คุณหมายถึงผลลัพธ์ที่มีเพียง 140 ตัวอักษร CJK หรือไม่ ถ้าใช่คุณต้องปรับตัวเลขที่ด้านบน ขนาดสุดท้ายในบิตอยู่ที่ log2 (steps_in_x steps_in_y steps_in_red steps_in_green steps_in_blue) * blocks_in_x blocks_in_y + log2 (maximum_widthสูงสุด_height )
Boojum

แก้ไข: มี * 16 ใน log2 แรก () ที่ฉันออกไป นั่นคือทิศทางที่เป็นไปได้
Boojum

20
มีใครทวีตภาพที่ใช้นี้หรือยัง
dbr

288

ไฟล์รูปภาพและแหล่งหลาม (เวอร์ชัน 1 และ 2)

รุ่น 1 นี่คือความพยายามครั้งแรกของฉัน ฉันจะอัปเดตเมื่อฉันไป

ฉันมีโลโก้ SO เหลือ 300 ตัวอักษรเกือบจะไม่มีความสูญเสียเลย เทคนิคของฉันใช้การแปลงเป็นเวกเตอร์ SVG เพื่อให้ทำงานได้ดีที่สุดในการวาดเส้น จริงๆแล้วมันเป็นคอมเพรสเซอร์ SVG แต่ก็ยังต้องใช้ศิลปะดั้งเดิมผ่านขั้นตอนการเวกเตอร์

สำหรับความพยายามครั้งแรกของฉันฉันใช้บริการออนไลน์สำหรับการติดตาม PNG แต่มีเครื่องมือฟรีและไม่ฟรีมากมายที่สามารถจัดการส่วนนี้รวมถึงpotrace (โอเพ่นซอร์ส)

นี่คือผลลัพธ์

โลโก้ SO ดั้งเดิม http://www.warriorhut.org/graphics/svg_to_unicode/so-logo.png โลโก้ SO ถอดรหัสต้นฉบับ http://www.warriorhut.org/graphics/svg_to_unicode/so-logo-decoded.pngหลังจากการเข้ารหัสและ ถอดรหัส

ตัวละคร : 300

เวลา : ไม่วัด แต่ทันทีจริง (ไม่รวมขั้นตอน vectorisation / rasterisation)

ขั้นต่อไปคือการฝัง 4 สัญลักษณ์ (จุดเส้นทาง SVG และคำสั่ง) ต่อตัวอักษรยูนิโค้ด ในขณะนี้การสร้างหลามของฉันไม่รองรับตัวละครแบบกว้าง UCS4 ซึ่งจำกัดความละเอียดของฉันต่อตัวละคร ฉันได้ จำกัด ช่วงสูงสุดไว้ที่ระดับล่างสุดของช่วงที่สงวนยูนิโค้ด 0xD800 แต่เมื่อฉันสร้างรายการของอักขระที่อนุญาตและตัวกรองเพื่อหลีกเลี่ยงพวกเขา โลโก้ด้านบน

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

เวอร์ชัน 2

UPDATE : v2 มีคุณสมบัติในการแข่งขันแล้ว การเปลี่ยนแปลง:

  • การควบคุมบรรทัดคำสั่งอินพุต / เอาต์พุตและการดีบัก
  • ใช้ตัวแยกวิเคราะห์ XML (lxml) เพื่อจัดการ SVG แทน regex
  • แพ็คเซ็กเมนต์เส้นทาง 2 ต่อสัญลักษณ์ยูนิโค้ด
  • เอกสารและการทำความสะอาด
  • รูปแบบการสนับสนุน = "เติม: สี" และเติม = "สี"
  • ความกว้าง / ความสูงของเอกสารบรรจุเป็นอักขระเดียว
  • สีเส้นทางบรรจุเป็นอักขระเดียว
  • การบีบอัดสีทำได้โดยการทิ้งข้อมูลสีจำนวน 4 บิตต่อสีแล้วบรรจุลงอักขระด้วยการแปลงเลขฐานสิบหก

ตัวละคร : 133

เวลา : สองสามวินาที

v2 decoded http://www.warriorhut.org/graphics/svg_to_unicode/so-logo-decoded-v2.pngหลังจากการเข้ารหัสและถอดรหัส (เวอร์ชั่น 2)

อย่างที่คุณเห็นมีบางสิ่งประดิษฐ์ในครั้งนี้ มันไม่ใช่ข้อ จำกัด ของวิธีการ แต่เป็นความผิดพลาดในการแปลงของฉัน สิ่งประดิษฐ์เกิดขึ้นเมื่อคะแนนออกไปนอกช่วง 0.0 - 127.0 และความพยายามของฉันที่จะ จำกัด พวกเขาได้ประสบความสำเร็จในการผสม การแก้ปัญหาคือการย่อภาพ แต่ฉันมีปัญหาในการปรับจุดที่เกิดขึ้นจริงแทนที่จะเป็น artboard หรือ group matrix และตอนนี้ฉันเหนื่อยเกินกว่าจะดูแล กล่าวโดยย่อหากคะแนนของคุณอยู่ในช่วงที่ได้รับการสนับสนุนโดยทั่วไปจะใช้งานได้

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

UPDATE : วิธีนี้ใช้ได้กับวัตถุอย่างง่ายดังนั้นฉันจึงต้องการวิธีที่จะทำให้เส้นทางที่ซับซ้อนและลดเสียงรบกวน ฉันใช้Inkscapeสำหรับงานนี้ ฉันโชคดีกับการเตรียมเส้นทางที่ไม่จำเป็นโดยใช้ Inkscape แต่ไม่มีเวลาลองใช้มันแบบอัตโนมัติ ฉันได้สร้าง svgs ตัวอย่างโดยใช้ฟังก์ชัน 'ลดความซับซ้อน' ของ Inkscape เพื่อลดจำนวนเส้นทาง

ลดความซับซ้อนของงานตกลง แต่มันอาจช้ากับเส้นทางจำนวนมากนี้

ตัวอย่าง autotrace http://www.warriorhut.org/graphics/svg_to_unicode/autotrace_16_color_manual_reduction.png cornell box http://www.warriorhut.com/graphics/svg_to_unicode/cornell_box_simplified.png lena http://www.warriorhut.com/graphics /svg_to_unicode/lena_std_washed_autotrace.png

ติดตามภาพขนาดย่อ http://www.warriorhut.org/graphics/svg_to_unicode/competition_thumbnails_autotrace.png

นี่คือช็อตความละเอียดต่ำพิเศษ สิ่งเหล่านี้จะใกล้เคียงกับความยาวสูงสุดที่ จำกัด ไว้ที่ 140 อักขระแม้ว่าการบีบอัดพา ธ ที่ชาญฉลาดอาจจำเป็นต้องใช้เช่นกัน

ดูแลเรียบร้อย http://www.warriorhut.org/graphics/svg_to_unicode/competition_thumbnails_groomed.png ประยุกต์และ despeckled

trianglulated http://www.warriorhut.org/graphics/svg_to_unicode/competition_thumbnails_triangulated.png ประยุกต์ประยุกต์ despeckled และ triangulated

autotrace --output-format svg --output-file cornell_box.svg --despeckle-level 20 --color-count 64 cornell_box.png

เส้นทางประยุกต์ใช้: ข้างต้นAutoTrace

น่าเสียดายที่โปรแกรมแยกวิเคราะห์ของฉันไม่จัดการเอาต์พุตออโต้เทรซดังนั้นฉันไม่ทราบว่ามีการใช้งานจุดอย่างไรหรือจะทำให้ง่ายขึ้นได้อย่างไรเศร้ามีเวลาน้อยมากที่จะเขียนมันก่อนถึงกำหนด มันง่ายกว่าในการแยกวิเคราะห์มากกว่าเอาท์พุท inkscape


2
ยอดเยี่ยม ในตอนแรกฉันต้องการสร้างโซลูชันเวกเตอร์แบบไฮบริดที่มีทั้งขอบที่คมและพื้นที่ที่ราบเรียบ แต่มันพิสูจน์แล้วว่าซับซ้อนเกินไปโดยไม่ต้องใช้ไลบรารีการติดตาม (ซึ่งฉันไม่ต้องการใช้) ฉันรอคอยที่จะเห็นว่าคุณจะไปได้ไกลแค่ไหนด้วยวิธีการของคุณ!
sam hocevar

ดี! ฉันหวังว่าเราจะได้เห็นความพยายามในการเข้าใกล้การสูญเสียโดยใช้ vectorization หมายความว่ามันมีความสามารถในการลดทั่วไป แต่คุณภาพที่สูงขึ้นสำหรับภาพที่ครอบคลุม ไม่ควรใช้บริการออนไลน์สำหรับ vectorization ขอให้โชคดีในการลดขนาดลงอีก!
Brian Campbell

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

70
ว้าว. ภาพเหล่านี้ดูมีสไตล์จริงๆ
Rinat Abdullin

199

วิธีการแก้ปัญหาของฉันเต็มสามารถพบได้ที่ http://caca.zoy.org/wiki/img2twit มันมีคุณสมบัติดังต่อไปนี้:

  • เวลาบีบอัดที่เหมาะสม (ประมาณ 1 นาทีเพื่อคุณภาพสูง)
  • การคลายการบีบอัดอย่างรวดเร็ว (เสี้ยววินาที)
  • คงขนาดภาพดั้งเดิมไว้ (ไม่ใช่เพียงอัตราส่วนภาพ)
  • คุณภาพการสร้างใหม่ที่เหมาะสม (IMHO)
  • ความยาวข้อความและชุดอักขระ (ASCII, CJK, สัญลักษณ์) สามารถเลือกได้ในขณะทำงาน
  • ความยาวข้อความและชุดอักขระจะถูกตรวจสอบโดยอัตโนมัติในเวลาคลายการบีบอัด
  • บรรจุข้อมูลที่มีประสิทธิภาพมาก

http://caca.zoy.org/raw-attachment/wiki/img2twit/so-logo.png http://caca.zoy.org/raw-attachment/wiki/img2twit/twitter4.png

蜥秓鋖筷聝诿缰偺腶漷庯祩皙靊谪獜岨幻寤厎趆脘搇梄踥桻理戂溥欇渹裏軱骿苸髙骟市簶璨粭浧鱉捕弫潮衍蚙瀹岚玧霫鏓蓕戲債鼶襋躻弯袮足庭侅旍凼飙驅據嘛掔倾诗籂阉嶹婻椿糢墤渽緛赐更儅棫武婩縑逡荨璙杯翉珸齸陁颗鳣憫擲舥攩寉鈶兓庭璱篂鰀乾丕耓庁錸努樀肝亖弜喆蝞躐葌熲谎蛪曟暙刍镶媏嘝驌慸盂氤缰殾譑

นี่เป็นภาพรวมคร่าวๆของกระบวนการเข้ารหัส:

  • จำนวนบิตที่มีอยู่คำนวณจากความยาวข้อความที่ต้องการและชุดอักขระที่ใช้งานได้
  • อิมเมจต้นฉบับถูกแบ่งออกเป็นเซลล์สแควร์มากที่สุดเท่าที่บิตที่มีให้อนุญาต
  • จำนวนจุดคงที่ (ปัจจุบัน 2) ได้รับผลกระทบกับแต่ละเซลล์พร้อมพิกัดเริ่มต้นและค่าสี
  • ต่อไปนี้ซ้ำจนกระทั่งเป็นไปตามเงื่อนไขคุณภาพ:
    • จุดถูกเลือกแบบสุ่ม
    • การดำเนินการจะดำเนินการโดยการสุ่มในจุดนี้ (ย้ายภายในเซลล์ของมันเปลี่ยนสี)
    • หากภาพที่ปรากฏ (ดูกระบวนการถอดรหัสด้านล่าง) อยู่ใกล้กับภาพต้นฉบับการดำเนินการจะถูกเก็บไว้
  • ขนาดภาพและรายการของจุดต่าง ๆ ถูกเข้ารหัสใน UTF-8

และนี่คือกระบวนการถอดรหัส:

  • ขนาดและจุดภาพที่อ่านได้จากสตรีม UTF-8
  • สำหรับแต่ละพิกเซลในภาพปลายทาง:
    • รายการของ neigbours ธรรมชาติถูกคำนวณ
    • สีสุดท้ายของพิกเซลถูกกำหนดให้เป็นค่าเฉลี่ยถ่วงน้ำหนักของสีเพื่อนบ้านของธรรมชาติ

สิ่งที่ฉันเชื่อคือส่วนที่เป็นต้นฉบับที่สุดของโปรแกรมคือบิตสตรีม แทนที่จะบรรจุค่าจัดแนวบิต ( stream <<= shift; stream |= value) ฉันบรรจุค่าตามอำเภอใจที่ไม่อยู่ในช่วง power-of-two ( stream *= range; stream += value) สิ่งนี้ต้องใช้การคำนวณแบบบิกนัมและแน่นอนว่าช้ากว่ามาก แต่ให้ฉัน 2009.18 บิตแทน 1960 เมื่อใช้ตัวละคร CJK หลัก 20902 ตัว (นั่นคืออีกสามจุดที่ฉันสามารถใส่ข้อมูลได้) และเมื่อใช้ ASCII มันให้ฉัน 917.64 บิตแทน 840

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

ลูปการปรับหลักนั้นได้รับแรงบันดาลใจมาจากอัลกอริธึมการทำ Direct Directional Dithering (ที่มีการสลับพิกเซลแบบสุ่มหรือพลิกจนกว่าจะได้ฮาล์ฟโทนที่ดีกว่า) การคำนวณพลังงานเป็นระยะทางรูทค่าเฉลี่ยง่ายๆ แต่ฉันทำการกรองมัธยฐาน 5x5 บนภาพต้นฉบับก่อน การมัวแบบเกาส์น่าจะเป็นตัวแทนของพฤติกรรมสายตาของมนุษย์ได้ดีกว่า แต่ฉันไม่ต้องการที่จะเสียขอบคม ฉันยังตัดสินใจกับการจำลองการอบอ่อนหรือวิธีการปรับแต่งอื่น ๆ ที่ยากเพราะฉันไม่มีเวลาในการปรับเทียบกระบวนการ ดังนั้นค่าสถานะ "คุณภาพ" จะแสดงจำนวนการวนซ้ำที่ดำเนินการในแต่ละจุดก่อนที่ตัวเข้ารหัสจะสิ้นสุด

http://caca.zoy.org/raw-attachment/wiki/img2twit/Mona_Lisa_scaled.jpg http://caca.zoy.org/raw-attachment/wiki/img2twit/twitter2.png

苉憗揣嶕繠剳腏篮濕茝霮墧蒆棌杚蓳縳樟赒肴飗噹砃燋任朓峂釰靂陴貜犟掝喗讄荛砙矺敨鷾瓔亨髎芟氲簵鸬嫤鉸俇激躙憮鄴甮槺骳佛愚猪駪惾嫥綖珏矯坼堭颽箽赭飉訥偁箝窂蹻熛漧衆橼愀航玴毡裋頢羔恺墎嬔鑹楄瑥鶼呍蕖抲鸝秓苾绒酯嵞脔婺污囉酼俵菛琪棺则辩曚鸸職銛蒝礭鱚蟺稿纡醾陴鳣尥蟀惘鋁髚忩祤脤养趯沅况

แม้ว่าจะไม่ได้ภาพทั้งหมดที่บีบอัดได้ดี แต่ฉันก็ประหลาดใจกับผลลัพธ์และฉันสงสัยจริงๆว่ามีวิธีการอื่นใดที่สามารถบีบอัดรูปภาพเป็น 250 ไบต์

ฉันยังมีภาพยนตร์เล็ก ๆ ของวิวัฒนาการรัฐเข้ารหัสจากสถานะเริ่มต้นสุ่มและจาก "ดี" สถานะเริ่มต้น

แก้ไข : นี่คือวิธีการบีบอัดเปรียบเทียบกับ JPEG ทางด้านซ้ายของภาพด้านบนมีขนาด 536 ไบต์ ทางด้านขวา Mona Lisa บีบอัดลงไปที่ 534 ไบต์โดยใช้วิธีที่อธิบายไว้ที่นี่ (ไบต์ที่กล่าวถึงที่นี่อ้างถึง data bytes ดังนั้นการละเว้นบิตที่สูญเปล่าโดยใช้อักขระ Unicode):

http://caca.zoy.org/raw-attachment/wiki/img2twit/minimona.jpg http://caca.zoy.org/raw-attachment/wiki/img2twit/minimona2.png

แก้ไข : เพียงแทนที่ข้อความ CJK ด้วยรูปภาพเวอร์ชันใหม่ล่าสุด


จริง ๆ แล้วฉันไม่จำเป็นต้องสามารถเรียกใช้รหัส (ฉันใส่ส่วนเกี่ยวกับการเรียกใช้ในแนวทางเป็นคำแนะนำไม่ใช่กฎ) ฉันต้องการที่จะเรียกใช้ แต่ฉันจะตัดสินเพิ่มเติมเกี่ยวกับคุณภาพของภาพที่คุณสร้างรหัสและเทคนิคหรืออัลกอริทึมที่น่าสนใจ หากฉันต้องการเรียกใช้และต้องการแพ็คเกจที่ฉันไม่มีหรือไม่ต้องการติดตั้งในระบบหลักของฉันฉันสามารถบูตอินสแตนซ์ Amazon EC2 และติดตั้งได้ ตราบใดที่คุณทำงานกับไลบรารีที่จัดทำแพ็กเกจสำหรับหนึ่งใน distros สำคัญฉันควรจะสามารถเรียกใช้ได้ ใช้ CGAL ได้ฟรี
Brian Campbell

2
เอาล่ะนี่คือทางออกของฉัน (รหัสแหล่งที่มา): caca.zoy.org/browser/libpipi/trunk/examples/img2twit.cpp พยายามคำอธิบายของฉันและไม่กี่ตัวอย่างอยู่ที่caca.zoy.org/wiki/img2twit
sam Hocevar

2
ฉันชอบทางออกของคุณจริงๆ คุณควรลองลดจำนวนค่าที่กำหนดให้กับช่องสีฟ้าเนื่องจากสายตาของมนุษย์ไม่สามารถแก้ไขสีน้ำเงินได้ดี: nfggames.com/games/ntsc/visual.shtm ; การทำเช่นนี้จะช่วยให้คุณมีรายละเอียดมากขึ้นโดยที่ข้อมูลสีบางส่วนสูญหาย หรืออาจจะกำหนดเป็นสีเขียว
rpetrich

5
จุดดี. ฉันลองใช้แนวคิดนี้สองสามรูปแบบ (ดูความคิดเห็นก่อนคำจำกัดความ RANGE_X) แต่ไม่ละเอียดมากนัก อย่างที่คุณเห็นการใช้ 5 สีน้ำเงินแทน 6 เพิ่มข้อผิดพลาดน้อยกว่าการใช้ 7 สีเขียวลดลงเล็กน้อย ฉันไม่ได้ลองทำทั้งสองอย่างด้วยความขี้เกียจ ปัญหาอื่นที่ฉันมีคือฉันไม่มีฟังก์ชั่นผิดพลาดที่ดีมาก ฉันใช้ ∑ (∆r² + ∆g² + ∆b²) / 3 ซึ่งใช้งานได้ดี ฉันลอง ∑ (0.299∆r² + 0.587∆g² + 0.114∆b²) ตาม (โดยไม่มีเหตุผลทางกายภาพ) ในองค์ประกอบ Y ของ YUV แต่ก็ทนได้กับข้อผิดพลาดสีน้ำเงินเกินไป ฉันจะพยายามหาเอกสารเกี่ยวกับปัญหานี้
sam hocevar

2
@rpetrich: ฉันแก้ไขโปรแกรมเพื่อเพิ่มช่วง r / g / b แบบไดนามิกตราบใดที่มีบิตเพียงพอ สิ่งนี้ทำให้แน่ใจว่าเราไม่เคยเสียมากกว่า 13 บิตในบิตสตรีมทั้งหมด (แต่ในทางปฏิบัติมักเป็น 1 หรือ 2) และภาพดูดีขึ้นเล็กน้อย
sam hocevar

45

ต่อไปนี้ไม่ใช่การส่งอย่างเป็นทางการเนื่องจากซอฟต์แวร์ของฉันไม่ได้รับการปรับแต่งให้เหมาะสมกับงานที่ระบุ DLIสามารถอธิบายได้ว่าเป็นการเพิ่มประสิทธิภาพตัวแปลงสัญญาณภาพให้สูญเสียวัตถุประสงค์ทั่วไป มันคือตัวบันทึกเร็กคอร์ด PSNR และ MS-SSIM สำหรับการบีบอัดภาพและฉันคิดว่ามันน่าสนใจที่จะดูว่ามันทำงานได้ดีอย่างไร ฉันใช้อิมเมจอ้างอิง Mona Lisa ที่ให้มาและปรับขนาดให้เหลือ 100x150 จากนั้นใช้ DLI เพื่อบีบอัดให้มีขนาด 344 ไบต์

Mona Lisa DLI http://i40.tinypic.com/2md5q4m.png

สำหรับการเปรียบเทียบกับตัวอย่างไฟล์บีบอัด JPEG และ IMG2TWIT ฉันใช้ DLI เพื่อบีบอัดรูปภาพเป็น 534 ไบต์เช่นกัน JPEG คือ 536 ไบต์และ IMG2TWIT คือ 534 ไบต์ ปรับขนาดรูปภาพให้มีขนาดใกล้เคียงกันโดยประมาณเพื่อให้ง่ายต่อการเปรียบเทียบ JPEG เป็นภาพด้านซ้าย IMG2TWIT เป็นกึ่งกลางและ DLI เป็นภาพที่ถูกต้อง

การเปรียบเทียบ http://i42.tinypic.com/302yjdg.png

ภาพ DLI จัดการเพื่อรักษาคุณสมบัติบางอย่างของใบหน้าโดยเฉพาะอย่างยิ่งรอยยิ้มที่มีชื่อเสียง :)


6
อุ่ย ข้อมูลข้างต้นควรให้เครดิตกับ Dennis Lee ที่ส่งมาในตอนแรก ฉันเพิ่งแก้ไขเพื่อฝังภาพอินไลน์ & ลิงก์ไปยังการอ้างอิงที่ฉันพบโดย Googling และฉันต้องบอกว่าว้าวฉันประทับใจในการบีบอัด ฉันจะต้องตรวจสอบการบีบอัด DLI
Brian Campbell

1
โดยวิธีการที่ผู้เขียน DLI กล่าวถึง "เวลาการประมวลผลนาน" เมื่อฉันไม่สามารถใช้งานซอฟต์แวร์ของเขาได้คุณจะให้เวลาในการบีบอัดข้อมูลให้เราได้หรือไม่?
sam hocevar

1
การใช้ AMD Athlon64 2.4Ghz การบีบอัดภาพ 100x150 Mona Lisa ใช้เวลา 38 วินาทีและคลายการบีบอัด 6sec การบีบอัดข้อมูลให้มีขนาดสูงสุด 251 ไบต์นั้นเข้มงวดกว่าคุณภาพของเอาต์พุตจะลดลงอย่างมาก เมื่อใช้ภาพ Mona Lisa อ้างอิงฉันปรับลดขนาดลงเหลือ 60x91 จากนั้นใช้ DLI เพื่อบีบอัดให้มีขนาด 243 ไบต์ (ใกล้เคียงกับ 251 มากที่สุดโดยไม่ไปเกิน) นี่คือผลลัพธ์ i43.tinypic.com/2196m4g.png รายละเอียดไม่ได้อยู่ใกล้กับ 534 ไบต์ DLI แม้ว่าบิตเรตจะลดลงเพียง 50% เท่านั้น โครงสร้างของภาพได้รับการดูแลอย่างดีอย่างไรก็ตาม

1
ตัดสินใจที่จะทำให้ง่ายขึ้นในการเปรียบเทียบตัวอย่างบีบอัด 250 ไบต์ DLI 243 ไบต์ถูกปรับขนาดและวางไว้ข้างตัวอย่าง IMG2TWIT IMG2TWIT ทางซ้าย, DLI ทางด้านขวา นี่คือ i40.tinypic.com/30ndks6.png ภาพ

1
DLI ใช้พารามิเตอร์คุณภาพเช่น JPEG ดังนั้นจึงจำเป็นต้องมีการทดลองและข้อผิดพลาดหากต้องการขนาดเอาต์พุตเป้าหมาย

21

ภาพรวมทั่วไปของโซลูชันของฉันคือ:

  1. ฉันเริ่มต้นด้วยการคำนวณจำนวนสูงสุดของข้อมูลดิบที่คุณสามารถใส่ลงใน 140 utf8 ตัวอักษร
    • (ฉันสมมติว่า utf8 ซึ่งเป็นสิ่งที่เว็บไซต์ดั้งเดิมอ้างว่า twitter เก็บไว้เป็นข้อความค่ะสิ่งนี้แตกต่างจากคำแถลงปัญหาข้างต้นซึ่งขอ utf16)
    • การใช้utf8 faqนี้ฉันคำนวณว่าจำนวนบิตสูงสุดที่คุณสามารถเข้ารหัสในอักขระ utf8 เดียวคือ 31 บิต ในการทำเช่นนี้ฉันจะใช้ตัวละครทั้งหมดที่อยู่ในช่วง U-04000000 - U-7FFFFFFF (1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx มี 31 x's ดังนั้นฉันสามารถเข้ารหัสได้สูงสุด 31 บิต)
    • 31 บิตคูณ 140 อักขระเท่ากับ 4340 บิต หารด้วย 8 จะได้รับ 524.5 และรอบลงไปที่542 ไบต์
    • (หากเรา จำกัด ตัวเองไว้ที่ utf16 เราสามารถเก็บ 2 ไบต์ต่อตัวอักษรเท่านั้นซึ่งจะเท่ากับ 280 ไบต์)
  2. บีบอัดภาพลงโดยใช้การบีบอัด jpg มาตรฐาน
    • ปรับขนาดภาพให้อยู่ที่ประมาณ 50x50px จากนั้นพยายามบีบอัดที่ระดับการบีบอัดต่างๆจนกว่าคุณจะมีภาพที่ใกล้เคียงกับ 542 ไบต์มากที่สุดโดยไม่ต้องผ่าน
    • นี่คือตัวอย่างของ mona lisa ที่บีบอัดลงไปที่ 536 ไบต์
  3. เข้ารหัสบิตข้อมูลดิบของรูปภาพที่ถูกบีบอัดให้เป็นอักขระ utf-8
    • แทนที่แต่ละ x ในไบต์ต่อไปนี้: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx ด้วยบิตจากรูปภาพ
    • ส่วนนี้อาจเป็นส่วนที่ต้องเขียนรหัสส่วนใหญ่เนื่องจากไม่มีสิ่งใดที่มีอยู่ในปัจจุบันที่ทำเช่นนี้

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

ฉันคิดว่าประโยชน์ที่สำคัญของโซลูชันที่เสนอคือการนำเทคโนโลยีที่มีอยู่กลับมาใช้ใหม่ให้ได้มากที่สุด มันอาจเป็นเรื่องสนุกที่จะลองเขียนอัลกอริธึมการบีบอัดที่ดี แต่มีการรับประกันว่าเป็นอัลกอริธึมที่ดีกว่าซึ่งน่าจะเขียนโดยคนที่มีปริญญาในคณิตศาสตร์ที่สูงกว่า

สิ่งสำคัญอีกอย่างหนึ่งที่ควรทราบก็คือหากมีการตัดสินใจว่า utf16 เป็นการเข้ารหัสที่ต้องการโซลูชันนี้จึงแยกออกจากกัน jpegs ไม่ทำงานจริง ๆ เมื่อบีบอัดลงไปที่ 280 ไบต์ แม้ว่าอาจมีอัลกอริทึมการบีบอัดที่ดีกว่า jpg สำหรับคำแถลงปัญหาเฉพาะนี้


ตอนนี้ฉันกำลังทำงานอยู่ แต่ฉันเริ่มใช้โซลูชั่นนี้เมื่อฉันกลับถึงบ้าน
เปาโล Santos

2
จากการทดลองของฉันปรากฏว่า UTF-16 นั้นแท้จริงแล้วว่า Twitter นับตัวอักษรได้อย่างไร อักขระ BMP นับเป็น 1 และอักขระระนาบที่สูงกว่านับเป็น 2 ซึ่งไม่ได้ทำเป็นเอกสาร แต่เป็นวิธีที่ตัวนับจาวาสคริปต์นับเมื่อคุณพิมพ์ลงในกล่องอินพุต มันยังกล่าวถึงในความคิดเห็นในชุดข้อความต้นฉบับ ฉันไม่ได้ลองส่งผ่าน API เพื่อดูว่าตัวนับนั้นเสียหายหรือไม่ หากเป็นเช่นนั้นฉันจะอัปเดตปัญหาสำหรับข้อ จำกัด จริง คุณไม่น่าจะสามารถใช้ UTF-8 ตามอำเภอใจได้เนื่องจากลำดับที่ยาวกว่าที่คุณสามารถเข้ารหัสนั้นไม่ใช่ Unicode ที่ถูกต้อง
Brian Campbell

4
หลังจากการทดสอบกับ API ของพวกเขาปรากฎว่าพวกเขาจะนับด้วยตัวอักษร Unicode (คะแนนรหัส) ไม่ใช่หน่วยรหัส UTF-16 (มันเป็นตัวนับจาวาสคริปต์ที่นับผ่าน UTF-16 เนื่องจากเห็นได้ชัดว่าเป็นสิ่งที่ JavaScript ยาว) . ดังนั้นคุณสามารถรับข้อมูลเพิ่มเติมได้ที่นั่น อักขระ Unicode ที่ถูกต้องอยู่ในช่วง U + 0000 ถึง U + 10FFFF (บิตมากกว่า 20 บิตต่ออักขระ; 2 ^ 20 + 2 ^ 16 ค่าที่เป็นไปได้ต่ออักขระ) UTF-8 ช่วยให้การเข้ารหัสของค่ามากกว่าที่ได้รับอนุญาตใน Unicode ดังนั้นหากคุณ จำกัด ตัวเองเป็น Unicode คุณจะได้รับประมาณ 350 ไบต์ของพื้นที่ไม่ได้ 542
ไบรอันแคมป์เบล

3
536-byte mona lisa นั้นดูดีอย่างน่าประหลาดใจเนื่องจากได้รับการบีบอัดที่รุนแรง!
Chris

3
ปัจจุบันเราสามารถเข้ารหัสอักขระ Unicode ที่แตกต่างกัน 129,775 อักขระ (ที่ได้รับมอบหมาย, ไม่ได้ควบคุม, ไม่เป็นส่วนตัว) หากเรา จำกัด ตัวเองไว้ที่เซ็ตย่อยนั้นมันคือทั้งหมด 2377 บิตหรือ 297 ไบต์ รหัสที่นี่: porg.es/blog/what-can-we-fit-in-140-characters
porges

20

โอเคฉันมาสายไปที่เกม แต่อย่างไรก็ตามฉันทำโครงการของฉัน

มันเป็นขั้นตอนวิธีทางพันธุกรรมของเล่นที่ใช้วงกลมที่มีสีสันโปร่งแสงเพื่อสร้างภาพเริ่มต้นขึ้นใหม่

คุณสมบัติ:

  • Lua บริสุทธิ์ ทำงานได้ทุกที่ที่ล่าม Lua ทำงาน
  • ใช้รูปแบบ netpbm P3
  • มาพร้อมกับชุดทดสอบที่ครอบคลุม
  • รักษาขนาดภาพต้นฉบับ

ผิดพลาด feautres:

  • ช้า
  • ในข้อ จำกัด ของพื้นที่นี้มันจะรักษาเฉพาะโทนสีพื้นฐานของภาพเริ่มต้นและเค้าโครงทั่วไปของคุณสมบัติบางอย่างของมัน

นี่คือตัวอย่าง twit ที่แสดงถึง Lena: 犭楊谷杌螦 ena ena ena Here's Here's Here's 僨僨僨僨僨岂掂戇耔攋斘眐奡萛狂昸箆亲嬎廙栃兡塅受橯恰应戞优猫僘瑩吱賾卣朸杈腠綍蝘猕屐稱悡詬來噩压罍尕熚帤厥虤嫐虲兙罨縨炘排叁抠堃從弅慌螎熰標宑簫柢橙拃丨蜊缩昔儻舭勵癳冂囤璟彔榕兠摈侑蒖孂埮槃姠璐哠眛嫡琠枀訜苄暬厇廩焛瀻严啘刱垫仔

ลีนาดั้งเดิม Lena เข้ารหัส

รหัสอยู่ในที่เก็บ Mercurial ที่ bitbucket.org ตรวจสอบhttp://bitbucket.org/tkadlubo/circles.lua


2
! น่ากลัว สร้างภาพที่ดูเป็นระเบียบและสวยงาม ฉันดีใจที่ผู้คนยังคงทำงานกับสิ่งนี้อยู่ มันสนุกมากที่ได้เห็นวิธีการต่าง ๆ ทั้งหมด
Brian Campbell

1
ฉันต้องการเห็นสิ่งนี้ถูกใช้เป็นเหมือนการซ้อนทับแบบโปร่งใสบนต้นฉบับให้บางสิ่งเช่นเอฟเฟ็กต์โบเก้
Nick Radford

19

ต่อไปนี้เป็นวิธีการแก้ไขปัญหาของฉันและฉันต้องยอมรับว่านี่เป็นโครงการที่น่าสนใจสำหรับการทำงานมันอยู่นอกขอบเขตการทำงานปกติของฉันและได้ให้สิ่งใหม่แก่ฉันในการเรียนรู้

แนวคิดพื้นฐานที่อยู่เบื้องหลังของฉันมีดังนี้:

  1. ลดขนาดของภาพในระดับสีเทาซึ่งมีทั้งหมด 16 เฉดสี
  2. Preform RLE บนภาพ
  3. บรรจุผลลัพธ์ลงในอักขระ UTF-16
  4. Preform RLE กับผลลัพธ์ที่ถูกบรรจุเพื่อลบอักขระที่ซ้ำกัน

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

乤乤万乐唂伂倂倁企儂 2 企倁 3 企倁 2 企伂 8 企伂 3 企伂 5 企倂倃伂倁 3 企儁企 2 伂倃 5 企倁 3 企倃 4 企倂企倁企伂 2 企伂 5 企倁企伂쥹皗鞹鐾륶䦽阹럆䧜椿籫릹靭욶옷뎷歩㰷歉䴗鑹㞳鞷㬼獴鏙돗鍴祳㭾뤶殞焻乹Ꮛ靆䍼

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

ในแง่ของระยะเวลาสำหรับภาพขนาดเล็กรหัสจะเร็วมากประมาณ 55ms สำหรับภาพตัวอย่างที่ให้ แต่เวลาจะเพิ่มขึ้นด้วยภาพขนาดใหญ่ สำหรับรูปภาพอ้างอิง 512x512 Lena เวลาทำงานคือ 1182 มิลลิวินาที ฉันควรทราบว่าอัตราต่อรองนั้นค่อนข้างดีว่ารหัสนั้นไม่ได้รับการปรับให้เหมาะสมสำหรับประสิทธิภาพ (เช่นทุกอย่างทำงานด้วยบิตแมป ) ดังนั้นเวลาอาจลดลงเล็กน้อยหลังจากทำการปรับเปลี่ยนใหม่

โปรดอย่าลังเลที่จะให้คำแนะนำกับฉันเกี่ยวกับสิ่งที่ฉันสามารถทำได้ดีกว่าหรือสิ่งที่อาจผิดกับรหัส รายชื่อเต็มของรันไทม์และเอาต์พุตตัวอย่างสามารถดูได้ที่ตำแหน่งต่อไปนี้: http://code-zen.info/twitterimage/

อัปเดตหนึ่ง

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

乤乤万乐唂伂倂倁企儂 2 企倁 3 企倁ウ伂 8 企伂エ伂 5 企倂倃伂倁グ儁企 2 伂倃ガ倁ジ倃 4 企倂企倁企伂ツ伂ス倁企伂쥹皗鞹鐾륶䦽阹럆䧜椿籫릹靭욶옷뎷歩㰷歉䴗鑹㞳鞷㬼獴鏙돗鍴祳㭾뤶殞焻乹Ꮛ靆䍼

อัพเดทสอง

การอัปเดตเล็ก ๆ อีกหนึ่ง แต่ฉันแก้ไขโค้ดเพื่อแพ็คเฉดสีเป็นกลุ่มที่สามซึ่งตรงข้ามกับสี่สิ่งนี้ใช้พื้นที่เพิ่มขึ้นบ้าง แต่ถ้าฉันขาดอะไรไปมันควรหมายความว่าอักขระ "คี่" ไม่ปรากฏที่สีอีกต่อไป ข้อมูลคือ นอกจากนี้ฉันได้อัปเดตการบีบอัดอีกเล็กน้อยเพื่อให้สามารถดำเนินการกับสตริงทั้งหมดซึ่งตรงข้ามกับบล็อกการนับสี ฉันยังคงทดสอบเวลาทำงาน แต่พวกเขาดูเหมือนจะปรับปรุงในนาม อย่างไรก็ตามคุณภาพของภาพยังคงเหมือนเดิม สิ่งที่ตามมาคือทวีต Lena รุ่นใหม่ล่าสุด:

2 乤万乐唂伂倂倁企儂 2 企倁 3 企倁ウ伂 8 企伂エ伂 5 企倂倃伂倁グ儁企 2 伂倃ガ倁ジ倃 4 企倂企倁企伂ツ伂ス倁企伂坹坼坶坻刾啩容力吹婩媷劝圿咶坼妛啭奩嗆婣冷咛啫凃奉佶坍均喳女媗决兴宗喓夽兴唹屹冷圶埫奫唓坤喝奎似商嗉乃

StackOverflow โลโก้ http://code-zen.info/twitterimage/images/stackoverflow-logo.bmp Cornell กล่อง http://code-zen.info/twitterimage/images/cornell-box.bmp Lena http: // รหัสเซน .info / twitterimage / images / lena.bmp โมนาลิซา http://code-zen.info/twitterimage/images/mona-lisa.bmp


1
เยี่ยมมากขอบคุณสำหรับการเข้าร่วม! Grayscale ใช้งานได้ดีกับสิ่งเหล่านี้ส่วนใหญ่ แต่ Lena ค่อนข้างยากที่จะทำออกมาได้ ฉันกำลังมองหาแหล่งที่มาของคุณ แต่ได้ 404; คุณแน่ใจได้หรือไม่ว่ามันอยู่ที่นั่น
Brian Campbell

ตรวจสอบอีกครั้งตอนนี้ฉันกำลังปรับปรุงเว็บไซต์ดังนั้นคุณอาจจับฉันระหว่างการปรับปรุง
rjzii

ใช่ฉันสามารถดาวน์โหลดได้ตอนนี้ ตอนนี้แน่นอนฉันต้องคิดออกว่าฉันจะหา Mono เพื่อคอมไพล์มันได้ไหม
Brian Campbell

อ้อ! ทำงานภายใต้ Mono ฉันรวบรวมด้วย "gmcs -r System.Drawing TwitterImage.cs Program.cs" และทำงานกับ "mono TwitterImage.exe เข้ารหัส lena.png lena.png lena.txt"
Brian Campbell

เย็น! ฉันตรวจสอบอีกครั้งเพื่อให้แน่ใจว่าห้องสมุดที่ฉันใช้นั้นถูกระบุไว้สำหรับ Mono แต่ฉันยังไม่ได้ทำงานกับ Mono จริงๆดังนั้นฉันจึงไม่แน่ใจว่าจะเป็นเช่นนั้นหรือไม่
rjzii

15

อัลกอริทึมทางพันธุกรรมนี้ที่ Roger Alsing เขียนมีอัตราส่วนการบีบอัดที่ดี เวกเตอร์ผลลัพธ์ของจุดยอดสามารถถูกบีบอัดเพิ่มเติมโดยใช้อัลกอริทึมแบบ lossy หรือ lossless

http://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona-lisa/

จะเป็นโปรแกรมที่น่าสนใจที่จะใช้ แต่ฉันจะให้มันพลาด


12

ในความท้าทายดั้งเดิมขีด จำกัด ขนาดถูกกำหนดเป็นสิ่งที่ Twitter ยังอนุญาตให้คุณส่งหากคุณวางข้อความในช่องข้อความและกด "อัปเดต" เนื่องจากบางคนสังเกตเห็นอย่างถูกต้องสิ่งนี้จะแตกต่างจากสิ่งที่คุณสามารถส่งเป็นข้อความ SMS จากมือถือของคุณ

สิ่งที่ไม่ได้กล่าวถึงอย่างชัดเจน (แต่สิ่งที่กฎส่วนบุคคลของฉันคือ) คือคุณควรจะสามารถเลือกข้อความทวีตในเบราว์เซอร์ของคุณคัดลอกไปยังคลิปบอร์ดและวางลงในช่องป้อนข้อความของตัวถอดรหัสของคุณเพื่อให้สามารถแสดง แน่นอนว่าคุณมีอิสระที่จะบันทึกข้อความเป็นไฟล์ข้อความและอ่านกลับเข้าไปใหม่หรือเขียนเครื่องมือที่เข้าถึง Twitter API และกรองข้อความใด ๆ ที่ดูเหมือนรหัสภาพ (เครื่องหมายพิเศษใครก็ได้หรือไม่ขยิบ ตาขยิบตา ) แต่กฎคือข้อความจะต้องผ่าน Twitter ก่อนที่คุณจะได้รับอนุญาตให้ถอดรหัส

ขอให้โชคดีกับ 350 ไบต์ - ฉันสงสัยว่าคุณจะสามารถใช้มันได้


1
ใช่ฉันได้เพิ่มรูบริกเกณฑ์การให้คะแนนซึ่งบ่งชี้ว่าต้องการข้อ จำกัด ที่เข้มงวดมากขึ้นในชุดอักขระ แต่ไม่จำเป็น ฉันต้องการกฎที่กำหนดให้ข้อความผ่าน Twitter ที่ไม่ได้รับบาดเจ็บ แต่ต้องใช้เวลามากในการทดลองและข้อผิดพลาดเพื่อหารายละเอียดที่แม่นยำเกี่ยวกับสิ่งที่ใช้งานได้และฉันต้องการออกจากระยะไกล รหัสพื้นที่ ดังนั้นข้อกำหนดเฉพาะในการท้าทายของฉันคืออักขระ Unicode ที่ถูกต้อง 140 ตัว ขอบคุณที่หยุดโดย! ฉันชอบวิธีการแก้ปัญหาของคุณและต้องการดูว่าผู้ใดในกลุ่ม kibitzers สามารถปรับปรุงได้หรือไม่
Brian Campbell

12

การโพสต์ภาพ Monochrome หรือ Greyscale ควรปรับปรุงขนาดของภาพที่สามารถเข้ารหัสลงในพื้นที่ดังกล่าวเนื่องจากคุณไม่สนใจเรื่องสี

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

เพิ่มการบีบอัดบางส่วนไปด้านบนและมันอาจเริ่มต้นทำงานได้ ...

นีซ !!! ตอนนี้พวกคุณสนใจฉันแล้ว จะไม่มีงานทำตลอดทั้งวัน ...


9
s / peaked / piqued / g
eleven81

1
ฉันชอบไอเดียของภาพสามภาพมันควรจะเป็นไปได้ที่จะใช้ไอเดียนี้กับทวิตเตอร์และผลลัพธ์จะออกมาค่อนข้างดี
Makis

9

เกี่ยวกับการเข้ารหัส / ถอดรหัสส่วนหนึ่งของความท้าทายนี้ base16b.orgเป็นความพยายามของฉันในการระบุวิธีมาตรฐานสำหรับการเข้ารหัสข้อมูลไบนารีอย่างปลอดภัยและมีประสิทธิภาพในเครื่องบิน Unicode ที่สูงขึ้น

คุณสมบัติบางอย่าง:

  • ใช้พื้นที่ผู้ใช้ส่วนตัวของ Unicode เท่านั้น
  • เข้ารหัสได้มากถึง 17 บิตต่อตัวอักษร มีประสิทธิภาพมากกว่า Base64 เกือบสามเท่า
  • การใช้งานจาวาสคริปต์อ้างอิงของการเข้ารหัส / ถอดรหัสให้ไว้
  • ตัวอย่างการเข้ารหัสรวมอยู่ในนั้น ได้แก่ Twitter และ Wordpress

ขออภัยคำตอบนี้มาสายเกินไปสำหรับการแข่งขันดั้งเดิม ฉันเริ่มโครงการโดยไม่ขึ้นกับโพสต์นี้ซึ่งฉันค้นพบครึ่งทาง


8

แนวคิดในการเก็บภาพอ้างอิงจำนวนมากน่าสนใจ มันจะผิดไหมถ้าเก็บรูปภาพขนาด 25 เมกะไบต์และลองใช้โปรแกรมเปลี่ยนไฟล์และลองแต่งรูปภาพโดยใช้บิตของสิ่งเหล่านั้น? ด้วยท่อขนาดจิ๋วเช่นนี้เครื่องจักรที่ปลายทั้งสองด้านจำเป็นต้องมีมากกว่าปริมาณข้อมูลที่ผ่านมาดังนั้นความแตกต่างระหว่างรหัส 25Mb และรหัส 1Mb กับ 24Mb ของข้อมูลภาพคืออะไร

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


1
นั่นจะเป็นเรื่องปกติตราบใดที่คุณมีข้อมูลจำนวน จำกัด แน่นอนที่จุดปลายทั้งสอง แน่นอนคุณจะต้องแสดงให้เห็นว่ามันทำงานได้กับภาพที่ไม่ได้อยู่ในชุดฝึกอบรมเช่นเดียวกับปัญหากระบวนการทางภาษาเชิงสถิติ ฉันชอบที่จะเห็นสิ่งที่ใช้วิธีการทางสถิติในการเข้ารหัสภาพ
Brian Campbell

16
สำหรับฉันคนหนึ่งชอบที่จะเห็น Mona Lisa ทำใหม่โดยใช้งานศิลปะแฟน Boba Fett เป็นแหล่งข้อมูล
Nosredna

ฉันเห็นด้วย - วิธี photomosaic ดูเหมือนจะอยู่ในกฎ & จะน่าสนใจอย่างยิ่งที่เห็นใครบางคนเข้ามาแทง
An̲̳̳drew

8

ความคิดที่โง่ แต่sha1(my_image)จะส่งผลให้ภาพของ "สมบูรณ์แบบ" ใด ๆ (ไม่สนใจการชน) ปัญหาที่เห็นได้ชัดคือกระบวนการถอดรหัสต้องใช้การเดรัจฉานบังคับในปริมาณที่มากเกินไป

ขาวดำ 1 บิตจะง่ายขึ้นเล็กน้อย .. แต่ละพิกเซลกลายเป็น 1 หรือ 0 ดังนั้นคุณจะมีข้อมูล 1000 บิตสำหรับภาพขนาด 100 * 100 พิกเซล เนื่องจากแฮช SHA1 มี 41 ตัวอักษรเราสามารถใส่สามข้อความลงในข้อความเดียวได้เพียงต้องบังคับเดรัจฉาน 2 ชุด 3333 บิตและ 3334 ชุดหนึ่งชุด (แม้ว่าจะยังคงไม่พอ)

มันไม่ได้ใช้งานได้จริง แม้ว่าจะมีภาพความยาวคงที่ 1 บิต 100 * 100px ก็มี .. สมมติว่าฉันไม่ได้คาดคะเนชุดค่าผสม 49995000 หรือ 16661667 เมื่อแบ่งออกเป็นสามชุด

def fact(maxu):
        ttl=1
        for i in range(1,maxu+1):
                ttl=ttl*i
        return ttl

def combi(setsize, length):
    return fact(length) / (fact(setsize)*fact(length-setsize))

print (combi(2, 3333)*2) + combi(2, 3334)
# 16661667L
print combi(2, 10000)
# 49995000L

10
ปัญหาของ sha1 (my_image) คือถ้าคุณใช้เวลาอย่างดุเดือดบังคับคุณอาจพบว่ามีคนชนหลายคนก่อนที่คุณจะพบภาพจริง และแน่นอนว่าเดรัจฉานบังคับ sha1 นั้นเป็นไปไม่ได้ที่จะคำนวณได้
Brian Campbell

5
ดียิ่งกว่าการบีบอัด SHA1: อัลกอริทึมการบีบอัด "flickr" ของฉัน! ขั้นตอนที่ 1: อัพโหลดภาพไปที่ flickr ขั้นตอนที่ 2: โพสต์ลิงค์ไปที่ twitter Tadda! ใช้ 15 ไบต์เท่านั้น!
niXar

2
niXar: ไม่กฎที่ 3.4: "กระบวนการถอดรหัสอาจไม่สามารถเข้าถึงเอาต์พุตอื่น ๆ ของกระบวนการเข้ารหัสนอกเหนือจากเอาต์พุตที่ระบุข้างต้นนั่นคือคุณไม่สามารถอัปโหลดภาพที่ใดที่หนึ่งและส่ง URL สำหรับกระบวนการถอดรหัสไปยัง ดาวน์โหลดหรืออะไรทำนองนั้น "
dbr

6
ฉันรู้ว่าฉันกำลังเหน็บแนม
niXar


0

แนวคิด: คุณสามารถใช้แบบอักษรเป็นจานสีได้หรือไม่? พยายามแบ่งภาพในชุดของเวกเตอร์ที่พยายามอธิบายด้วยชุดของเวกเตอร์ (ตัวละครแต่ละตัวเป็นชุดของเวกเตอร์) นี่คือการใช้แบบอักษรเป็นพจนานุกรม ฉันสามารถใช้อัลสำหรับเส้นแนวตั้งและ - สำหรับเส้นแนวนอนหรือไม่? แค่ความคิด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.