รูปแบบ JPEG ทำงานอย่างไร

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

รูปแบบ JPEG ทำงานอย่างไร

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

เพื่อแก้ไขปัญหานี้ ในปี พ.ศ. 1986 ได้มีการประชุมคณะกรรมการผู้เชี่ยวชาญจากทั่วโลกเรียกว่า "กลุ่มผู้เชี่ยวชาญด้านการถ่ายภาพร่วม» (Joint Photographic Experts Group, JPEG) ก่อตั้งขึ้นโดยความร่วมมือระหว่างองค์การระหว่างประเทศเพื่อการมาตรฐาน (ISO) และคณะกรรมการเทคนิคไฟฟ้าระหว่างประเทศ (IEC) ซึ่งเป็นองค์กรมาตรฐานสากลสองแห่งที่มีสำนักงานใหญ่ในกรุงเจนีวา ประเทศสวิตเซอร์แลนด์

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

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

นอกจากนี้การเล่นภาพในลักษณะนี้ก็น่าสนใจมาก

รูปแบบ JPEG ทำงานอย่างไร

มองเข้าไปข้างใน JPEG

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

หากคุณดาวน์โหลดอันแสนหวานนี้ รูปถ่ายของแมว และเปิดมันในโปรแกรมแก้ไขข้อความ คุณจะเห็นอักขระที่ไม่ต่อเนื่องกันมากมาย

รูปแบบ JPEG ทำงานอย่างไร
ที่นี่ฉันใช้ Notepad++ เพื่อตรวจสอบเนื้อหาของไฟล์ เนื่องจากโปรแกรมแก้ไขข้อความทั่วไป เช่น Notepad บน Windows จะทำให้ไฟล์ไบนารีเสียหายหลังจากบันทึก และจะไม่เป็นไปตามรูปแบบ JPEG อีกต่อไป

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

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

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

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

รูปแบบ JPEG ทำงานอย่างไร

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

สิ่งที่แปลกเกี่ยวกับตัวอย่างนี้คือการเปลี่ยนตัวเลขบางตัวไม่ส่งผลกระทบต่อภาพเลย แต่เช่น หากคุณแทนที่หมายเลข 17 ด้วย 0 ในบรรทัดแรก รูปภาพจะเสียหายโดยสิ้นเชิง!

รูปแบบ JPEG ทำงานอย่างไร

การเปลี่ยนแปลงอื่นๆ เช่น การแทนที่เลข 7 ในบรรทัดปี 1988 ด้วยหมายเลข 254 จะเปลี่ยนสี แต่เฉพาะพิกเซลที่ตามมาเท่านั้น

รูปแบบ JPEG ทำงานอย่างไร

บางทีสิ่งที่แปลกประหลาดที่สุดคือตัวเลขบางตัวไม่เพียงแต่เปลี่ยนสี แต่ยังเปลี่ยนรูปร่างของภาพด้วย เปลี่ยน 70 ในบรรทัด 12 เป็น 2 และดูที่แถวบนสุดของภาพเพื่อดูว่าฉันหมายถึงอะไร

รูปแบบ JPEG ทำงานอย่างไร

และไม่ว่าคุณจะใช้ภาพ JPEG ใด คุณจะพบรูปแบบหมากรุกลึกลับเหล่านี้เสมอเมื่อแก้ไขไบต์

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

การบีบอัด JPEG สามระดับ:

  1. การสุ่มตัวอย่างสี.
  2. การแปลงโคไซน์แบบไม่ต่อเนื่องและการสุ่มตัวอย่าง.
  3. เรียกใช้การเข้ารหัสความยาว, เดลต้า и ฮัฟฟ์แมน

