บิตแมป
บิตแมป (BMP) เป็นสิ่งสำคัญที่คุณอธิบายอาร์เรย์ของตัวเลขที่แสดงถึงสีของพิกเซล เช่นสิ่งที่ชอบ
1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1
การบีบอัดแบบไม่สูญเสีย
ทีนี้เรามานิยามโครงร่างการบีบอัดกัน ในรูปแบบการบีบอัดของเราเราจะมีอาร์เรย์ของจำนวนคู่ เช่น
3, 1, 1, 0, 7, 1
ตอนนี้สิ่งแรกที่ฉันต้องการชี้ให้เห็นก็คือรูปแบบการบีบอัดนี้แทนพิกเซลเดียวกันกับอาร์เรย์แรก อาร์เรย์แรกมีสาม 1 วินาทีตามด้วย 0 เดียวจากนั้นเจ็ดเจ็ดวินาที และนั่นคือสิ่งที่เราเป็นตัวแทนอยู่ที่นี่ รูปแบบนี้จะสั้นกว่าเนื่องจากมันหมายถึงหลายพิกเซลพร้อมตัวเลขสองตัว รูปแบบบิตแมปต้องใช้หนึ่งหมายเลขสำหรับแต่ละพิกเซล
เห็นได้ชัดว่านี่เป็นมุมมองที่ค่อนข้างง่ายของรูปภาพ (เช่นเป็นเพียงหนึ่งแถว) และรูปแบบการบีบอัด แต่หวังว่านี่จะช่วยให้คุณเห็นว่ารูปแบบการบีบอัดเปลี่ยนรูปแบบของภาพอย่างไร นี่คือลักษณะที่ GIF เกี่ยวข้องกับ BMP GIF ใช้รูปแบบการบีบอัดที่เรียกว่าLempel-Ziv-Welchแทนแบบง่าย ๆ นี้
สิ่งที่เราได้อธิบายไว้ที่นี่คือรูปแบบการบีบอัดแบบไม่มีการสูญเสีย ปัญหาเกี่ยวกับรูปแบบการบีบอัดแบบไม่สูญเสียข้อมูลคือบางอินพุตรูปแบบที่เข้ารหัสอาจยาวกว่าต้นฉบับ เช่นสำหรับ
1, 0, 1, 0, 1
การเข้ารหัสคือ
1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1
นั่นมันไร้ประโยชน์ เราสร้างอินพุตเป็นสองเท่า
การบีบอัดแบบไม่สูญเสียอื่น
ทีนี้ลองมาพิจารณารูปแบบการบีบอัดที่แตกต่างกัน ในภาพนี้เราจะแสดงรูปภาพเป็นวงกลมที่ซ้อนทับ สำหรับแต่ละวงกลมเราจะกำหนดศูนย์กลางรัศมีและสี
บิตแมปแรกของเราจะกลายเป็น
5, 5, 1, 3, 0, 0
นี่คือความยาวเท่ากับวิธีบีบอัดแรกของเรา
และอันที่สองของเราอาจเป็นได้
2, 2, 1, 2, 1, 0, 2, 0, 1
นี่คือวงกลมสามวงที่กึ่งกลางที่องค์ประกอบกลาง (ซึ่งในการนับคอมพิวเตอร์คือหมายเลข 2 ขณะที่คอมพิวเตอร์เริ่มนับที่ 0) หนึ่งวงกลมมีรัศมี 2 และสี 1 จากนั้นเราเพิ่มวงกลมสี 0 และรัศมี 1 ในที่สุดเรามีวงกลมสี 1 และรัศมี 0 ในขั้นตอนนี้จะเป็น
1, 1, 1, 1, 1
1, 0, 0, 0,
1, 0, 1, 0, 1, 0, 1
หรือ
2, 2, 1, 1, 0, 0, 3, 0, 0
นี่เป็นวงกลมเริ่มต้นเดียวกัน แต่ครอบคลุมด้วยวงกลมสองจุด ในขั้นตอนก็จะเป็น
1, 1, 1, 1, 1
1, 0, 1, 1,
1, 1, 0, 1, 0, 1
ทั้งสองนี้สั้นกว่ารุ่นที่เข้ารหัสครั้งแรก แต่ยังคงยาวกว่ารุ่นเดิม
คุณอาจสงสัยว่าทำไมฉันถึงพูดถึงแวดวงไม่ใช่ช่วง เหตุผลหลักคือวงกลมนั้นใกล้เคียงกับภาพสองมิติที่แท้จริง
การบีบอัดแบบสูญเสีย
เรายังมีแนวคิดของแผนการบีบอัดที่สูญเสีย รูปแบบการบีบอัดแบบไม่สูญเสียเหล่านี้สามารถเปลี่ยนกลับไปเป็นอาร์เรย์บิตแมปเดิมได้ แผนการบีบอัดที่สูญหายอาจไม่สามารถย้อนกลับได้
ลองมาพิจารณาวิธีการแบบวงกลมของเราที่มีการสูญเสีย ในเรื่องนี้เราจะใช้กฎง่าย ๆ เราจะไม่เก็บแวดวงใด ๆ ที่มีรัศมีน้อยกว่า 1 ดังนั้นในการเข้ารหัสสองครั้งสุดท้ายของเรา
2, 2, 1, 2, 1, 0
และ
2, 2, 1
ซึ่งแปลงเป็นพิกเซลอีกครั้งคือ
1, 0, 0, 0, 1
และ
1, 1, 1, 1, 1
เวอร์ชันแรกเป็นองค์ประกอบเดียวที่ยาวกว่าต้นฉบับ รุ่นที่สองจะสั้นกว่า ทั้งสองวิธีนั้นถูกต้องดังนั้นอัลกอริทึมจึงสามารถพัฒนาได้ทั้งสองแบบและเลือกอันที่สั้นกว่า
เราอธิบายรูปภาพด้วยกฎที่เข้มงวดมากขึ้นว่ามีคุณภาพต่ำกว่า
การแสดงรูปภาพเป็นคอลเลกชันที่ซ้อนทับกันของรูปร่างวงกลมนั้นคล้ายกับวิธีการทำงานของกลุ่มผู้เชี่ยวชาญถ่ายภาพร่วมหรือรูปแบบJPEG รูปร่างของมันเป็นรูปวงรีแทนที่จะเป็นวงกลม แต่ความคิดนั้นคล้ายกัน แทนที่จะใช้วิธีง่าย ๆ ของเรามันใช้การแปลงโคไซน์แบบแยกเพื่อเข้ารหัสรูปภาพ
ซึ่งแตกต่างจาก GIF, JPEG เป็นวิธีการแสดงภาพที่แตกต่างกัน GIF ยังคงเป็นพิกเซล พวกเขาจะถูกเก็บไว้ในวิธีที่แตกต่าง JPEG เป็นรูปทรง หากต้องการดู JPEG เราจะแปลงรูปร่างเป็นพิกเซลเพราะนั่นคือวิธีที่หน้าจอทำงาน ในทางทฤษฎีเราสามารถพัฒนาหน้าจอที่ไม่ได้ทำงานในลักษณะนี้ แทนที่จะเป็นพิกเซลมันสามารถสร้างรูปร่างเพื่อให้ตรงกับรูปแบบ JPEG ได้ดียิ่งขึ้น แน่นอนหน้าจอนั้นจะไม่สามารถแสดงบิตแมปได้ ในการแสดง BMP หรือ GIF เราต้องแปลงเป็น JPEG
หากคุณแปลง GIF มาตรฐานให้พูดขนาด 300x300 พิกเซลแปลงเป็น JPEG และเหวี่ยงลงคุณภาพรูปทรงพื้นฐานที่ควรใช้จะปรากฏให้เห็น JPEG หลายตัวหลีกเลี่ยงสิ่งประดิษฐ์เหล่านี้โดยเริ่มจากภาพที่มีความละเอียดสูงกว่ามาก
JPEG ปรับขนาดได้ดีเพราะมีรูปร่างมากกว่าพิกเซล ดังนั้นหากคุณเริ่มต้นด้วยภาพขนาด 8000x8000 ให้แปลงเป็น JPEG และแสดงเป็นภาพขนาด 300x300 รายละเอียดส่วนใหญ่ที่หายไปจะหายไป หากคุณแปลงบิตแมป 8000x8000 เป็นบิตแมป 300x300 ก่อนแล้วจึงเป็น JPEG ผลลัพธ์มักจะมีคุณภาพต่ำกว่า
MPEG
เรากำลังพูดถึงภาพนิ่ง เอ็มเพกรูปแบบหรือ MPEG ใช้ชนิดเดียวกันของการบีบอัด JPEG, แต่ก็ยังไม่เป็นอย่างอื่น ในขณะที่วิธีง่ายๆในการทำวิดีโอคือการส่งภาพนิ่งตามลำดับ MPEG จริง ๆ ส่งเฟรมตามด้วยเฟรมจำนวนหนึ่งที่แสดงรายการการเปลี่ยนแปลงและจบด้วยเฟรมสุดท้าย เนื่องจากเฟรมส่วนใหญ่คล้ายกับเฟรมก่อนหน้ารายการการเปลี่ยนแปลงจึงมักมีขนาดเล็กกว่าภาพที่สอง
โดยปกติแล้วลำดับไม่ยาวพูดห้าเฟรม แต่มันจะช่วยทำให้การสตรีมมีขนาดเล็กลงกว่าที่คิดไว้
simplifications
ฉันไม่สนใจอะไรมากมาย รูปภาพของฉันมีสองสีเท่านั้น (1 บิต) ไม่ใช่ 256 จาก 8 บิตและไม่ใช่ 4,294,967,296 จากรูปแบบ 32 บิต แม้ว่าจะเป็นภาพ 8 บิตก็ตามโปรดทราบว่าคุณสามารถเลือกจานสีต่าง ๆ สำหรับภาพได้ ดังนั้นบิตแมป 8 บิตสองบิตที่มีลำดับเดียวกันอาจแทนภาพที่มีลักษณะแตกต่างกัน (รูปร่างเดียวกัน แต่มีสีต่างกัน)
ภาพของฉันเป็นแถวเดี่ยวไม่ใช่สองมิติ ภาพส่วนใหญ่จะมีขนาดแถวที่เฉพาะเจาะจงจัดเก็บทำให้อาร์เรย์สองมิติ
ฉันไม่ได้พยายามเป็นตัวแทนของการเข้ารหัสจริงเลย มันซับซ้อนกว่าแบบง่าย ๆ ที่ฉันใช้ ฉันทำสิ่งนี้เพราะฉันต้องการที่จะสามารถอธิบายการเข้ารหัสในโพสต์นี้ ฉันไม่เชื่อว่าฉันสามารถอธิบาย Lempel-Ziv ได้น้อยกว่าการปรับแต่ง Lempel-Ziv-Welch ที่ซับซ้อนมากขึ้นในคำตอบเดียว และฉันไม่เข้าใจว่าฟูริเยร์แปลงตัวได้ดีพอที่จะอธิบายพวกมันได้ทุกความยาว
นี่เป็นเวอร์ชันที่ง่ายมากในการจัดการภาพที่แท้จริง อย่างไรก็ตามฉันรู้สึกว่าเพื่อจุดประสงค์ทางด้านการสอนฉันเข้าใจได้ง่ายกว่าความเป็นจริงที่ซับซ้อนมากขึ้นในขณะที่ยังคงตีจุดสำคัญ