ภาพ JPEG มีอยู่ทั่วไปในชีวิตดิจิทัลของเรา แต่เบื้องหลังการรับรู้นี้ก็คืออัลกอริธึมที่จะลบรายละเอียดที่ไม่สามารถมองเห็นได้ด้วยตามนุษย์ ผลลัพธ์ที่ได้คือคุณภาพของภาพสูงสุดในขนาดไฟล์ที่เล็กที่สุด - แต่ทั้งหมดนี้ทำงานอย่างไรกันแน่? มาดูกันว่าตาของเรามองไม่เห็นอะไรกันแน่!
เป็นเรื่องง่ายที่จะถือว่าความสามารถในการส่งภาพถ่ายให้เพื่อน และไม่ต้องกังวลว่าพวกเขาใช้อุปกรณ์ เบราว์เซอร์ หรือระบบปฏิบัติการใดอยู่ แต่ก็ไม่ได้เป็นเช่นนั้นเสมอไป ในช่วงต้นทศวรรษ 1980 คอมพิวเตอร์สามารถจัดเก็บและแสดงภาพดิจิทัลได้ แต่มีแนวคิดที่แข่งขันกันมากมายเกี่ยวกับวิธีที่ดีที่สุดในการทำเช่นนี้ คุณไม่สามารถส่งภาพจากคอมพิวเตอร์เครื่องหนึ่งไปยังอีกเครื่องหนึ่งและหวังว่ามันจะได้ผล
เพื่อแก้ไขปัญหานี้ ในปี พ.ศ. 1986 ได้มีการประชุมคณะกรรมการผู้เชี่ยวชาญจากทั่วโลกเรียกว่า "
กลุ่มคนที่เรียกว่า JPEG ได้สร้างมาตรฐานการบีบอัดภาพดิจิทัล JPEG ในปี 1992 ใครก็ตามที่เคยใช้อินเทอร์เน็ตอาจพบภาพที่เข้ารหัส JPEG นี่เป็นวิธีที่ใช้กันทั่วไปในการเข้ารหัส ส่ง และจัดเก็บภาพ ตั้งแต่หน้าเว็บไปจนถึงอีเมลไปจนถึงโซเชียลมีเดีย JPEG ถูกใช้หลายพันล้านครั้งต่อวัน—แทบทุกครั้งที่เราดูภาพออนไลน์หรือส่งภาพนั้น หากไม่มี JPEG เว็บก็จะมีสีสันน้อยลง ทำงานช้าลง และอาจมีรูปภาพแมวน้อยลง!
บทความนี้เกี่ยวกับวิธีการถอดรหัสภาพ JPEG กล่าวอีกนัยหนึ่ง สิ่งที่จำเป็นในการแปลงข้อมูลที่บีบอัดที่จัดเก็บไว้ในคอมพิวเตอร์ให้เป็นภาพที่ปรากฏบนหน้าจอ สิ่งนี้ควรค่าแก่การรู้ ไม่เพียงเพราะการทำความเข้าใจเทคโนโลยีที่เราใช้ทุกวันเป็นสิ่งสำคัญ แต่ยังเนื่องจากการปลดล็อคระดับการบีบอัด เราได้เรียนรู้เพิ่มเติมเกี่ยวกับการรับรู้และการมองเห็น และรายละเอียดที่ดวงตาของเราไวต่อมากที่สุด
นอกจากนี้การเล่นภาพในลักษณะนี้ก็น่าสนใจมาก
มองเข้าไปข้างใน JPEG
ในคอมพิวเตอร์ ทุกอย่างจะถูกจัดเก็บเป็นลำดับของเลขฐานสอง โดยทั่วไปแล้วบิต ศูนย์ และบิตเหล่านี้ จะถูกจัดกลุ่มเป็นกลุ่มละแปดชุดเพื่อประกอบเป็นไบต์ เมื่อคุณเปิดภาพ JPEG บนคอมพิวเตอร์ บางสิ่งบางอย่าง (เบราว์เซอร์ ระบบปฏิบัติการ อย่างอื่น) จะต้องถอดรหัสไบต์ เพื่อคืนค่าภาพต้นฉบับเป็นรายการสีที่สามารถแสดงได้
หากคุณดาวน์โหลดอันแสนหวานนี้
ที่นี่ฉันใช้ Notepad++ เพื่อตรวจสอบเนื้อหาของไฟล์ เนื่องจากโปรแกรมแก้ไขข้อความทั่วไป เช่น Notepad บน Windows จะทำให้ไฟล์ไบนารีเสียหายหลังจากบันทึก และจะไม่เป็นไปตามรูปแบบ JPEG อีกต่อไป
การเปิดภาพในโปรแกรมประมวลผลคำจะทำให้คอมพิวเตอร์สับสน เช่นเดียวกับที่คุณสร้างความสับสนให้กับสมองเมื่อคุณขยี้ตาและเริ่มมองเห็นจุดสี!
จุดที่คุณเห็นเหล่านี้เรียกว่า
เป็นเรื่องตลกที่จะคิดว่าคอมพิวเตอร์มีความคล้ายคลึงกับสมองเพียงใด แต่ก็เป็นการเปรียบเทียบที่มีประโยชน์ในการแสดงให้เห็นว่าข้อมูลมีความหมายมากน้อยเพียงใด ไม่ว่าจะส่งผ่านเส้นประสาทหรือเก็บไว้ในคอมพิวเตอร์ก็ตาม ขึ้นอยู่กับการตีความ ข้อมูลไบนารีทั้งหมดประกอบด้วย 0 และ 1 ซึ่งเป็นองค์ประกอบพื้นฐานที่สามารถถ่ายทอดข้อมูลได้ทุกประเภท คอมพิวเตอร์ของคุณมักจะเข้าใจวิธีตีความโดยใช้เบาะแสต่างๆ เช่น นามสกุลไฟล์ ตอนนี้เราบังคับให้ตีความว่าเป็นข้อความ เพราะนั่นคือสิ่งที่โปรแกรมแก้ไขข้อความคาดหวัง
เพื่อให้เข้าใจถึงวิธีการถอดรหัส JPEG เราจำเป็นต้องดูสัญญาณดั้งเดิมด้วยตนเอง นั่นก็คือข้อมูลไบนารี่ ซึ่งสามารถทำได้โดยใช้โปรแกรมแก้ไขเลขฐานสิบหกหรือโดยตรง
คุณสามารถเรียนรู้ได้มากมายเพียงแค่เล่นกับโปรแกรมแก้ไขนี้ ตัวอย่างเช่น คุณบอกได้ไหมว่าพิกเซลถูกจัดเก็บในลำดับใด
สิ่งที่แปลกเกี่ยวกับตัวอย่างนี้คือการเปลี่ยนตัวเลขบางตัวไม่ส่งผลกระทบต่อภาพเลย แต่เช่น หากคุณแทนที่หมายเลข 17 ด้วย 0 ในบรรทัดแรก รูปภาพจะเสียหายโดยสิ้นเชิง!
การเปลี่ยนแปลงอื่นๆ เช่น การแทนที่เลข 7 ในบรรทัดปี 1988 ด้วยหมายเลข 254 จะเปลี่ยนสี แต่เฉพาะพิกเซลที่ตามมาเท่านั้น
บางทีสิ่งที่แปลกประหลาดที่สุดคือตัวเลขบางตัวไม่เพียงแต่เปลี่ยนสี แต่ยังเปลี่ยนรูปร่างของภาพด้วย เปลี่ยน 70 ในบรรทัด 12 เป็น 2 และดูที่แถวบนสุดของภาพเพื่อดูว่าฉันหมายถึงอะไร
และไม่ว่าคุณจะใช้ภาพ JPEG ใด คุณจะพบรูปแบบหมากรุกลึกลับเหล่านี้เสมอเมื่อแก้ไขไบต์
เมื่อเล่นกับโปรแกรมแก้ไข เป็นเรื่องยากที่จะเข้าใจว่าภาพถ่ายถูกสร้างขึ้นใหม่จากไบต์เหล่านี้อย่างไร เนื่องจากการบีบอัด JPEG ประกอบด้วยเทคโนโลยีที่แตกต่างกันสามแบบ ซึ่งนำไปใช้ตามลำดับในระดับ เราจะศึกษาแต่ละรายการแยกกันเพื่อเปิดเผยพฤติกรรมลึกลับที่เราเห็น
การบีบอัด JPEG สามระดับ:
การสุ่มตัวอย่างสี .การแปลงโคไซน์แบบไม่ต่อเนื่องและการสุ่มตัวอย่าง .เรียกใช้การเข้ารหัสความยาว ,เดลต้า иฮัฟฟ์แมน
เพื่อให้เข้าใจถึงขนาดของการบีบอัด โปรดทราบว่ารูปภาพด้านบนแทนตัวเลข 79 หรือประมาณ 819 KB หากเราเก็บไว้โดยไม่มีการบีบอัด แต่ละพิกเซลจะต้องใช้ตัวเลขสามตัว - สำหรับส่วนประกอบสีแดง เขียว และน้ำเงิน มีจำนวน 79 หมายเลข หรือประมาณ. 917 KB. ผลจากการบีบอัด JPEG ทำให้ไฟล์สุดท้ายลดลงมากกว่า 700 เท่า!
ที่จริงแล้วภาพนี้สามารถบีบอัดได้มากกว่านั้นมาก ด้านล่างนี้คือรูปภาพสองรูปเคียงข้างกัน - รูปภาพทางด้านขวาถูกบีบอัดเป็น 16 KB ซึ่งก็คือเล็กกว่าเวอร์ชันที่ไม่มีการบีบอัดถึง 57 เท่า!
หากมองใกล้ ๆ จะเห็นว่าภาพเหล่านี้ไม่เหมือนกัน ทั้งสองภาพเป็นภาพที่มีการบีบอัด JPEG แต่ภาพด้านขวาจะมีปริมาณน้อยกว่ามาก นอกจากนี้ยังดูแย่ลงอีกเล็กน้อย (ดูที่สี่เหลี่ยมสีพื้นหลัง) นั่นเป็นเหตุผลว่าทำไม JPEG จึงถูกเรียกว่าการบีบอัดแบบสูญเสียข้อมูล ในระหว่างขั้นตอนการบีบอัด รูปภาพจะเปลี่ยนไปและสูญเสียรายละเอียดบางส่วนไป
1. การสุ่มตัวอย่างสี
นี่คือรูปภาพที่มีการบีบอัดระดับแรกเท่านั้น
(รุ่นอินเทอร์แอคทีฟ-อิน
ตอนนี้ตัวเลขถอดรหัสได้ง่ายขึ้นเล็กน้อย นี่เป็นรายการสีที่แทบจะเป็นรายการง่ายๆ โดยแต่ละไบต์จะเปลี่ยนหนึ่งพิกเซลอย่างแน่นอน แต่ในขณะเดียวกันก็มีขนาดเป็นครึ่งหนึ่งของรูปภาพที่ไม่มีการบีบอัดอยู่แล้ว (ซึ่งจะใช้เวลาประมาณ 300 KB ในขนาดที่ลดลงนี้) คุณเดาได้ไหมว่าทำไม?
คุณจะเห็นว่าตัวเลขเหล่านี้ไม่ได้แสดงถึงองค์ประกอบมาตรฐานของสีแดง เขียว และน้ำเงิน เนื่องจากหากเราแทนที่ตัวเลขทั้งหมดด้วยศูนย์ เราจะได้ภาพสีเขียว (แทนที่จะเป็นสีขาว)
เนื่องจากไบต์เหล่านี้ย่อมาจาก Y (ความสว่าง)
Cb (ความสีน้ำเงินสัมพัทธ์)
และรูปภาพ Cr (รอยแดงสัมพันธ์)
ทำไมไม่ใช้ RGB? ท้ายที่สุดนี่คือวิธีการทำงานของหน้าจอที่ทันสมัยที่สุด จอภาพของคุณสามารถแสดงสีใดก็ได้ รวมถึงสีแดง เขียว และน้ำเงิน โดยมีความเข้มที่แตกต่างกันสำหรับแต่ละพิกเซล สีขาวได้มาจากการเปิดทั้งสามอย่างด้วยความสว่างเต็มที่ และสีดำโดยการปิด
ซึ่งคล้ายกับวิธีการทำงานของดวงตามนุษย์มาก ตัวรับสีในดวงตาของเราเรียกว่า "
นี่คือสาเหตุที่ดวงตาของเราตรวจจับการเปลี่ยนแปลงของความสว่างได้ดีกว่าการเปลี่ยนแปลงของสีมาก หากคุณแยกสีออกจากความสว่าง คุณสามารถลบสีเล็กๆ น้อยๆ ออกได้ และจะไม่มีใครสังเกตเห็นอะไรเลย การสุ่มตัวอย่างโครเมียมเป็นกระบวนการแสดงองค์ประกอบสีของภาพที่ความละเอียดต่ำกว่าองค์ประกอบความสว่าง ในตัวอย่างข้างต้น แต่ละพิกเซลมีองค์ประกอบ Y หนึ่งส่วนพอดี และแต่ละกลุ่มที่มีสี่พิกเซลจะมีองค์ประกอบ Cb หนึ่งรายการและองค์ประกอบ Cr หนึ่งรายการเท่านั้น ดังนั้นรูปภาพจึงมีข้อมูลสีน้อยกว่าต้นฉบับถึงสี่เท่า
พื้นที่สี YCbCr ไม่ได้ใช้เฉพาะใน JPEG เท่านั้น มันถูกประดิษฐ์ขึ้นครั้งแรกในปี 1938 สำหรับรายการโทรทัศน์ ไม่ใช่ทุกคนที่มีทีวีสี ดังนั้นการแยกสีและความสว่างทำให้ทุกคนได้รับสัญญาณเดียวกัน และทีวีที่ไม่มีสีก็ใช้เพียงส่วนประกอบความสว่างเท่านั้น
ดังนั้นการลบตัวเลขหนึ่งตัวออกจากเครื่องมือแก้ไขจะทำลายสีทั้งหมดโดยสิ้นเชิง ส่วนประกอบจะถูกจัดเก็บในรูปแบบ YYYY Cb Cr (อันที่จริง ไม่จำเป็นต้องเรียงตามลำดับนั้น - ลำดับการจัดเก็บระบุไว้ในส่วนหัวของไฟล์) การลบตัวเลขแรกออกจะทำให้ค่าแรกของ Cb ถูกมองว่าเป็น Y, Cr เป็น Cb และโดยทั่วไป คุณจะมีเอฟเฟกต์โดมิโนที่จะเปลี่ยนสีทั้งหมดของภาพ
ข้อกำหนด JPEG ไม่ได้บังคับให้คุณใช้ YCbCr แต่ไฟล์ส่วนใหญ่ใช้มันเพราะมันสร้างภาพดาวน์แซมเพิลได้ดีกว่า RGB แต่คุณไม่จำเป็นต้องเชื่อคำพูดของฉัน ดูด้วยตัวคุณเองในตารางด้านล่างว่าการสุ่มตัวอย่างย่อยของแต่ละองค์ประกอบจะมีลักษณะอย่างไรทั้งใน RGB และ YCbCr
(รุ่นอินเทอร์แอคทีฟ-อิน
การที่สีน้ำเงินหลุดออกนั้นไม่เด่นชัดเท่าสีแดงหรือสีเขียว นั่นเป็นเพราะกรวยจำนวน 64 ล้านชิ้นในดวงตาของคุณ ประมาณ 32% มีความไวต่อสีแดง 2% เป็นสีเขียว และ XNUMX% เป็นสีน้ำเงิน
การสุ่มตัวอย่างต่ำขององค์ประกอบ Y (ซ้ายล่าง) จะเห็นได้ดีที่สุด แม้แต่การเปลี่ยนแปลงเล็กน้อยก็ยังเห็นได้ชัดเจน
การแปลงรูปภาพจาก RGB เป็น YCbCr จะไม่ลดขนาดไฟล์ แต่ช่วยให้ค้นหารายละเอียดที่มองเห็นได้น้อยซึ่งสามารถลบออกได้ง่ายขึ้น การบีบอัดแบบสูญเสียจะเกิดขึ้นในระยะที่สอง มีพื้นฐานมาจากแนวคิดในการนำเสนอข้อมูลในรูปแบบที่บีบอัดได้มากขึ้น
2. การแปลงและการสุ่มตัวอย่างโคไซน์แบบไม่ต่อเนื่อง
การบีบอัดระดับนี้โดยส่วนใหญ่แล้วคือความหมายของ JPEG หลังจากแปลงสีเป็น YCbCr แล้ว ส่วนประกอบต่างๆ จะถูกบีบอัดแยกกัน ดังนั้น เราจึงสามารถมุ่งเน้นไปที่องค์ประกอบ Y เท่านั้น และนี่คือลักษณะของไบต์ขององค์ประกอบ Y หลังจากใช้เลเยอร์นี้
(รุ่นอินเทอร์แอคทีฟ-อิน
เมื่อมองแวบแรกดูเหมือนว่าการบีบอัดจะแย่มาก รูปภาพมีจำนวน 100 พิกเซล และต้องใช้ตัวเลข 000 ตัวจึงจะแสดงความสว่าง (องค์ประกอบ Y) ซึ่งแย่กว่าการบีบอัดอะไรเลย!
อย่างไรก็ตาม โปรดทราบว่าตัวเลขเหล่านี้ส่วนใหญ่เป็นศูนย์ นอกจากนี้ ศูนย์ทั้งหมดที่ท้ายบรรทัดสามารถลบออกได้โดยไม่ต้องเปลี่ยนรูปภาพ เหลืออีกประมาณ 26 หมายเลข ซึ่งน้อยกว่าเกือบ 000 เท่า!
ระดับนี้มีความลับของรูปแบบหมากรุก ไม่เหมือนกับเอฟเฟกต์อื่นๆ ที่เราเคยเห็น การปรากฏตัวของรูปแบบเหล่านี้ไม่ใช่ข้อผิดพลาด สิ่งเหล่านี้คือองค์ประกอบสำคัญของภาพทั้งหมด แต่ละบรรทัดของเครื่องมือแก้ไขมีตัวเลข 64 ตัวพอดี ซึ่งเป็นค่าสัมประสิทธิ์การแปลงโคไซน์แบบไม่ต่อเนื่อง (DCT) ที่สอดคล้องกับความเข้มของรูปแบบที่ไม่ซ้ำกัน 64 รูปแบบ
รูปแบบเหล่านี้เกิดขึ้นจากพล็อตโคไซน์ นี่คือลักษณะบางส่วน:
อัตราต่อรอง 8 จาก 64
ด้านล่างนี้เป็นภาพที่แสดงทั้งหมด 64 รูปแบบ
(รุ่นอินเทอร์แอคทีฟ-อิน
รูปแบบเหล่านี้มีความสำคัญเป็นพิเศษเนื่องจากเป็นพื้นฐานของภาพขนาด 8x8 หากคุณไม่คุ้นเคยกับพีชคณิตเชิงเส้น นั่นหมายความว่าภาพขนาด 8x8 ใดๆ ก็สามารถสร้างจากรูปแบบ 64 รูปแบบเหล่านี้ได้ DCT เป็นกระบวนการแบ่งภาพออกเป็นบล็อกขนาด 8x8 และแปลงแต่ละบล็อกเป็นค่าผสมของค่าสัมประสิทธิ์ 64 ค่าเหล่านี้
ดูเหมือนเป็นเวทย์มนตร์ที่ภาพใดๆ ก็ตามสามารถประกอบด้วยรูปแบบเฉพาะได้ถึง 64 รูปแบบ อย่างไรก็ตาม นี่ก็เหมือนกับการบอกว่าสถานที่ใดๆ บนโลกสามารถอธิบายได้ด้วยตัวเลขสองตัว คือ ละติจูดและลองจิจูด [ซึ่งหมายถึงซีกโลก / ประมาณ แปล]. เรามักคิดว่าพื้นผิวโลกเป็นแบบสองมิติ ดังนั้นเราจึงต้องการเพียงตัวเลขสองตัวเท่านั้น รูปภาพขนาด 8x8 มี 64 ขนาด ดังนั้นเราจึงต้องมีตัวเลข 64 ตัว
ยังไม่ชัดเจนว่าสิ่งนี้ช่วยเราได้อย่างไรในแง่ของการบีบอัด หากเราต้องการตัวเลข 64 ตัวเพื่อแสดงภาพขนาด 8x8 เหตุใดจึงดีกว่าการเก็บองค์ประกอบความสว่าง 64 ชิ้น เราทำเช่นนี้ด้วยเหตุผลเดียวกันกับที่เราเปลี่ยนตัวเลข RGB สามตัวให้เป็นตัวเลข YCbCr สามตัว: ช่วยให้เราสามารถลบรายละเอียดที่ละเอียดอ่อนได้
เป็นการยากที่จะดูว่ารายละเอียดใดบ้างที่ถูกลบออกไปในขั้นตอนนี้ เนื่องจาก JPEG ใช้ DCT กับบล็อกขนาด 8x8 อย่างไรก็ตามไม่มีใครห้ามไม่ให้เรานำไปใช้กับภาพรวมทั้งหมด ต่อไปนี้คือลักษณะของ DCT สำหรับองค์ประกอบ Y ที่ใช้กับภาพรวมทั้งหมด:
สามารถลบหมายเลขได้มากกว่า 60 หมายเลขออกจากส่วนท้าย โดยแทบไม่มีการเปลี่ยนแปลงใดๆ ที่เห็นได้ชัดเจนในภาพถ่าย
อย่างไรก็ตาม โปรดทราบว่าหากเราลบตัวเลขห้าตัวแรกเป็นศูนย์ ความแตกต่างก็จะชัดเจน
ตัวเลขที่จุดเริ่มต้นแสดงถึงการเปลี่ยนแปลงความถี่ต่ำในภาพ ซึ่งสายตาของเรามองเห็นได้ดีที่สุด ตัวเลขที่อยู่ด้านท้ายบ่งบอกถึงการเปลี่ยนแปลงในความถี่สูงที่สังเกตเห็นได้ยากกว่า หากต้องการ "มองเห็นสิ่งที่ตาไม่สามารถมองเห็น" เราสามารถแยกรายละเอียดความถี่สูงเหล่านี้ได้โดยการกำหนดให้ตัวเลข 5000 ตัวแรกเป็นศูนย์
เราเห็นทุกพื้นที่ของภาพที่มีการเปลี่ยนแปลงครั้งใหญ่ที่สุดจากพิกเซลหนึ่งไปอีกพิกเซล ดวงตาของแมว หนวด ผ้าห่มเทอร์รี่ และเงาที่มุมซ้ายล่างโดดเด่น คุณสามารถไปต่อได้โดยการศูนย์ตัวเลข 10 ตัวแรก:
20:
40:
60:
รายละเอียดความถี่สูงเหล่านี้จะถูกลบโดย JPEG ในระหว่างขั้นตอนการบีบอัด การแปลงสีเป็นค่าสัมประสิทธิ์ DCT ไม่มีการสูญเสีย การสูญเสียเกิดขึ้นในขั้นตอนการสุ่มตัวอย่าง โดยที่ค่าความถี่สูงหรือใกล้ศูนย์จะถูกลบออก เมื่อคุณลดคุณภาพการบันทึก JPEG โปรแกรมจะเพิ่มเกณฑ์สำหรับจำนวนค่าที่ถูกลบซึ่งจะลดขนาดไฟล์ แต่ทำให้รูปภาพมีพิกเซลมากขึ้น นั่นเป็นเหตุผลว่าทำไมภาพในส่วนแรก ซึ่งเล็กกว่า 57 เท่า จึงมีลักษณะเช่นนี้ บล็อก 8x8 แต่ละบล็อกมีค่าสัมประสิทธิ์ DCT น้อยกว่ามากเมื่อเทียบกับเวอร์ชันคุณภาพสูงกว่า
คุณสามารถสร้างเอฟเฟกต์เจ๋งๆ ได้ เช่น การสตรีมรูปภาพแบบค่อยเป็นค่อยไป คุณสามารถแสดงภาพเบลอที่มีรายละเอียดมากขึ้นเรื่อยๆ เมื่อมีการดาวน์โหลดค่าสัมประสิทธิ์มากขึ้นเรื่อยๆ
เพื่อความสนุก นี่คือสิ่งที่คุณจะได้รับจากการใช้หมายเลขเพียง 24 หมายเลข:
หรือเพียง 5000:
เบลอมาก แต่ก็จำได้!
3. การเข้ารหัสความยาวรัน เดลต้า และฮัฟฟ์แมน
จนถึงตอนนี้การบีบอัดทุกขั้นตอนยังสูญเสียไป ในทางกลับกัน ขั้นตอนสุดท้ายดำเนินไปโดยไม่มีการสูญเสีย มันไม่ได้ลบข้อมูล แต่จะลดขนาดไฟล์ลงอย่างมาก
คุณจะบีบอัดบางสิ่งโดยไม่ทิ้งข้อมูลได้อย่างไร? ลองนึกภาพว่าเราจะอธิบายสี่เหลี่ยมผืนผ้าสีดำเรียบง่ายขนาด 700 x 437 ได้อย่างไร
JPEG ใช้ตัวเลข 5000 สำหรับสิ่งนี้ แต่สามารถได้ผลลัพธ์ที่ดีกว่ามาก คุณลองจินตนาการถึงรูปแบบการเข้ารหัสที่จะอธิบายภาพดังกล่าวในขนาดไม่กี่ไบต์ที่สุดเท่าที่จะเป็นไปได้ได้หรือไม่?
รูปแบบขั้นต่ำที่ฉันคิดได้นั้นใช้สี่: สามเพื่อแสดงสี และหนึ่งในสี่เพื่อระบุจำนวนพิกเซลของสีนั้น แนวคิดในการแสดงค่าที่ซ้ำกันในลักษณะย่อนี้เรียกว่าการเข้ารหัสความยาวรัน ไม่มีการสูญเสียเนื่องจากเราสามารถกู้คืนข้อมูลที่เข้ารหัสให้เป็นรูปแบบดั้งเดิมได้
ไฟล์ JPEG ที่มีสี่เหลี่ยมสีดำมีขนาดใหญ่กว่า 4 ไบต์มาก โปรดจำไว้ว่าที่ระดับ DCT การบีบอัดจะมีผลกับบล็อกขนาด 8x8 พิกเซล ดังนั้น อย่างน้อยที่สุด เราจำเป็นต้องมีค่าสัมประสิทธิ์ DCT หนึ่งค่าสำหรับทุกๆ 64 พิกเซล เราต้องการข้อมูลหนึ่งเพราะแทนที่จะเก็บค่าสัมประสิทธิ์ DCT หนึ่งตัวตามด้วยศูนย์ 63 ตัว การเข้ารหัสความยาวรันช่วยให้เราจัดเก็บตัวเลขได้หนึ่งตัวและระบุว่า "ที่เหลือทั้งหมดเป็นศูนย์"
การเข้ารหัสแบบเดลต้าเป็นเทคนิคที่แต่ละไบต์มีความแตกต่างจากค่าบางค่า แทนที่จะเป็นค่าสัมบูรณ์ ดังนั้น การแก้ไขบางไบต์จะเปลี่ยนสีของพิกเซลอื่นๆ ทั้งหมด เช่นแทนที่จะเก็บ
12 13 14 14 14 13 13 14
เราสามารถเริ่มต้นด้วย 12 แล้วระบุจำนวนเงินที่เราต้องบวกหรือลบเพื่อให้ได้ตัวเลขถัดไป และลำดับนี้ในการเข้ารหัสเดลต้าจะอยู่ในรูปแบบ:
12 1 1 0 0 -1 0 1
ข้อมูลที่แปลงแล้วไม่เล็กกว่าข้อมูลต้นฉบับ แต่จะบีบอัดได้ง่ายกว่า การใช้การเข้ารหัสเดลต้าก่อนการเข้ารหัสความยาวรันสามารถช่วยได้มากในขณะที่ยังคงเป็นการบีบอัดแบบไม่สูญเสียข้อมูล
การเขียนโค้ดแบบเดลต้าเป็นหนึ่งในเทคนิคไม่กี่เทคนิคที่ใช้นอกบล็อกขนาด 8x8 จากค่าสัมประสิทธิ์ DCT 64 ค่า ค่าหนึ่งเป็นเพียงฟังก์ชันคลื่นคงที่ (สีทึบ) โดยแสดงถึงความสว่างเฉลี่ยของแต่ละบล็อกสำหรับส่วนประกอบ Luma หรือค่าสีน้ำเงินเฉลี่ยสำหรับส่วนประกอบ Cb และอื่นๆ ค่าแรกของแต่ละบล็อก DCT เรียกว่าค่า DC และค่า DC แต่ละค่าจะถูกเข้ารหัสแบบเดลต้าเทียบกับค่าก่อนหน้า ดังนั้นการเปลี่ยนความสว่างของบล็อคแรกจะส่งผลต่อบล็อคทั้งหมด
ความลึกลับสุดท้ายยังคงอยู่: การเปลี่ยนเอกพจน์ทำลายภาพรวมทั้งหมดได้อย่างไร? จนถึงขณะนี้ระดับการบีบอัดยังไม่มีคุณสมบัติดังกล่าว คำตอบอยู่ในส่วนหัวของ JPEG 500 ไบต์แรกมีข้อมูลเมตาเกี่ยวกับรูปภาพ เช่น ความกว้าง ความสูง ฯลฯ และเรายังยังไม่ได้ดำเนินการแก้ไข
หากไม่มีส่วนหัว แทบจะเป็นไปไม่ได้เลย (หรือยากมาก) ที่จะถอดรหัส JPEG มันจะดูราวกับว่าฉันกำลังพยายามอธิบายภาพให้คุณฟังและฉันก็เริ่มประดิษฐ์คำศัพท์เพื่อถ่ายทอดความประทับใจของฉัน คำอธิบายอาจจะค่อนข้างกระชับเนื่องจากฉันสามารถประดิษฐ์คำที่มีความหมายตรงกับที่ฉันต้องการสื่อได้ แต่สำหรับคนอื่นๆ คำเหล่านั้นจะไม่สมเหตุสมผล
มันฟังดูงี่เง่า แต่นั่นคือสิ่งที่เกิดขึ้น รูปภาพ JPEG แต่ละภาพจะถูกบีบอัดด้วยโค้ดเฉพาะของมัน พจนานุกรมรหัสถูกจัดเก็บไว้ในส่วนหัว เทคนิคนี้เรียกว่ารหัส Huffman และคำศัพท์เรียกว่าตาราง Huffman ในส่วนหัว ตารางจะมีเครื่องหมายสองไบต์ - 255 และ 196 แต่ละองค์ประกอบสีสามารถมีตารางของตัวเองได้
การเปลี่ยนแปลงตารางจะส่งผลต่อรูปภาพอย่างรุนแรง ตัวอย่างที่ดีคือเปลี่ยนบรรทัดที่ 15 เป็น 1
สิ่งนี้เกิดขึ้นเนื่องจากตารางระบุว่าควรอ่านแต่ละบิตอย่างไร จนถึงตอนนี้เราได้ทำงานกับเลขฐานสองในรูปแบบทศนิยมเท่านั้น แต่สิ่งนี้ปิดบังเราจากความจริงที่ว่าหากคุณต้องการเก็บหมายเลข 1 ในไบต์ มันจะมีลักษณะเป็น 00000001 เนื่องจากแต่ละไบต์จะต้องมีแปดบิตพอดี แม้ว่าจะจำเป็นต้องใช้เพียงหนึ่งในนั้นก็ตาม
นี่อาจเป็นการสิ้นเปลืองพื้นที่อย่างมากหากคุณมีตัวเลขน้อยจำนวนมาก รหัส Huffman เป็นเทคนิคที่ช่วยให้เราสามารถผ่อนคลายข้อกำหนดที่ว่าแต่ละหมายเลขต้องมีแปดบิต ซึ่งหมายความว่าหากคุณเห็นสองไบต์:
234 115
จากนั้น ขึ้นอยู่กับตาราง Huffman ตัวเลขเหล่านี้อาจเป็นตัวเลขสามตัว หากต้องการแยกออก คุณต้องแยกออกเป็นแต่ละบิตก่อน:
11101010 01110011
จากนั้นเราดูที่ตารางเพื่อหาวิธีจัดกลุ่มพวกมัน ตัวอย่างเช่น อาจเป็นหกบิตแรก (111010) หรือ 58 ในรูปทศนิยม ตามด้วยห้าบิต (10011) หรือ 19 และสุดท้ายคือสี่บิตสุดท้าย (0011) หรือ 3
ดังนั้นจึงเป็นเรื่องยากมากที่จะเข้าใจไบต์ในขั้นตอนการบีบอัดนี้ ไบต์ไม่ได้แสดงถึงสิ่งที่พวกเขาเห็น ฉันจะไม่ลงรายละเอียดเกี่ยวกับการทำงานกับตารางในบทความนี้แต่
เคล็ดลับที่น่าสนใจประการหนึ่งที่คุณสามารถทำได้ด้วยความรู้นี้คือการแยกส่วนหัวออกจาก JPEG และจัดเก็บแยกกัน ที่จริงแล้วปรากฎว่ามีเพียงคุณเท่านั้นที่สามารถอ่านไฟล์ได้ Facebook ทำสิ่งนี้เพื่อทำให้ไฟล์มีขนาดเล็กลง
สิ่งอื่นที่สามารถทำได้คือเปลี่ยนตาราง Huffman ไม่น้อย สำหรับบางคนก็จะดูเหมือนเป็นภาพที่แตกหัก และมีเพียงคุณเท่านั้นที่จะรู้วิธีแก้ไขอย่างมหัศจรรย์
สรุป: แล้วสิ่งที่จำเป็นสำหรับการถอดรหัส JPEG คืออะไร? จำเป็น:
- แยกตาราง Huffman ออกจากส่วนหัวและถอดรหัสบิต
- แยกค่าสัมประสิทธิ์การแปลงโคไซน์แบบไม่ต่อเนื่องสำหรับแต่ละสีและส่วนประกอบความสว่างสำหรับบล็อก 8x8 แต่ละบล็อก โดยทำการแปลงความยาวรันแบบผกผันและการแปลงการเข้ารหัสเดลต้า
- รวมโคไซน์ตามค่าสัมประสิทธิ์เพื่อให้ได้ค่าพิกเซลสำหรับแต่ละบล็อก 8x8
- ปรับขนาดส่วนประกอบสีหากดำเนินการสุ่มตัวอย่าง (ข้อมูลนี้อยู่ในส่วนหัว)
- แปลงค่า YCbCr ที่ได้สำหรับแต่ละพิกเซลเป็น RGB
- แสดงภาพบนหน้าจอ!
งานจริงจังแค่ถ่ายรูปกับแมว! อย่างไรก็ตาม สิ่งที่ฉันชอบก็คือมันแสดงให้เห็นว่าเทคโนโลยี JPEG ที่ยึดมนุษย์เป็นศูนย์กลางเป็นอย่างไร มันขึ้นอยู่กับลักษณะเฉพาะของการรับรู้ของเรา ทำให้เราสามารถบีบอัดได้ดีกว่าเทคโนโลยีทั่วไปมาก และตอนนี้เราเข้าใจวิธีการทำงานของ JPEG แล้ว เราก็จินตนาการได้ว่าเทคโนโลยีเหล่านี้สามารถถ่ายโอนไปยังพื้นที่อื่นได้อย่างไร ตัวอย่างเช่น การเข้ารหัสแบบเดลต้าในวิดีโอสามารถช่วยลดขนาดไฟล์ได้อย่างมาก เนื่องจากมักจะมีพื้นที่ทั้งหมดที่ไม่เปลี่ยนจากเฟรมหนึ่งไปอีกเฟรมหนึ่ง (เช่น พื้นหลัง)
ที่มา: will.com