เพื่อให้เข้าใจถึงขนาดของการบีบอัด โปรดทราบว่ารูปภาพด้านบนแทนตัวเลข 79 หรือประมาณ 819 KB หากเราเก็บไว้โดยไม่มีการบีบอัด แต่ละพิกเซลจะต้องใช้ตัวเลขสามตัว - สำหรับส่วนประกอบสีแดง เขียว และน้ำเงิน มีจำนวน 79 หมายเลข หรือประมาณ. 917 KB. ผลจากการบีบอัด JPEG ทำให้ไฟล์สุดท้ายลดลงมากกว่า 700 เท่า!

ที่จริงแล้วภาพนี้สามารถบีบอัดได้มากกว่านั้นมาก ด้านล่างนี้คือรูปภาพสองรูปเคียงข้างกัน - รูปภาพทางด้านขวาถูกบีบอัดเป็น 16 KB ซึ่งก็คือเล็กกว่าเวอร์ชันที่ไม่มีการบีบอัดถึง 57 เท่า!

รูปแบบ JPEG ทำงานอย่างไร

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

1. การสุ่มตัวอย่างสี

นี่คือรูปภาพที่มีการบีบอัดระดับแรกเท่านั้น

รูปแบบ JPEG ทำงานอย่างไร
(รุ่นอินเทอร์แอคทีฟ-อิน ต้นฉบับ บทความ) การลบหมายเลขหนึ่งจะทำลายทุกสี อย่างไรก็ตาม หากลบตัวเลขออกทั้งหมดหกหมายเลข แทบไม่มีผลกระทบต่อภาพ

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

คุณจะเห็นว่าตัวเลขเหล่านี้ไม่ได้แสดงถึงองค์ประกอบมาตรฐานของสีแดง เขียว และน้ำเงิน เนื่องจากหากเราแทนที่ตัวเลขทั้งหมดด้วยศูนย์ เราจะได้ภาพสีเขียว (แทนที่จะเป็นสีขาว)

รูปแบบ JPEG ทำงานอย่างไร

เนื่องจากไบต์เหล่านี้ย่อมาจาก Y (ความสว่าง)

รูปแบบ JPEG ทำงานอย่างไร

Cb (ความสีน้ำเงินสัมพัทธ์)

รูปแบบ JPEG ทำงานอย่างไร

และรูปภาพ Cr (รอยแดงสัมพันธ์)

รูปแบบ JPEG ทำงานอย่างไร

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

รูปแบบ JPEG ทำงานอย่างไร

ซึ่งคล้ายกับวิธีการทำงานของดวงตามนุษย์มาก ตัวรับสีในดวงตาของเราเรียกว่า "กรวย“ และแบ่งออกเป็น 3 ประเภท โดยแต่ละประเภทจะมีความไวต่อสีแดง เขียว หรือน้ำเงินมากกว่า [กรวยชนิด S จะไวต่อสีม่วงอมฟ้า (S จากภาษาอังกฤษ Short - สเปกตรัมคลื่นสั้น), M -type - ในสีเขียว-เหลือง (M จาก English Medium - คลื่นกลาง) และ L-type - ในส่วนของสีเหลือง-แดง (L จาก English Long - คลื่นยาว) ของสเปกตรัม การมีอยู่ของกรวยทั้งสามประเภทนี้ (และแท่งซึ่งไวต่อสเปกตรัมสีเขียวมรกต) ทำให้บุคคลมองเห็นสีได้ / ประมาณ. แปล]. แท่งซึ่งเป็นเซลล์รับแสงอีกประเภทหนึ่งในดวงตาของเรา สามารถตรวจจับการเปลี่ยนแปลงของความสว่างได้ แต่มีความไวต่อสีมากกว่ามาก ดวงตาของเรามีแท่งประมาณ 120 ล้านแท่ง และมีกรวยเพียง 6 ล้านแท่ง

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

พื้นที่สี YCbCr ไม่ได้ใช้เฉพาะใน JPEG เท่านั้น มันถูกประดิษฐ์ขึ้นครั้งแรกในปี 1938 สำหรับรายการโทรทัศน์ ไม่ใช่ทุกคนที่มีทีวีสี ดังนั้นการแยกสีและความสว่างทำให้ทุกคนได้รับสัญญาณเดียวกัน และทีวีที่ไม่มีสีก็ใช้เพียงส่วนประกอบความสว่างเท่านั้น

ดังนั้นการลบตัวเลขหนึ่งตัวออกจากเครื่องมือแก้ไขจะทำลายสีทั้งหมดโดยสิ้นเชิง ส่วนประกอบจะถูกจัดเก็บในรูปแบบ YYYY Cb Cr (อันที่จริง ไม่จำเป็นต้องเรียงตามลำดับนั้น - ลำดับการจัดเก็บระบุไว้ในส่วนหัวของไฟล์) การลบตัวเลขแรกออกจะทำให้ค่าแรกของ Cb ถูกมองว่าเป็น Y, Cr เป็น Cb และโดยทั่วไป คุณจะมีเอฟเฟกต์โดมิโนที่จะเปลี่ยนสีทั้งหมดของภาพ

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

รูปแบบ JPEG ทำงานอย่างไร
(รุ่นอินเทอร์แอคทีฟ-อิน ต้นฉบับ บทความ)

การที่สีน้ำเงินหลุดออกนั้นไม่เด่นชัดเท่าสีแดงหรือสีเขียว นั่นเป็นเพราะกรวยจำนวน 64 ล้านชิ้นในดวงตาของคุณ ประมาณ 32% มีความไวต่อสีแดง 2% เป็นสีเขียว และ XNUMX% เป็นสีน้ำเงิน

การสุ่มตัวอย่างต่ำขององค์ประกอบ Y (ซ้ายล่าง) จะเห็นได้ดีที่สุด แม้แต่การเปลี่ยนแปลงเล็กน้อยก็ยังเห็นได้ชัดเจน

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

2. การแปลงและการสุ่มตัวอย่างโคไซน์แบบไม่ต่อเนื่อง

การบีบอัดระดับนี้โดยส่วนใหญ่แล้วคือความหมายของ JPEG หลังจากแปลงสีเป็น YCbCr แล้ว ส่วนประกอบต่างๆ จะถูกบีบอัดแยกกัน ดังนั้น เราจึงสามารถมุ่งเน้นไปที่องค์ประกอบ Y เท่านั้น และนี่คือลักษณะของไบต์ขององค์ประกอบ Y หลังจากใช้เลเยอร์นี้

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

เมื่อมองแวบแรกดูเหมือนว่าการบีบอัดจะแย่มาก รูปภาพมีจำนวน 100 พิกเซล และต้องใช้ตัวเลข 000 ตัวจึงจะแสดงความสว่าง (องค์ประกอบ Y) ซึ่งแย่กว่าการบีบอัดอะไรเลย!

อย่างไรก็ตาม โปรดทราบว่าตัวเลขเหล่านี้ส่วนใหญ่เป็นศูนย์ นอกจากนี้ ศูนย์ทั้งหมดที่ท้ายบรรทัดสามารถลบออกได้โดยไม่ต้องเปลี่ยนรูปภาพ เหลืออีกประมาณ 26 หมายเลข ซึ่งน้อยกว่าเกือบ 000 เท่า!

ระดับนี้มีความลับของรูปแบบหมากรุก ไม่เหมือนกับเอฟเฟกต์อื่นๆ ที่เราเคยเห็น การปรากฏตัวของรูปแบบเหล่านี้ไม่ใช่ข้อผิดพลาด สิ่งเหล่านี้คือองค์ประกอบสำคัญของภาพทั้งหมด แต่ละบรรทัดของเครื่องมือแก้ไขมีตัวเลข 64 ตัวพอดี ซึ่งเป็นค่าสัมประสิทธิ์การแปลงโคไซน์แบบไม่ต่อเนื่อง (DCT) ที่สอดคล้องกับความเข้มของรูปแบบที่ไม่ซ้ำกัน 64 รูปแบบ

รูปแบบเหล่านี้เกิดขึ้นจากพล็อตโคไซน์ นี่คือลักษณะบางส่วน:

รูปแบบ JPEG ทำงานอย่างไร
อัตราต่อรอง 8 จาก 64

ด้านล่างนี้เป็นภาพที่แสดงทั้งหมด 64 รูปแบบ

รูปแบบ JPEG ทำงานอย่างไร
(รุ่นอินเทอร์แอคทีฟ-อิน ต้นฉบับ บทความ)

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

ดูเหมือนเป็นเวทย์มนตร์ที่ภาพใดๆ ก็ตามสามารถประกอบด้วยรูปแบบเฉพาะได้ถึง 64 รูปแบบ อย่างไรก็ตาม นี่ก็เหมือนกับการบอกว่าสถานที่ใดๆ บนโลกสามารถอธิบายได้ด้วยตัวเลขสองตัว คือ ละติจูดและลองจิจูด [ซึ่งหมายถึงซีกโลก / ประมาณ แปล]. เรามักคิดว่าพื้นผิวโลกเป็นแบบสองมิติ ดังนั้นเราจึงต้องการเพียงตัวเลขสองตัวเท่านั้น รูปภาพขนาด 8x8 มี 64 ขนาด ดังนั้นเราจึงต้องมีตัวเลข 64 ตัว

ยังไม่ชัดเจนว่าสิ่งนี้ช่วยเราได้อย่างไรในแง่ของการบีบอัด หากเราต้องการตัวเลข 64 ตัวเพื่อแสดงภาพขนาด 8x8 เหตุใดจึงดีกว่าการเก็บองค์ประกอบความสว่าง 64 ชิ้น เราทำเช่นนี้ด้วยเหตุผลเดียวกันกับที่เราเปลี่ยนตัวเลข RGB สามตัวให้เป็นตัวเลข YCbCr สามตัว: ช่วยให้เราสามารถลบรายละเอียดที่ละเอียดอ่อนได้

เป็นการยากที่จะดูว่ารายละเอียดใดบ้างที่ถูกลบออกไปในขั้นตอนนี้ เนื่องจาก JPEG ใช้ DCT กับบล็อกขนาด 8x8 อย่างไรก็ตามไม่มีใครห้ามไม่ให้เรานำไปใช้กับภาพรวมทั้งหมด ต่อไปนี้คือลักษณะของ DCT สำหรับองค์ประกอบ Y ที่ใช้กับภาพรวมทั้งหมด:

รูปแบบ JPEG ทำงานอย่างไร

สามารถลบหมายเลขได้มากกว่า 60 หมายเลขออกจากส่วนท้าย โดยแทบไม่มีการเปลี่ยนแปลงใดๆ ที่เห็นได้ชัดเจนในภาพถ่าย

รูปแบบ JPEG ทำงานอย่างไร

อย่างไรก็ตาม โปรดทราบว่าหากเราลบตัวเลขห้าตัวแรกเป็นศูนย์ ความแตกต่างก็จะชัดเจน

รูปแบบ JPEG ทำงานอย่างไร

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

รูปแบบ JPEG ทำงานอย่างไร

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

รูปแบบ JPEG ทำงานอย่างไร

20:

รูปแบบ JPEG ทำงานอย่างไร

40:

รูปแบบ JPEG ทำงานอย่างไร

60:

รูปแบบ JPEG ทำงานอย่างไร

รายละเอียดความถี่สูงเหล่านี้จะถูกลบโดย JPEG ในระหว่างขั้นตอนการบีบอัด การแปลงสีเป็นค่าสัมประสิทธิ์ DCT ไม่มีการสูญเสีย การสูญเสียเกิดขึ้นในขั้นตอนการสุ่มตัวอย่าง โดยที่ค่าความถี่สูงหรือใกล้ศูนย์จะถูกลบออก เมื่อคุณลดคุณภาพการบันทึก JPEG โปรแกรมจะเพิ่มเกณฑ์สำหรับจำนวนค่าที่ถูกลบซึ่งจะลดขนาดไฟล์ แต่ทำให้รูปภาพมีพิกเซลมากขึ้น นั่นเป็นเหตุผลว่าทำไมภาพในส่วนแรก ซึ่งเล็กกว่า 57 เท่า จึงมีลักษณะเช่นนี้ บล็อก 8x8 แต่ละบล็อกมีค่าสัมประสิทธิ์ DCT น้อยกว่ามากเมื่อเทียบกับเวอร์ชันคุณภาพสูงกว่า

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

เพื่อความสนุก นี่คือสิ่งที่คุณจะได้รับจากการใช้หมายเลขเพียง 24 หมายเลข:

รูปแบบ JPEG ทำงานอย่างไร

หรือเพียง 5000:

รูปแบบ JPEG ทำงานอย่างไร

เบลอมาก แต่ก็จำได้!

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

รูปแบบ JPEG ทำงานอย่างไร

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

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

234 115

จากนั้น ขึ้นอยู่กับตาราง Huffman ตัวเลขเหล่านี้อาจเป็นตัวเลขสามตัว หากต้องการแยกออก คุณต้องแยกออกเป็นแต่ละบิตก่อน:

11101010 01110011

จากนั้นเราดูที่ตารางเพื่อหาวิธีจัดกลุ่มพวกมัน ตัวอย่างเช่น อาจเป็นหกบิตแรก (111010) หรือ 58 ในรูปทศนิยม ตามด้วยห้าบิต (10011) หรือ 19 และสุดท้ายคือสี่บิตสุดท้าย (0011) หรือ 3

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

เคล็ดลับที่น่าสนใจประการหนึ่งที่คุณสามารถทำได้ด้วยความรู้นี้คือการแยกส่วนหัวออกจาก JPEG และจัดเก็บแยกกัน ที่จริงแล้วปรากฎว่ามีเพียงคุณเท่านั้นที่สามารถอ่านไฟล์ได้ Facebook ทำสิ่งนี้เพื่อทำให้ไฟล์มีขนาดเล็กลง

สิ่งอื่นที่สามารถทำได้คือเปลี่ยนตาราง Huffman ไม่น้อย สำหรับบางคนก็จะดูเหมือนเป็นภาพที่แตกหัก และมีเพียงคุณเท่านั้นที่จะรู้วิธีแก้ไขอย่างมหัศจรรย์

สรุป: แล้วสิ่งที่จำเป็นสำหรับการถอดรหัส JPEG คืออะไร? จำเป็น:

  1. แยกตาราง Huffman ออกจากส่วนหัวและถอดรหัสบิต
  2. แยกค่าสัมประสิทธิ์การแปลงโคไซน์แบบไม่ต่อเนื่องสำหรับแต่ละสีและส่วนประกอบความสว่างสำหรับบล็อก 8x8 แต่ละบล็อก โดยทำการแปลงความยาวรันแบบผกผันและการแปลงการเข้ารหัสเดลต้า
  3. รวมโคไซน์ตามค่าสัมประสิทธิ์เพื่อให้ได้ค่าพิกเซลสำหรับแต่ละบล็อก 8x8
  4. ปรับขนาดส่วนประกอบสีหากดำเนินการสุ่มตัวอย่าง (ข้อมูลนี้อยู่ในส่วนหัว)
  5. แปลงค่า YCbCr ที่ได้สำหรับแต่ละพิกเซลเป็น RGB
  6. แสดงภาพบนหน้าจอ!

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

รหัสที่ใช้ในบทความเปิดอยู่ และมีคำแนะนำเกี่ยวกับวิธีแทนที่รูปภาพด้วยรูปภาพของคุณเอง

ที่มา: will.com

เพิ่มความคิดเห็น