ท้ายที่สุดแล้วรูปภาพดิจิทัลทั้งหมดไม่ใช่แค่ค่าพิกเซลระหว่าง 0 - 255 ใช่ไหม


56

ฉันมีคำถามพื้นฐาน (โง่?) อย่างไม่น่าเชื่อเกี่ยวกับรูปภาพ รูปแบบภาพและค่าพิกเซลโดยเฉพาะ

ยกโทษให้ฉันฉันไม่ใช่ช่างภาพ ฉันแค่คนที่ทำงานกับภาพและสำหรับฉันพวกเขาเป็นเพียงแถวและคอลัมน์ของตัวเลข

คำถามของฉันคือ:

หากที่แกนกลางภาพถ่ายเป็นเพียง 3 ช่องทางของค่าพิกเซล [0, 255] X RBG ดังนั้นอาจมีความแตกต่างระหว่างรูปแบบภาพสองภาพอย่างไร ฉันหมายถึงอะไรที่ทำให้ RAW แตกต่างจาก TIFF - ทั้งหมดนี้ไม่ได้ จำกัด อยู่ที่ค่าระหว่าง 0 - 255 ตัวเลขคือตัวเลข - ไม่ควรมีรูปแบบที่กำหนดเพียงรูปแบบเดียวหรือไม่ หรือภาพสองภาพที่มีความสูงและความกว้างเท่ากันไม่ควรถูกล็อคให้มีขนาดไฟล์เดียวกันหรือไม่

นอกจากนี้จากมุมมองเชิงตัวเลขอะไรที่ทำให้บางอย่างเช่นรูปแบบ 16 บิตแตกต่างจากรูปแบบ 32 บิต อีกครั้งรูปภาพเป็นเพียงอาร์เรย์ที่มีค่าจำนวนเต็มอยู่ระหว่าง 0 -255

ต่อจากมุมมองนี้ว่าภาพในระบบแฟ้มของคอมพิวเตอร์เป็นเพียงอาร์เรย์ 3 จำนวนเต็มระหว่าง 0 - 255 จุดของการบีบอัดภาพลงในรูปแบบรูปแบบสูญเสียเช่น JPG คืออะไร? สมมติว่าการบีบอัดค่าอัลโกนั้นเปลี่ยนค่าพิกเซลบางค่าจาก 254 เป็น 255 หรือค่าอื่น ๆ ดังนั้น? สิ่งนี้ให้การประหยัดในขนาดไฟล์หรือส่งผลกระทบต่อคุณภาพของภาพอย่างไร?

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


32
ฉันเริ่มสงสัยว่าความเข้าใจผิดนี้มาจากการทำงานในระดับที่สูงขึ้นหรือไม่ คุณกำลังอ่านไฟล์ด้วย matlab หรือเครื่องมืออื่น ๆ ? เชื่อใจฉันถ้าคุณเปิดและอ่านไฟล์ TIFF, PNG หรือ JPG ที่ระดับไฟล์ดิบคุณจะต้องทำสิ่งต่างๆมากมายก่อนที่คุณจะจบลงด้วยเมทริกซ์ RGB ที่ดีและสะอาด
ท่อ

2
มันจะช่วยถ้า OP สามารถให้บริบทเพิ่มเติมอีกเล็กน้อย เช่นนี้เกี่ยวข้องกับรหัสการประมวลผลภาพหรือไม่?
remco

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

3
ระวังซอฟต์แวร์แพ็กเกจที่ต้องการนำเข้า TIFF, FITS และรูปภาพที่ไม่บีบอัดอื่น ๆ แพคเกจดังกล่าวจำนวนมากรวมถึงเครื่องมือ MATLAB และเครื่องมือไพ ธ อนตัดข้อมูลเป็น 8 บิตโดยไม่คำนึงถึงขนาดของแหล่งที่มา หากคุณต้องการหลีกเลี่ยงปัญหานี้คุณจะต้องค้นหาฟังก์ชัน / ไลบรารีพิเศษหรือหมุนเครื่องมือของคุณเอง
Carl Witthoft

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

คำตอบ:


72

ขออภัย แต่หลักฐานพื้นฐานของคุณผิด: ภาพสามารถเข้ารหัสเป็นอาร์เรย์ของพิกเซล RBG ที่มี 8 บิตต่อค่า แต่มีวิธีอื่นมากมาย:

  • หนึ่งช่องสัญญาณที่มีหนึ่งบิต / ช่องสัญญาณ (ขาวดำบริสุทธิ์)
  • หนึ่งช่องทางที่มีxบิต / ช่องทาง (รูปแบบโทนสีเทาxมักจะเป็น 8 หรือ 16 โดยให้ค่า 256 หรือ 65536)
  • รูปแบบที่อิงกับพาเล็ตต่างๆ (cf.GIF)
  • full-color with (อย่างน้อยในทางทฤษฎี) ได้มากเท่าที่คุณต้องการด้วยความลึกของบิตที่ต้องการ

และสำหรับรูปภาพที่เก็บไว้ใน RAM ของคอมพิวเตอร์ระหว่างการแก้ไข / การดู ฉันไม่สนใจรูปแบบภาพ RAW ต่างๆที่มีอยู่ (ที่นี่และในส่วนที่เหลือของโพสต์นี้)

สำหรับการถ่ายภาพพบมากที่สุดคือ 3 แชนเนลที่มี 8, 16 หรือ 32 บิต / ช่อง (ปกติเป็นจำนวนเต็ม แต่อย่างน้อยโปรแกรมบางโปรแกรมก็ทำงานภายในด้วยหมายเลขทศนิยม 32 บิต) บ่อยครั้งที่มีช่องที่ 4 (อัลฟา) โดยเฉพาะอย่างยิ่งเมื่อโปรแกรมอนุญาตให้ใช้เลเยอร์ และบางแห่งขนาดของอาร์เรย์ภาพจำเป็นต้องถูกจัดเก็บ

มีสาเหตุหลายประการสำหรับรูปแบบที่แตกต่างกันเหล่านี้ สำหรับรูปแบบในหน่วยความจำการพิจารณาที่สำคัญเคยเป็นขนาดของข้อมูลและความเร็ว (เร็วกว่ามากในการจัดการช่องสัญญาณ 8 บิตหนึ่งช่องมากกว่าช่องสัญญาณ 32 บิต 4 ช่อง) สิ่งเหล่านี้มีความสำคัญน้อยกว่าทุกวันนี้ แต่เราได้รับการจัดการสีเต็มรูปแบบด้วยช่องว่างสีที่หลากหลาย บางตัว (เช่น prophoto RGB) ต้องการอย่างน้อย 16 บิต / ช่องเพื่อให้ความแตกต่างระหว่างสีข้างเคียงมีขนาดเล็กพอที่จะหลีกเลี่ยงแถบสีที่มองเห็นได้ และเมื่อการรักษามีความซับซ้อนมากขึ้นมีข้อดีที่จะใช้ตัวเลขจุดลอยตัว 32 บิต (ซึ่งสีถูกเข้ารหัสด้วยค่าระหว่าง 0.0 ถึง 1.0 และการรักษาจะช่วยให้ค่ากลางอยู่นอกช่วงนี้)

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

ผู้ใช้ภาพเหล่านั้นต้องการเก็บข้อมูลเพิ่มเติมเกี่ยวกับภาพ (คำบรรยายภาพ, ชื่อ, ภาพที่ถ่าย ฯลฯ ) อีกหลายวิธีในการจัดเก็บข้อมูลนี้

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

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

จากนั้นมีการพัฒนาอย่างต่อเนื่องเช่นเทคนิคการบีบอัดแบบไม่สูญเสียซึ่งรูปแบบที่มีอยู่ไม่สามารถจัดการได้เสมอ

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


หลังจากเห็นคำถามที่แก้ไขแล้วมีประเด็นเพิ่มเติมบางประการ:

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

แต่คุณจะต้องรู้ว่าคุณมีภาพที่ผ่านการประมวลผลหรือภาพดิบเนื่องจากมีความแตกต่างที่สำคัญสองประการระหว่างภาพเหล่านั้น:

  • โดยทั่วไปแล้วรูปภาพดิบจะมี1 สีต่อพิกเซลและพิกเซลมักจะถูกจัดเรียงในอาร์เรย์ของไบเออร์ที่มีสีเขียว 2 สี, 1 สีแดงและ 1 พิกเซลสีฟ้าต่อตารางพิกเซลที่ 4 ค่าเป็นสัดส่วนกับความเข้มของฉาก (ยกเว้นค่าที่ต่ำมากและสูงมาก)
  • รูปภาพที่ประมวลผลแล้วสามารถจัดเรียงเป็นเรคคอร์ดสองมิติที่มีค่าตัวเลข 3 ค่าหรือเป็นระนาบสี (อาร์เรย์ 2 มิติ 3 อันแต่ละอันสำหรับ R, G, B) นอกจากนี้ค่าที่มักจะไม่ได้สัดส่วนกับความเข้มที่เกิดเหตุ ยิ่งไปกว่านั้นความสัมพันธ์ที่แน่นอนระหว่างค่าพิกเซลและความเข้มของฉากนั้นขึ้นอยู่กับการประมวลผลภาพที่ได้รับ และความสมดุลระหว่างสีได้รับการปรับให้สอดคล้องกับการตอบสนองของดวงตามนุษย์ (สมดุลสีขาว, สีแดงและสีน้ำเงินจะถูกขยายเมื่อเทียบกับสีเขียว)

ดังนั้นหากคุณได้รับภาพดิบที่มีค่าสี 3 ค่าต่อพิกเซลภาพดิบนั้นได้รับการรักษามาแล้ว (อย่างน้อยdemosaicingหรือการแบ่งหน้าอย่างง่าย ๆ ของพิกเซลดิบ 4 ถึง 1 พิกเซล) ไม่ว่าจะเป็นที่ยอมรับได้จะขึ้นอยู่กับใบสมัครของคุณ


ฉันมีความสนใจน้อยลงในความหลากหลายของวิธีในการแสดงรูปภาพ แต่ถ้าฉันให้เมทริกซ์ 3 ช่องสองตัวเลขอะไรที่ทำให้สิ่งเหล่านี้แตกต่างจากที่อื่น ความแตกต่างระหว่างพูด TIFF และ RAW คืออะไรถ้าพวกเขาทั้งสองเป็น 3 มิติอาร์เรย์?
โมนิก้า Heddneck

4
บางทีอาจเป็นเรื่องที่น่าสนใจฉันสับสนเมื่อคุณบอกว่าภาพ 16 บิตเป็น 16 บิตต่อช่อง ในโลกคอมพิวเตอร์กราฟิกส์ภาพ 16 บิตเป็น 16 บิตสำหรับผลรวมทั้งหมดของ 3 ช่องสัญญาณ (โดยทั่วไปคือ 5 แดง, 6, เขียว, น้ำเงิน 5) ฉันแค่ต้องการชี้ให้เห็นในความคิดเห็นเพื่อให้คนที่เห็นสี 16 บิตทราบว่ามีความหมายสองประการสำหรับคำนั้นขึ้นอยู่กับผู้ที่ใช้งาน
Cort Ammon

"เร็วกว่ามากในการจัดการแชนเนล 8 บิตหนึ่งแชนเนลมากกว่า 4 32 บิตบิต คุณไม่ได้หมายความว่า "เร็วกว่าในการจัดการช่อง 32 บิตหนึ่งช่องมากกว่าช่อง 8 8 บิต" หรือไม่?
l0b0

1
@MonicaHeddneck หากเมทริกซ์ตัวใดตัวหนึ่งมีข้อมูล RGB ในขณะที่อีกอันประกอบด้วยข้อมูล HSV ให้แน่ใจว่าขนาดและความลึกบิตของทั้งสองอาร์เรย์เหมือนกันและเมื่อแสดงผลไปยังอุปกรณ์แสดงผลพวกเขาจะมีลักษณะเดียวกัน ( + ) แต่ข้อมูลที่เก็บไว้ในสองอาร์เรย์ส่วนใหญ่ไม่เหมือนกันอย่างแน่นอน ( + ) ในความเป็นจริงพวกเขาจะไม่เหมือนกันอย่างแน่นอนเนื่องจากในขณะที่ 888RGB และ 888HSV ทั้งคู่มี 2 ^ 24 "คะแนน" ในขอบเขตของพวกเขานั้นไม่มีการทำแผนที่แบบหนึ่งต่อหนึ่งระหว่างชุดจุดสองจุด อย่างไรก็ตามในทางปฏิบัติอาจเป็นเรื่องยากมากที่จะเห็นความแตกต่างด้วยสายตามนุษย์
dgnuff

ที่จริงแล้วจุดสี hdr 32 floating bit นั้นไม่ได้เข้ารหัสใน 0 ถึง 1 แต่เป็น 0 ถึง 0 ถ้าคุณจะทำอย่างนั้นจริง ๆ แล้วใช้จำนวนเต็มแทน เหมือนแสงจริงไม่มีขอบเขตบนจริง ๆ แต่คุณจะเห็นชิ้นของมัน สิ่งนี้มีประโยชน์สำหรับหลาย ๆ เหตุผล แต่ถ้าคุณฟ้องพวกเขาเป็นตัวอย่างในการสะท้อนของ 3 มิติแล้วพลังงานที่แท้จริงยังคงถูกจับซึ่งมีความสำคัญมากสำหรับสิ่งต่าง ๆ เช่นท้องฟ้าและการเลือก 20%
joojaa

48

หากที่แกนกลางภาพถ่ายเป็นเพียง 3 ช่องทางของค่าพิกเซล [0, 255] X RBG

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

แล้วจะมีความแตกต่างระหว่างรูปแบบภาพสองแบบได้อย่างไร? ฉันหมายถึงอะไรที่ทำให้ RAW แตกต่างจาก TIFF - ทั้งหมดนี้ไม่ได้ จำกัด อยู่ที่ค่าระหว่าง 0 - 255

สิ่งเหล่านี้เป็นตัวอย่างที่ดีสองข้อเนื่องจากรูปแบบใดรูปแบบหนึ่งไม่จำเป็นต้องมีอาร์เรย์ RGB แบบสี่เหลี่ยม

RAW ไม่ใช่รูปแบบเดียวเลย - มันเป็นชื่อ catch-all สำหรับไฟล์ที่มีข้อมูลที่บันทึกโดยตรงจากเซ็นเซอร์ภาพ ดังนั้นไฟล์ RAW อาจมีลำดับของค่าที่แสดงถึงแรงดันไฟฟ้าที่อ่านได้จากไซต์เซ็นเซอร์ต่างๆ ไซต์เหล่านั้นเหมือนพิกเซลภาพ แต่ไม่ใช่พิกเซล RGB ในการรับพิกเซลพิกเซล RGB จากไฟล์ RAW คุณจะต้องตีความข้อมูลนั้นในบริบทของข้อมูลเกี่ยวกับเซ็นเซอร์การตั้งค่ากล้องในเวลาเป็นต้นกล่าวอีกนัยหนึ่งคุณสามารถเปิดไฟล์ RAW ในโปรแกรมแก้ไข hex และดูทุกสิ่งที่คุณต้องการ แต่คุณจะไม่พบค่า RGB เดียว

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

ตัวเลขคือตัวเลข - ไม่ควรมีรูปแบบที่กำหนดเพียงรูปแบบเดียวหรือไม่

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

หรือภาพสองภาพที่มีความสูงและความกว้างเท่ากันไม่ควรถูกล็อคให้มีขนาดไฟล์เดียวกันหรือไม่

ไม่นั่นน่ากลัวมาก หากขนาดของไฟล์ภาพทุกไฟล์ต้องเป็นหลักwidth * height * 3(สมมติว่ามีสี 24 บิต) แสดงว่าคุณต้องใช้พื้นที่เก็บข้อมูลจำนวนมาก ภาพถ่ายส่วนใหญ่มีความซ้ำซ้อนจำนวนมากเช่นภูมิภาคที่มีสีเดียวกันซ้ำหลายครั้ง เพื่อประหยัดพื้นที่เก็บข้อมูลมักจะเหมาะสมที่จะกำจัดข้อมูลที่ซ้ำซ้อน ตัวอย่างวิธีหนึ่งในการทำเช่นนั้นคือการเข้ารหัสความยาวรันหรือ RLE ตัวอย่างเช่นหากคุณมีพื้นที่พิกเซลต่อเนื่อง 4195 พิกเซลที่เป็นสีขาวทั้งหมดจะมีประสิทธิภาพมากขึ้นในการเข้ารหัสว่า "พิกเซล 4195 ถัดไปเป็น {255, 255, 255}" ทั้งหมดแทนที่จะเก็บพิกเซลสีขาวจำนวนมากใน ไฟล์ จริงๆแล้ว RLE นั้นถูกใช้ในรูปแบบภาพบางรูปแบบ แต่หลายรูปแบบมีรูปแบบที่ซับซ้อนกว่าซึ่งประหยัดพื้นที่ได้มากขึ้นและนั่นหมายความว่าคุณสามารถจัดเก็บภาพจำนวนมากบนฮาร์ดไดรฟ์หรือการ์ดหน่วยความจำ นอกจากนี้ยังทำให้การส่งภาพไปยังบุคคลอื่นรวดเร็วยิ่งขึ้น

ต่อจากมุมมองนี้ว่าภาพในระบบแฟ้มของคอมพิวเตอร์เป็นเพียงอาร์เรย์ 3 จำนวนเต็มระหว่าง 0 - 255 จุดของการบีบอัดภาพลงในรูปแบบรูปแบบสูญเสียเช่น JPG คืออะไร?

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

สมมติว่าการบีบอัดค่าอัลโกนั้นเปลี่ยนค่าพิกเซลบางค่าจาก 254 เป็น 255 หรือค่าอื่น ๆ ดังนั้น? สิ่งนี้ให้การประหยัดในขนาดไฟล์หรือส่งผลกระทบต่อคุณภาพของภาพอย่างไร?

พิจารณาตัวอย่าง RLE ของฉันด้านบน สมมติว่าคุณมีภาพถ่ายที่มีผนังว่างเปล่าขนาดใหญ่ดังนั้นพื้นที่ขนาดใหญ่ของภาพถ่ายของคุณจึงมีสีเดียวกันทั้งหมดยกเว้นว่ามีการกระเจิงของพิกเซลที่มืดกว่าเล็กน้อยซึ่งแทบจะสังเกตไม่เห็นในภาพเลย พิกเซลเหล่านั้นลดประสิทธิภาพของการบีบอัด แทนที่จะสามารถพูดได้ว่า "500,000 พิกเซลถัดไปคือทั้งหมด {243, 251, 227}" คุณต้องรันความยาวเข้ารหัสส่วนที่มีขนาดเล็กกว่ามากเพราะทุกครั้งที่คุณพบพิกเซลที่แตกต่างกันเล็กน้อย หากคุณอนุญาตให้อัลกอริทึมการบีบอัดทำการเปลี่ยนแปลงเล็กน้อยอาจเพียงแค่เปลี่ยนพิกเซลใด ๆ ไม่เกิน 1% หรือ 2% จากนั้นคุณสามารถรับอัตราส่วนการบีบอัดที่สูงขึ้นได้โดยไม่ต้องเปลี่ยนภาพ มันเป็นการแลกเปลี่ยน: คุณ ให้ข้อมูลจำนวนเล็กน้อยในภาพต้นฉบับเพื่อลดขนาดไฟล์ใหญ่ ตรงตำแหน่งที่คุณต้องการวาดเส้นนั้นอาจมีการเปลี่ยนแปลงดังนั้นรูปแบบการสูญเสียเช่น JPEG ให้ผู้ใช้เลือกระดับการบีบอัดที่ต้องการ


1
เพิ่มขึ้นสำหรับคำอธิบายที่ชัดเจนและครอบคลุมของเรื่องที่ซับซ้อน! ฉันเรียนรู้มากมายจากที่ฉันคิด ฉันเหลือสงสัยว่าวิธีหนึ่งที่มีประสิทธิภาพในการจัดการการบีบอัดแบบไม่สูญเสียจะเป็นการเข้ารหัสแบบความยาว แต่จริงๆแล้วมีการส่งผ่านภาพที่สองเพื่อเพิ่มข้อยกเว้นต่อพิกเซลแปลก ๆ หลังจากนั้น บางสิ่งเช่น "จาก 23 - 400 เป็นสีดำ" และ "302 เป็นสีขาว" เขียนทับนั้นหนึ่งพิกเซล แทน 23 - 301 เป็นสีดำ 302 เป็นสีดำ 303 - 400 เป็นสีดำ ฉันสงสัยว่านี่เป็นรูปแบบการบีบอัดอย่างน้อยหนึ่งรูปแบบที่ใช้กับมัน
Ruadhan2300

1
@ Ruadhan2300 - แน่นอนว่ามี ดูตัวอย่างเช่น: en.wikipedia.org/wiki/Lossless_JPEGซึ่งใช้วิธีการทำนายสีของแต่ละพิกเซล (แม้ว่าจะค่อนข้างซับซ้อนกว่าการเข้ารหัสความยาวรัน) และเข้ารหัสความแตกต่างระหว่างการทำนายนั้นกับค่าพิกเซลจริง
จูลส์

18

นอกจากคำตอบที่ยอดเยี่ยมของ @ remcoฉันต้องการเพิ่มว่าทำไมจึงมีตัวแปลงสัญญาณที่แตกต่างกันสำหรับวัตถุประสงค์เดียวกัน (โดยประมาณ)

ตัวแปลงสัญญาณถูกออกแบบมาเพื่อ:

  • จะเป็นแบบไม่สูญเสียกับการสูญเสีย
  • เข้ารหัสเร็วเทียบกับลดขนาดไฟล์
  • Asymmetric vs. Symmetric en- / ถอดรหัส
  • เข้ากันได้กับซอฟต์แวร์
  • รู้สึกว่าแทบไม่มีการสูญเสียในระดับการบีบอัด / สถานการณ์ที่แตกต่างกัน
  • มีคุณสมบัติที่ไม่มีตัวแปลงสัญญาณอื่นรวมถึง:
    • ปลอดค่าลิขสิทธิ์
    • รองรับเลเยอร์
    • รองรับ alpha-channel (เช่น RGBA) / transparrency
    • เสนอมุมมองเว็บที่รวดเร็ว
    • รองรับความลึกบิตสูง
    • รองรับพื้นที่สีหลายสี (RGB / CMYK)
    • รองรับ metadata / versioning / ...

บางสิ่งเหล่านั้นไม่เกิดร่วมกัน และด้วยเหตุนี้เราจึงมีตัวแปลงสัญญาณมากมาย


ตัวอย่างเล็ก ๆ น้อย ๆ

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

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

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

PNGเป็นอีกรูปแบบหนึ่งที่รู้จักกันอย่างกว้างขวาง - มันไม่มีความสูญเสียและรองรับอัลฟ่า - แชนแนล แต่ไม่ได้ให้การสนับสนุนสำหรับช่องว่างสีที่ไม่ใช่ RGB (เช่น CMYK) ดังนั้นจึงเป็นรูปแบบ "ออนไลน์เท่านั้น"

จากนั้นก็มีรูปแบบเช่น VFX OpenEXR พวกเขาทั้งหมดหมุนรอบคุณภาพและความเร็ว: OpenEXR เป็น lossless รองรับมากถึง 64 บิตและเข้ารหัส / ถอดรหัสอย่างรวดเร็ว ส่วนใหญ่จะใช้ในอุตสาหกรรม VFX เป็นรูปแบบกลาง

TIFFเป็นรูปแบบที่ไม่มีการสูญเสียอีกรูปแบบหนึ่งซึ่งเป็นที่นิยมของช่างภาพ สำหรับการบีบอัดจะไม่มี / ZIP / RLE / LZW / JPEG รองรับสูงสุด 32 บิต ด้วยการบีบอัดที่เลือกได้มันปรับตัวได้ค่อนข้างมาก แต่เนื่องจากความไม่สูญเสียมันจึงเป็นรูปแบบออฟไลน์ที่มากกว่า

HEIFเป็นหนึ่งในตัวแปลงสัญญาณภาพล่าสุด มันใช้การบีบอัดเช่นเดียวกับ HEVC / h.265 และคาดว่าจะให้อัตราส่วนการบีบอัดที่ดีกว่า JPEG แต่เพราะมันเป็นเรื่องที่ค่อนข้างใหม่ ๆ และเพราะมันเป็นเรื่องสิทธิบัตรก็ไม่ได้รับการสนับสนุนเป็นวงกว้างในฐานะใด ๆดังกล่าวข้างต้น

ภาพ RAW ดูเพิ่มเติมไม่ใช่ภาพจริง ๆ จริง ๆ : เป็นข้อมูลสำหรับอ่านข้อมูลเซ็นเซอร์ เฉพาะซอฟต์แวร์ที่รู้วิธีตีความข้อมูลเท่านั้นจึงจะสามารถรับภาพได้ นั่นคือเหตุผลที่ตัวแปลง RAW เช่น Lightroom / Capture One / DarkTable / ... จำเป็นต้องมีการอัพเดตเพื่อรองรับกล้องใหม่ที่ใช้คอนเทนเนอร์ที่ระบุเช่น * .CR2 สำหรับ Canon นอกจากนี้ยังเป็นสาเหตุที่ทำให้ RAW 14 บิตเสนอตัวเลือกการแก้ไขมากกว่า TIFF 32 บิตที่คุณส่งออกจาก RAW เดียวกัน


การสอดแทรก: Lossless vs. lossy

ฉันยังไม่แน่ใจว่าสิ่งที่คุณถามจริง ๆ ดังนั้นฉันคิดว่ามันจะไม่เจ็บที่จะเพิ่มคำอธิบายเล็ก ๆ น้อย ๆ เกี่ยวกับการสูญเสียและการสูญเสีย

การบีบอัดแบบไม่สูญเสียข้อมูลทำงานโดยทำการเข้ารหัสแบบรันไทม์ (RLE) / Huffman การเข้ารหัส / ...เพื่อบีบอัดข้อมูล ข้อมูลไม่ได้ถูกเปลี่ยนแปลง แต่ถูกบันทึกในแพ็คเกจที่เล็กกว่า ตัวอย่างเช่นใช้ RLE: บอกว่าเรามีบิตสตรีม R-channel (จากพิกเซล0,0เป็นพิกเซล0,11) ของ255,255,255,255,255,215,215,235,100,000,000,000- RLE จะเข้ารหัสสิ่งนี้เป็น52552215123511003000- นี่เล็กกว่ามากและเนื่องจากเรารู้ว่ามันถูกบันทึกไว้ในกลุ่มตัวเลข 4 หลักและ 255,255,255,255,255,215,215,235,100,000,000,000หลักแรกเป็นเคาน์เตอร์และตัวเลขสามหลักสุดท้ายมีค่าแล้วเราสามารถสร้างเต็มรูปแบบ

ในทางกลับกันการบีบอัดแบบ Lossyพยายามที่จะบีบอัดยิ่งกว่าที่ lossless ทำได้ ในการทำเช่นนี้ตัวแปลงสัญญาณที่สูญเสียมักจะพยายามลบสิ่งที่การรับรู้ของเราไม่ได้รับ ต้องใช้เวลาเช่นนี้YUV( YCbCrจริงๆ) รูปแบบ JPEG (และเกือบทุกตัวแปลงสัญญาณวิดีโอ) ใช้: Y = Luminance, ,Cb = Chrominance Blue Cr = Chrominance Redมนุษย์ไม่สามารถแยกแยะความแตกต่างระหว่าง a 4:2:0(ทุกพิกเซลมีค่าความส่องสว่าง แต่สีจะถูกบันทึกในบล็อกของ 2x2 สลับกัน) และ a 4:4:4(ทุกพิกเซลมีความสว่างและช่องทางสีทั้งสองเข้ารหัส) นี่เป็นเพราะสรีรวิทยาของดวงตาของเรา : เราไม่สามารถมองเห็นความแตกต่างของสีรวมทั้งเราสามารถเห็นความแตกต่างในความส่องสว่าง

วิธีนี้ใช้งานได้ดีเกือบตลอดเวลา แต่เปรียบเทียบกับไฟล์ MP3: เกือบจะไม่มีใครสามารถสร้างความแตกต่างระหว่าง 192kbps และ 320kbps แต่ต่ำกว่า 64kbps และสิ่งต่าง ๆ ก็ดูน่าเกลียดอย่างรวดเร็ว นอกจากนี้การเข้ารหัสซ้ำจะลดคุณภาพลงอีกเนื่องจากอาจมีสิ่งประดิษฐ์ที่ไม่พึงประสงค์ปรากฏขึ้น (เช่นใน JPEG บล็อกขนาดเล็กจากการเข้ารหัสคุณภาพสูงจะถือเป็นรายละเอียดของภาพในการเข้ารหัสเพิ่มเติม)


บรรทัดล่าง

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

อย่างไรก็ตามหากคุณต้องการคุณสมบัติเฉพาะอาจมี (และเกือบจะแน่นอน: จะ) เป็นตัวแปลงสัญญาณที่ครอบคลุม


ฉันจะเพิ่มสองสิ่งลงในรายการคุณสมบัติตัวแปลงสัญญาณของคุณ: 1. การเรนเดอร์โปรเกรสซีฟ (ไม่ได้ใช้มากในทุกวันนี้ แต่เป็นฟีเจอร์ใหญ่ใน PNG) 2. แอนิเมชั่น
Sulthan

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

2
"เฉพาะซอฟต์แวร์ที่รู้วิธีตีความข้อมูลเป็นไปได้ที่จะได้รับภาพ" ที่เป็นจริงสำหรับรูปแบบภาพใด ๆ หากซอฟต์แวร์ไม่ทราบวิธีการตีความพูดข้อมูล JPEG จะไม่สามารถแสดงหรือประมวลผลเป็นภาพได้ ไฟล์ Raw จัดเก็บข้อมูลที่อนุญาตให้สร้างภาพใหม่จากมันและมีโครงสร้างในลักษณะที่แน่นอน มันเป็นรูปแบบรูปภาพไม่ใช่รูปแบบเดียว แต่เป็น "รูปแบบดิบของกล้อง X"
n0rd

1
@ n0rd แน่นอน แต่ JPEG จาก 5D Mk III ของฉันเป็นไปตามข้อกำหนดเดียวกัน (ดูเหมือน) กับของ Nikon P7000 หรือ EOS M6 .CR2แค่พูดว่า "ดูฉันสิฉันเป็นไฟล์ RAW ของกล้อง Canon! อ่านฉันถ้าคุณกล้า!" - นั่นควรเป็นประเด็นของฉันแม้ว่าคุณจะระบุด้วยภาษาที่ชัดเจนกว่านี้
flolilo

มีช่องว่าง LAB และ XYZ ในรูปแบบบางรูปแบบ
joojaa

10

หากที่แกนกลางภาพถ่ายเป็นเพียง 3 ช่องทางของค่าพิกเซล [0, 255] X RBG

นั่นเป็นข้อสันนิษฐานที่แตกหักอย่างรุนแรงและคำถามที่เหลือของคุณไม่สามารถตอบได้หากไม่แยกจากคำถาม

ฉันหมายถึงอะไรที่ทำให้ RAW แตกต่างจาก TIFF - ทั้งหมดนี้ไม่ได้ จำกัด อยู่ที่ค่าระหว่าง 0 - 255

คำว่า "ดิบ" สามารถอ้างถึงสองสิ่งที่แตกต่างกันคือภาพ "กล้องดิบ" หรือไฟล์ที่มีข้อมูลภาพดิบโดยไม่มีส่วนหัว

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

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

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

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

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

นอกจากนี้จากมุมมองเชิงตัวเลขอะไรที่ทำให้บางอย่างเช่นรูปแบบ 16 บิตแตกต่างจากรูปแบบ 32 บิต

น่าเสียดายที่ "n bit" อาจหมายถึงสองสิ่งที่แตกต่างกัน มันอาจหมายถึงว่าส่วนประกอบของสีทั้งหมดถูกยัดเยียดเป็นจำนวนบิต (เช่น 5 บิตสำหรับสีแดง 5 บิตสำหรับสีน้ำเงินและ 6 บิตสำหรับสีเขียวสำหรับ 16 บิตหรือ 8 บิตของสีแดง 8 บิตของสีเขียว 8 บิตของสีฟ้าและ 8 บิต ของอัลฟาสำหรับ 32 บิต) หรือที่สามารถหมายความว่าแต่ละองค์ประกอบสีมีข้อมูลบิตที่ตำแหน่งพิกเซลแต่ละ

ดำเนินการต่อด้วยเปอร์สเปคทีฟนี้ว่ารูปภาพในระบบไฟล์ของคอมพิวเตอร์เป็นเพียงอาร์เรย์ 3 จำนวนเต็มระหว่าง 0 - 255

อีกครั้งมุมมองนี้เป็นเพียงผิดธรรมดา

ไฟล์เป็นลำดับของไบต์ แต่ไบต์เหล่านั้นแทบจะไม่เคย "แค่อาร์เรย์ 3 แชนเนลของจำนวนเต็มระหว่าง 0 - 255"

คุณสามารถจัดเก็บภาพแบบนั้นได้ เครื่องมือบางอย่างสนับสนุนการอ่านและเขียนไฟล์ดังกล่าว แต่ปัญหาคือมันหมายความว่าคุณต้องรู้เกี่ยวกับไฟล์ก่อนที่คุณจะสามารถอ่านได้ สมมติว่าคุณมีไฟล์ที่มีขนาด 3000 ไบต์คุณมีพิกเซล RGB 24 1000 หรือไม่ พิกเซลเฉดสีเทา 3000 8 บิต? 3000 8 บิตพิกเซลจาก pallete? ส่วนประกอบของสีในลำดับใดบ้าง รูปอะไรรูป? องค์ประกอบของสีในการสั่งซื้อ RGB หรือ BGR คืออะไร? หากคุณไม่ทราบคำตอบสำหรับคำถามเหล่านี้คุณจะไม่สามารถอ่านไฟล์ดังกล่าวได้อย่างมีความหมาย

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

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

อัลกอริธึมการบีบอัดไม่เพียง "เปลี่ยนค่า" เท่านั้น แต่ยังเข้ารหัสข้อมูลในลักษณะที่แตกต่างกันโดยสิ้นเชิงตัวอย่างเช่น JPEG สามารถอธิบายคร่าวๆได้ว่า

  • แปลงข้อมูลจาก RGB เป็น YUV
  • (เป็นทางเลือก) ลดความละเอียดของแชนเนล Chroma ลง 2 เท่าในหนึ่งมิติหรือทั้งสองมิติ
  • แบ่งข้อมูลสำหรับแต่ละช่องเป็นบล็อก 8x8
  • แปลงบล็อกเป็นโดเมนความถี่โดยใช้การแปลงโคไซน์ไม่ต่อเนื่อง
  • วัดผลลัพธ์ที่ได้โดยรักษาข้อมูลความถี่ต่ำในขณะที่ลดความแม่นยำของข้อมูลความถี่สูง
  • เข้ารหัสตัวเลขผลลัพธ์เป็นลำดับของไบต์โดยใช้รูปแบบการเข้ารหัสความยาวตัวแปร (ทั้งการเข้ารหัส huffman หรือการเข้ารหัสทางเลขคณิต)
  • บันทึกไบต์เหล่านั้นในไฟล์พร้อมกับส่วนหัวที่เหมาะสม

รูปแบบที่ถูกบีบอัดแบบ Losslessly มักสร้างด้วยอัลกอริธึมการบีบอัดข้อมูลวัตถุประสงค์ทั่วไป แต่บางครั้งก็เสริมด้วยการประมวลผลล่วงหน้าเฉพาะภาพเช่น PNG

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

1
นี่อาจเป็นคำตอบที่ดีที่สุดที่นี่มันพูดถึงทั้งรูปแบบไฟล์ที่แตกต่างกันสำหรับการถือครองและการบีบอัดภาพและวิธีการสันนิษฐานว่าภาพเป็นกลุ่มของตัวเลขจาก 0-255 เป็นข้อบกพร่อง
pfg

เหมาะสำหรับการกล่าวถึงการสั่งซื้อส่วนประกอบ ฉันคิดว่าสิ่งต่าง ๆ เช่น opengl 2 ish มีเหตุผลที่ดีที่จะมีฟังก์ชั่นในการอ่านการเรียงลำดับที่แตกต่างกันของลำดับ RGB จริงๆแล้วถ้าไม่มีมาตรฐานหรือข้อมูลเมตาคุณก็ไม่รู้ด้วยซ้ำว่าต้นกำเนิดหรือทิศทางของภาพนั้นอยู่คนเดียวนานแค่ไหน หากคุณโหลดเทพดาเทพดาแม้หลังจากจัดการกับ pallete คุณจะมีสีหมายถึงการเริ่มต้นในซ้ายล่างขึ้นไปตามคอลัมน์และจากนั้นโดยแถวขวา ...
StarWeaver

ฉันได้รับการแสดงออกที่คำสั่งซื้อส่วนประกอบเป็น kinda เหมือน endian ผู้ขายระบบบางรายเลือก RGB ในขณะที่คนอื่น (ไม่ใช่หน้าต่าง) เลือก BGR
ปีเตอร์กรีน

9

มีสาเหตุหลายประการที่ทำให้สมมติฐานนี้ไม่ถูกต้องและพวกเขาทั้งหมดมาที่สิ่งหนึ่ง:

คุณกำลังใช้สเกลใด

และนั่นสามารถทำลายลงได้อีกเล็กน้อย:

255 คืออะไร

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

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

เสียงที่วางแผนไว้? Nope! นี่เป็นตัวอย่างที่แท้จริง ตรวจสอบการรับรองเหล่านี้ของแต่ละตัวเลือก พื้นที่โค้งเป็นชิ้น 2D ของพื้นที่สีการมองเห็นของมนุษย์และสามเหลี่ยมแสดงพื้นที่ที่สามารถแสดงแทนได้โดยมีตัวเลือกเฉพาะสำหรับสีแดงสีเขียวหรือสีน้ำเงิน

อันดับแรกนี่คือโปรไฟล์สำหรับหน้าจอแล็ปท็อปของฉันซึ่งเป็นตัวแทนของอุปกรณ์ระดับกลางในปัจจุบัน:

ThinkPad X260

ตอนนี้นี่คือพื้นที่ Adobe RGB สังเกตุว่ามันใหญ่กว่าหน้าจอของฉันมากแค่ไหน!

AdobeRGB

ดังนั้นที่นี่ sRGB - มาตรฐาน defacto และพื้นที่เริ่มต้นมักจะถือว่าเมื่อไม่มีอะไรระบุ มันหมายถึงว่า "ดีพอ" ในสถานการณ์ส่วนใหญ่

sRGB

และในที่สุด ProPhoto RGB ซึ่งใช้สีจินตนาการเป็นพื้นฐานเพื่อทำให้สามเหลี่ยมมีขนาดใหญ่พอที่จะรับสายตามนุษย์ได้เกือบทั้งหมด

ProPhoto RGB

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

ดังนั้น "255" อาจหมายถึงสิ่งต่าง ๆ มากมาย

0 คืออะไร

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

คุณโค้งอะไร

ดังนั้นเมื่อคุณมีจุดปลายแล้วคุณจะได้รับจากจุดหนึ่งไปสู่อีกจุดหนึ่งได้อย่างไร การรับรู้ของมนุษย์ของความสว่างเป็นเด็ดที่ไม่ใช่เชิงเส้น ในสเกล 0-255 ของคุณ 100 ควรสว่างเป็นสองเท่าของ 50 หรือควรเป็นปัจจัยที่ดีกว่านี้หรือไม่ ความแตกต่างระหว่างการรับรู้ควรพูด 3 และ 4 ควรเหมือนกันระหว่าง 203 และ 204 หรือไม่

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

มีความเป็นไปได้มากมายสำหรับความต้องการที่แตกต่างกัน

เมื่อบีบอัด

คุณถาม.

สมมติว่าการบีบอัดค่าอัลโกนั้นเปลี่ยนค่าพิกเซลบางค่าจาก 254 เป็น 255 หรือค่าอื่น ๆ ดังนั้น? สิ่งนี้ให้การประหยัดในขนาดไฟล์หรือส่งผลกระทบต่อคุณภาพของภาพอย่างไร?

อัลกอริทึมการบีบอัดแบบสมัยใหม่มีความซับซ้อนมากกว่านี้ แต่นี่เป็นตัวอย่างที่ดี ฉันจะใช้เลขฐานสิบหกFFแทน 255 และFEแทน 254 และจินตนาการว่าเรากำลังใช้การเข้ารหัสความยาวรันเป็นรูปแบบการบีบอัด และเพื่อความเรียบง่ายสมมติว่าเป็นขาวดำแทนที่จะเป็นสี ด้วยสิ่งนี้หากเรามีแถวของข้อมูลที่มีลักษณะดังนี้:

FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 

เราสามารถบีบอัดมันให้ง่ายมาก

16×FF 

... ซึ่งเป็นการออมที่ชัดเจน โดยทั่วไปเราสามารถเก็บ 16 ไบต์ในสอง (หนึ่งสำหรับการนับสองสำหรับข้อมูล) แต่สมมติว่าเรามี:

FF FF FE FF FE FF FF FF FF FF FE FE FE FF FE FE

ตอนนี้การเข้ารหัสแบบรันไทม์ทำให้เรา

2×FF 1×FE 1×FF 1×FE 5×FF 3×FE 1×FF 2×FE

... ซึ่งไม่มีการออมเลยและอันที่จริงอาจมีขนาดไฟล์เพิ่มขึ้น แต่ถ้าเราปัดFEค่าทั้งหมดเป็นFFเรากลับไปที่กรณีแรกด้วยการลดขนาดลงอย่างมากด้วยขนาดเล็ก แต่อาจสังเกตได้ยากว่าจะกระทบกับคุณภาพของไฟล์

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

ในระดับความลึกบิต

นอกจากนี้จากมุมมองเชิงตัวเลขอะไรที่ทำให้บางอย่างเช่นรูปแบบ 16 บิตแตกต่างจากรูปแบบ 32 บิต อีกครั้งรูปภาพเป็นเพียงอาร์เรย์ที่มีค่าจำนวนเต็มระหว่าง 0-255

ดังนั้น ..... อาร์เรย์ของค่าจำนวนเต็มระหว่าง 0-255 จึงเป็นอาร์เรย์แปดบิต (2⁸ = 256. ) ด้วยสามช่องนี้เป็นภาพ 24 บิต; บางรูปแบบมีช่องโปร่งใส ("อัลฟ่า") เช่นกันสำหรับ 32 บิต เราสามารถใช้ค่าที่สูงขึ้นต่อช่องซึ่งโดยปกติแล้วเราหมายถึงเมื่อเราพูดว่า "ความลึก 16 บิต" นั่นหมายความว่าอาร์เรย์ไปจาก 0-65535 (2¹⁶ = 65536) มากกว่า 0-255 โดยทั่วไปในรูปแบบนี้โดยทั่วไปแล้วเป็นเพียงตัวคูณที่ค่าสูงสุดแสดงถึงสิ่งเดียวกันในแต่ละสเกล แต่ความลึกของบิตที่สูงขึ้นจะให้ความแตกต่างเล็กน้อย (ดูคำตอบสำหรับสิ่งนี้เพิ่มเติม) นอกจากนี้ยังมีบางรูปแบบไฟล์พิเศษที่ใช้ 64-bit floats (!) แทนจำนวนเต็มสำหรับค่าหรือชนิดข้อมูลอื่น ๆ ขึ้นอยู่กับกรณีการใช้งาน แต่แนวคิดพื้นฐานเหมือนกัน .


s / 0-65536 / 0-65535 /
Ruslan

1
@ Ruslan จับที่ดี ขออภัยบัฟเฟอร์ที่มากเกินไป :)
mattdm

นอกจากนี้ยังมีคำอธิบายที่ดีว่าทำไมชุดดังกล่าวจึงโพลาไรซ์ FWIW
Wayne Werner

8

ไม่ภาพไม่ได้เป็นเพียงค่า RGB ในช่วง 0-255 แม้ว่าคุณจะไม่สนใจรูปแบบการจัดเก็บก็ตามมีหลายวิธีในการอธิบายสี นี่คือตัวอย่างบางส่วน:

  • ส่วนประกอบสีแดงสีเขียวและสีน้ำเงิน (RGB)
  • ส่วนประกอบของ Cyan, Magenta, Yellow และ Black (CMYK)
  • สีความอิ่มตัวและความสว่าง / ค่า (HSL / HSV)
  • ปริมาณแสงที่กระทบกับกลุ่มเซ็นเซอร์ในกล้อง
  • ปริมาณของแสงและทิศทางเมื่อกดเซ็นเซอร์ (ในกล้องแสง )

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

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


6
และถึงแม้จะมีบางสิ่งที่ "เรียบง่าย" เป็น RGB แต่ก็มีช่องว่างสีที่แตกต่างกัน บิตแมป RGB ธรรมดา 24 บิตที่เรียบง่ายอาจได้รับการแก้ไขแกมม่าตัวอย่างเช่นหากไม่มีการย้อนกลับการแก้ไขนั้นก็จะมืดเกินไป การกระจายของความเข้มอาจเป็นเส้นตรงหรืออะไรก็ได้ Adobe RGB และ sRGB เป็นทั้งบิตแมป RGB 24 บิต แต่มีการแสดงสีที่ต่างกันมาก เช่นเดียวกับ "ไม่มีสิ่งใดเป็นไฟล์ข้อความธรรมดา" ไม่มีรูปแบบ "ภาพธรรมดา" สิ่งที่ดีที่สุดที่คุณจะได้รับคือ "รูปแบบภาพดั้งเดิมสำหรับระบบ / แอพพลิเคชั่นนี้โดยเฉพาะ"
Luaan

1
ไม่เคยเห็นรูปแบบที่เก็บข้อมูล hsv / hsl แต่ฉันเคยเห็นรูปแบบที่เก็บข้อมูล LAB หรือ XYZ
joojaa

2
@Luaan คุณควรขยายเข้าไปในคำตอบ ความแตกต่างของแกมม่าเป็นสิ่งหนึ่งที่ไม่มีใครสามารถสัมผัสได้ในคำตอบของพวกเขา
Tim Seguine

5

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

อย่างไรก็ตามรูปแบบไฟล์นั้นแตกต่างกัน โดยทั่วไปมีวิธีที่แตกต่างกันหลายวิธีในการเป็นตัวแทนของภาพเดียวกันเช่นคนที่กล่าวถึง: bmp, png, jpg ฯลฯ แน่นอนว่าเมื่อคุณถอดรหัสพวกเขาแล้วภาพที่เข้ารหัสแบบ lossless สองภาพจะนำไปสู่เมทริกซ์เดียวกัน
คิดว่าเป็นไฟล์. txt ที่คุณบีบอัดด้วย zip ด้วยการเพิ่มความแปลกใหม่ที่การเข้ารหัสแบบไม่สูญเสียจะส่งคืนข้อความที่ไม่เหมือนกับต้นฉบับ แต่ใกล้เคียงจริง ๆ เกือบเหมือนข้อความที่เป็นแบบเลื่อนลง

การคงความคล้ายคลึงกับข้อความเอาไว้สมมติว่าคุณมีข้อความเหมือนกันบันทึกเป็น. txt, .docx, .pdf เป็นต้นเหตุใดไฟล์ทั้งหมดจึงไม่เหมือนกันทุกประการหากเนื้อหาเหมือนกัน (ตกลง txt ไม่มีการจัดรูปแบบ แต่อย่างอื่นทำ)

ตรวจสอบว่าการเข้ารหัส Netpbmแตกต่างจากJPEGอย่างไร


3

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

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

ตัวอย่างที่ดีของเหตุผลนี้คือความแตกต่างในการบีบอัดระหว่างไฟล์ PNG และไฟล์ TIFF

ไฟล์ PNG ใช้อัลกอริทึมการบีบอัดแบบใดแบบหนึ่งโดยเฉพาะ นั่นหมายความว่าภาพจะไม่ถูกจัดเก็บเป็นรายการตัวเลขจำนวนมากสำหรับแต่ละพิกเซล ตัวอย่างที่ง่าย: มันอาจเก็บสิ่งที่ระบุว่า "ในบล็อก 10x10 พิกเซลนี้พิกเซลทั้งหมดเป็นสี XYZ" จากนั้นแทนที่จะเก็บข้อมูลนั้น 100 ครั้งจะเก็บข้อมูลหนึ่งครั้งพร้อมข้อมูลเล็กน้อยเกี่ยวกับภูมิภาคที่ใช้ข้อมูล

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

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

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

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

ดังนั้นคุณถาม

แต่ฉันไม่ได้ถามอะไรนอกจากภาพ RBC พื้นฐาน 3 ช่อง ทั้งหมดที่ฉันรู้ก็คือถ้ามีคนจับฉันหนึ่งในนั้นตอนนี้ฉันมีจำนวนมากมาย ฉันไม่มีเหตุผลที่จะทราบว่าเหตุใดตัวเลขหนึ่งชุดอาจแตกต่างจากหมายเลขอื่น ๆ ตั้งแต่ 0 ถึง 255

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

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


1
But to get to the crux of your question - sometimes there are images which are stored in different formats, but each ultimately represents exactly the same array of numbers.ที่อาจจะเป็นจริงสำหรับภาพ lossless - แต่มันเป็นความผิดอย่างสมบูรณ์เช่นถ้าคุณเปรียบเทียบภาพ HEIF ต่ำบิตเรตที่มีอัตราบิตต่ำ JPEG
flolilo

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

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

1
ตัวอย่างเช่นบิต 16 ใช้เพียง 16 บิตต่อ "พิกเซล" แต่ BMP สีที่ไม่มีการบีบอัด 8 บิตจะใช้ 24 บิตต่อพิกเซลเนื่องจากมันต้องการเก็บข้อมูล 8 บิตสำหรับสีแดงสีเขียวและสีน้ำเงิน เหตุผลที่สามารถปรับ RAW ได้มากขึ้นคือข้อมูลสียังไม่ถูกรวมเข้าด้วยกัน คุณสามารถแก้ไขสิ่งต่าง ๆ เช่นสมดุลสีขาว (ซึ่งเปลี่ยนอิทธิพลของแสงสีแต่ละสีในการกำหนดข้อมูลสีของแต่ละพิกเซลที่เกิดขึ้น)
AJ Henderson

3

บิตแมป

บิตแมป (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 ที่ซับซ้อนมากขึ้นในคำตอบเดียว และฉันไม่เข้าใจว่าฟูริเยร์แปลงตัวได้ดีพอที่จะอธิบายพวกมันได้ทุกความยาว

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


3

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

ฉันจำได้ว่า (แต่น่าเสียดายที่ไม่สามารถหาออนไลน์ได้) การ์ตูนจากตำราภาษาศาสตร์: ช่างแกะสลักหินชาวอียิปต์สองคนกำลังนั่งอยู่ที่ด้านล่างสุดของกำแพงขนาดใหญ่ที่แกะสลักรูปคนเดินเป็นจำนวนมาก มีคนหนึ่งพูดกับอีกคนหนึ่งว่า "แน่นอนว่าต้องมีวิธีเขียนที่ง่ายกว่านี้ 'ฟาโรห์มีทหาร 100,000 นาย'" เก็บความคิดนั้นไว้ในใจ

ทีนี้สมมติว่าแถวแรกของภาพของคุณมีพิกเซลสีดำ 1,800 จะเป็นอย่างไร?

0 0 0    0 0 0     0 0 0   ....

ดังนั้นต้องใช้พื้นที่เก็บข้อมูลเท่าใด แต่ละค่าเป็นไบต์ สามไบต์ต่อพิกเซล, 1800 พิกเซลในแถว, ดังนั้น 5400 ไบต์ต่อแถวแล้ว ดังนั้นรูปภาพที่มีขนาด 1800 x 1200 จะต้องใช้เวลามากถึง 1200 เท่าซึ่งมากกว่า 6 เมกะไบต์ ดังนั้นตอนนี้เราไปค้นหาภาพจาก Google แล้วดาวน์โหลดภาพขนาด 1800x1200 สองภาพสมมติว่า.pngภาพหนึ่งภาพและ.jpgภาพเดียว ดูขนาดไฟล์: มันคือ 6 MB หรือไม่? ไม่มีทางก็มักจะมากขนาดเล็กกว่า และนั่นเป็นสิ่งที่ต้องการแน่นอนประหยัดพื้นที่ทั้งหมดและเวลาในการดาวน์โหลดที่สั้นลง ....

แล้วเกิดอะไรขึ้น กุญแจสำคัญคือว่าแม้ว่าคุณจะมีตัวเลขจำนวนมากในการจัดเก็บที่มีวิธีการที่แตกต่างกันเพื่อเป็นตัวแทนของตัวเลขเหล่านั้นในไฟล์ มีตัวอย่างของการเป็นตัวแทนที่มีประสิทธิภาพมากขึ้นที่นี่ในคำตอบของฉันสองย่อหน้าที่ผ่านมา ฉันเขียนคำว่า "1800 black pixels" นั่นคืออักขระ 17 ตัวและไม่จำเป็นต้องใช้มากกว่า 17 ไบต์ แต่มันอธิบายข้อมูลเดียวกันอย่างสมบูรณ์แบบที่เราคิดว่าต้องการ 5400 ไบต์อย่างสมบูรณ์ และคุณสามารถทำได้ดีกว่า 17 ไบต์ (และประหยัดความพยายามอย่างมากในการใช้งานการเข้ารหัส / ถอดรหัส) หากคุณไม่ได้ใช้ภาษาอังกฤษเพื่อเข้ารหัสข้อมูลนี้ แต่เป็นภาษาที่มีวัตถุประสงค์พิเศษมากกว่า ดังนั้นตอนนี้เราได้วางรูปแบบการบีบอัดภาพมากกว่าหนึ่งรูปแบบ: หนึ่งรูปแบบที่ใช้คำภาษาอังกฤษและรูปแบบที่มีประสิทธิภาพมากกว่านั้น ดูว่าจะเกิดอะไรขึ้น?

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

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

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


1

ใช่ แต่วิธีที่คุณได้รับ 1 และ 0 นั้นแตกต่างกันมาก

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

เพื่อให้เรื่องซับซ้อนมีช่องทางที่แตกต่างกัน CMYK, RGB, B&W เพียงเพื่อตั้งชื่อ เราจะไม่เข้าไปในนั้น นอกจากนี้ยังมีสเตจต่าง ๆ เช่นการจับภาพการจัดเก็บและการแสดงผล เราจะเข้าสู่สิ่งนั้นแม้ว่าตัวอย่างอีกครั้งที่ควรจะแสดงให้เห็นว่าไม่ถูกต้อง หากคุณต้องการตัวอย่างที่ถูกต้องคุณจะต้องค้นหาเอกสารทางเทคนิคมากมาย

ดังนั้นในตัวอย่างของเราเราจะดูภาพขาวดำ

00067000
00067000
00567800
04056090
40056009

ตัวเลขแสดงถึงความแข็งแกร่งของ "แบล็ก" นี่คือวิธีที่กล้องจับภาพ มันเป็นกล้องที่ดีดังนั้นมันจึงเป็นวิธีการจัดเก็บภาพ

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

302730
302730
204820
*04056090
1420262019

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

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

00011000
00011000
00111100
01011010
10011001

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

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

00077000
00077000
00888800
04056090
40066009

ในขณะที่คุณสามารถดูภาพเป็น "ดีกว่า" แต่มีการเปลี่ยนแปลงเล็กน้อยจากเดิม

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

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


บล็อกโค้ดที่ 2 ของคุณ (บีบอัด) กำลังแสดง RLE ใช่ไหม คุณควรบอกว่าคุณกำลังแทนที่ตัวอย่างด้วยซ้ำนับ + ตัวอย่างค่าเพื่อให้คนรู้ว่าการบีบอัดชนิดใดเพราะมันไม่ชัดเจนโดยสิ้นเชิงถ้าคุณไม่คาดหวังว่า RLE
Peter Cordes

1

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

ในรูปแบบพื้นฐานรูปภาพ (ภาพใดก็ได้) ที่แสดงบนหน้าจอเฉพาะนั้นเป็นเพียงตัวเลขที่เหมือนกันเท่านั้น ตัวเลขเหล่านั้นอาจเป็น 0-255 หรือ 0-65535 หรือ 0-Anything-32-bits-is-I- ลืม -go-google-it

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

นอกจากนี้รายละเอียดหนึ่งที่ฉันไม่ได้เห็นคนอื่น ๆ ที่นี่กล่าวถึงคือข้อมูลเซ็นเซอร์ภาพ RAW อย่างแท้จริงจากกล้องดิจิตอลอาจเป็น RGrGbB ในรูปแบบไบเออร์หรือ somesuch ซึ่งต้องมีการประมวลผลอย่างน้อยเล็กน้อย ความรู้สึกใด ๆ ต่อดวงตามนุษย์ Mk.1 โอกาสที่คุณจะไม่ได้รับสิ่งนั้นแม้แต่ในรูปแบบ RAW ที่บันทึกโดยกล้อง DSLR ของคุณเพราะมันไร้ประโยชน์จนกว่าคุณจะแปลงมันเป็นกริดที่ดีของพิกเซล RGB หรือ YUV ไม่ว่าจะเป็น 8, 16, 32 หรือลึกกว่าสิบล้านบิต

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

สำหรับการอ่านก่อนนอนแบบเบาโปรดดูที่ส่วน "รูปแบบภาพเฟรม": http://focus.ti.com/lit/ug/sprufg8b/sprufg8b.pdf

กลับไปที่คำถามเดิมของคุณเกี่ยวกับความแตกต่างระหว่างไฟล์ภาพที่ไม่บีบอัดเช่น TIFF / RAW / IFF / PNG

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

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

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

RAW ยังเก็บข้อมูลเกี่ยวกับวิธีการเปลี่ยนกลุ่มข้อมูลนั้นกลับไปเป็นภาพที่มนุษย์มองเห็นได้โดยปรับแต่งทุกอย่างที่คุณต้องการเพื่อให้ข้อมูลทำให้ภาพดู "ถูกต้อง"

TIFF เป็นรูปแบบภาพแรก ๆ ที่ใช้ในการส่งข้อมูลกราฟิกไปยังเครื่องพิมพ์ (เมื่อเครื่องพิมพ์ที่ใช้กราฟิกได้เริ่มมีราคาไม่แพง) มันค่อนข้างง่ายที่จะประมวลผลบนไมโครโปรเซสเซอร์ขนาดเล็กราคาถูกภายในเครื่องพิมพ์

IFF (ใช่นั่นเป็นเรื่อง) เป็นรูปแบบที่คล้ายกันที่ใช้กับคอมพิวเตอร์ Amiga ฉันเชื่อว่าพวกเขาคิดค้นหรือเป็นหนึ่งในแพ็คเกจสียอดนิยม แต่ฉันใช้มันที่นี่เป็นตัวอย่างเพราะถึงแม้ว่ามันจะเก็บข้อมูลรูปภาพบิตแมปเหมือนกับที่อื่น ๆ แต่ก็สนับสนุนข้อมูลที่ไม่มีการบีบอัดหรือ RLE ตัวแปรความลึกบิตจาก 1 บิตเป็นโมโน 8 บิต 256 สี (แต่ด้วย พาเล็ต RGB 3x8 บิตให้เลือกสำหรับแต่ละสี) รวมถึงโหมดพิเศษที่เรียกว่า Halftone และ Hold-And-Modify ทำให้มีสีได้มากกว่าเครื่องอื่น ๆ ในยุคนั้น โอ้และสนับสนุนการเคลื่อนไหวด้วยเช่นกัน (เช่น GIF) ดังนั้นไฟล์ IFF สามารถเก็บเฟรมจำนวนเท่าใดก็ได้ด้วยความล่าช้าของตัวแปรระหว่างเฟรมและแต่ละเฟรมอาจมีจานสีของตัวเอง ดังนั้น IFF จะรวมข้อมูลพิเศษเพื่อจัดการทั้งหมดนี้เมื่อเปรียบเทียบกับไฟล์ TIFF

PNG เป็นรูปแบบภาพที่ไม่สูญเสียรูปแบบอีกครั้งซึ่งเก็บข้อมูลบิตแมปอีกครั้ง แต่รองรับคุณสมบัติบางอย่างเช่นช่องอัลฟา 8 บิตเพื่อความโปร่งใสที่ผันแปรทั่วทั้งภาพ (มีประโยชน์บนหน้าเว็บ) ดังนั้นข้อมูลภาพ "payload" อาจดูคล้ายกัน แต่ wrapper รอบ ๆ นั้นแตกต่างกันและ payload อาจมี RGBA มากกว่าข้อมูล RGB ต่อพิกเซล

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

หวังว่าจะช่วย!


0

แค่คิดว่าฉันจะพูดพร้อมกับข้อมูลที่ควรจะเป็นคำตอบแรกของคำถามนี้

พิกเซลในภาพจะไม่ถูกจัดเก็บในไบต์ - ยกเว้นว่าภาพจะเป็นสีเดียวเช่นขาวดำเท่านั้น

หากคุณมีภาพ truecolor แต่ละพิกเซลจะถูกแทนด้วย 16 บิตหรือ 2 ไบต์ - เป็นค่าเดียว หากคุณมีภาพ 32 บิตดังนั้นแต่ละพิกเซลต้องใช้ 32 บิตหรือ 4 ไบต์อีกครั้งเป็นค่าเดียว

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

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

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

นั่นเป็นเหตุผลที่เรามีสิ่งต่าง ๆ เช่นภาพ 16 บิตและ 32 บิตและไฟล์เสียง 16 บิตและ 24 บิต ยิ่งคุณใช้พิกเซลหรือตัวอย่างเสียงมากเท่าไหร่คุณก็ยิ่งแสดงออกได้มากขึ้นเท่านั้น - 16 บิตสามารถกำหนดสีเฉพาะ 64k ได้ แต่ 32 บิตสามารถกำหนดสีพิเศษได้มากกว่า 4 ล้านสี ภาพขาวดำใช้ 1 บิตต่อพิกเซล - ทั้งเป็นเปิดหรือปิด

ด้วยไฟล์เสียงยิ่งคุณใช้บิตต่อตัวอย่างมากเท่าไหร่ก็ยิ่งมีรายละเอียดมากขึ้นเท่านั้น


0

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

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


1
นี่เป็นเว็บไซต์ถ่ายภาพและเนื่องจากกล้องดิจิตอลบันทึกอาร์เรย์พิกเซลมากกว่าเวกเตอร์ฉันจะไม่พูดว่า "ลืมไป" มากจนไม่ธรรมดาในบริบทนี้
mattdm

0

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

คำถามแรกที่นี่คือ:

นอกจากนี้จากมุมมองเชิงตัวเลขอะไรที่ทำให้บางอย่างเช่นรูปแบบ 16 บิตแตกต่างจากรูปแบบ 32 บิต อีกครั้งรูปภาพเป็นเพียงอาร์เรย์ที่มีค่าจำนวนเต็มอยู่ระหว่าง 0 -255

ดังที่แสดงไว้ก่อนหน้า: ไม่เลย รูปภาพไม่ได้เป็นเพียงอาร์เรย์ของค่าจำนวนเต็มระหว่าง 0-255 จริงๆแล้วมันอาจเป็นอาเรย์เดี่ยวหรือหลายมิติที่มีค่า 0 ถึง 65535, อาเรย์ของ 0 ถึง 4294967295 หรือแม้แต่อาเรย์ของบิต (บิตสามารถเก็บค่า 0 หรือ 1 นั่นคือทั้งหมด) ที่ถูกแปลงโดยซอฟต์แวร์ที่สามารถ อ่านไฟล์รูปภาพเป็นตัวเลขจำนวนเต็มตามกฎการเข้ารหัสต่างๆ

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

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

  • BIT - ถือ 0 หรือ 1
  • UINT8 - เลขจำนวนเต็ม 8 บิตที่ไม่ได้ลงชื่อ - พวกเขาสามารถเก็บค่าได้ระหว่างช่วง [0 ถึง 255]
  • INT8 - จำนวนเต็ม 8 บิตที่เซ็นชื่อ - พวกเขาสามารถเก็บค่าระหว่างช่วง [-126 ถึง 127]
  • UINT16 - จำนวนเต็ม 16 บิตที่ไม่ได้ลงชื่อ - พวกเขาสามารถเก็บค่าได้ระหว่าง [0 ถึง 65535] ช่วงเวลา
  • INT16 - จำนวนเต็ม 16 บิตที่ไม่ได้ลงชื่อ - พวกเขาสามารถเก็บค่าระหว่างช่วง [−32768 ถึง 32767]
  • UINT32 - จำนวนเต็ม 32 บิตที่ไม่ได้ลงชื่อ - พวกเขาสามารถเก็บค่าได้ระหว่าง [0 ถึง 4294967295] ช่วงเวลา
  • INT32 - จำนวนเต็ม 32 บิตที่ไม่ได้ลงชื่อ - พวกเขาสามารถเก็บค่าช่วง [−2147483648 ถึง 2147483647] ช่วงเวลา
  • หรือการรวมกันของชนิดข้อมูลเหล่านั้นทั้งหมดในรูปแบบที่ซับซ้อนมากขึ้น ตัวอย่างเช่น UINT16 (16 BIT) ถือ 3 ค่าที่แตกต่างกัน 4 ค่าแรก BIT ถือครองระหว่าง 0 ถึง 127, BIT ถัดไปถือ 0 หรือ 1 และอื่น ๆ

ยิ่งไปกว่านั้นมีบางสิ่งบางอย่างที่โปรแกรมเมอร์ต้องจัดการเมื่ออ่านหรือเขียนข้อมูลจำนวนเต็มจากไฟล์ ความ EndianessEndianness หมายถึงลำดับตามลำดับซึ่งไบต์ (UINT8 จากตารางของเรา) ถูกจัดเรียงเป็นค่าตัวเลขที่มากขึ้นเมื่อเก็บไว้ในหน่วยความจำหรือไฟล์ Endianness เป็นที่สนใจในวิทยาการคอมพิวเตอร์เนื่องจากรูปแบบที่ขัดแย้งกันและเข้ากันไม่ได้มีสองรูปแบบที่ใช้กันโดยทั่วไป: ค่าอาจแสดงในรูปแบบ big-endian หรือ little-endian ขึ้นอยู่กับว่าบิตหรือไบต์หรือส่วนประกอบอื่น ๆ บิต) หรือจุดสิ้นสุดเล็ก ๆ (บิตที่สำคัญน้อยที่สุด) ใส่ง่ายคุณสามารถจัดเก็บค่าเช่นนี้ 0000000011011111 หรือ ... เช่นนี้ 1101111100000000 ขึ้นอยู่กับหรือคำสั่ง endian ที่คุณเลือก และคุณมีอิสระที่จะเลือกคำสั่งซื้อที่เหมาะสมกับวัตถุประสงค์ของคุณ ไม่มีกฎอื่น ๆ ที่คุณทำเมื่อคุณออกแบบรูปแบบไฟล์ภาพ

โปรดสังเกตว่าในจำนวนเต็มโปรแกรมคอมพิวเตอร์กำลังใช้พื้นที่มากหรือน้อยขึ้นอยู่กับค่า เช่นเดียวกับที่คุณต้องการกระดาษเพิ่มเพื่อเขียน 255255255 คุณต้องการ BIT เพิ่มเติมเพื่อเขียนค่าที่ใหญ่ขึ้น จากนั้นในภายหลังเมื่อคุณต้องการอ่านค่าคุณจะต้องรู้กฎที่คุณสร้างเมื่อคุณเขียน ไม่อย่างนั้นมันเป็นไปไม่ได้ที่คุณจะคิดว่าจะอ่านแค่อาเรย์ที่มีค่าจำนวนเต็มระหว่าง 0 -255เพียงเพราะคุณไม่รู้ว่าเก็บตัวเลขเหล่านั้นไว้ที่ไหนและเก็บตัวเลขเหล่านั้นอย่างไรจากตัวเลือกมากมายที่คุณมี (BIT, UINT8 , UINT16, UINT32 หรือการรวมกันของชนิดข้อมูลคอมพิวเตอร์เหล่านั้นทั้งหมด) และอย่าลืม Endianness หากคุณไม่ทราบว่าข้อมูลถูกเขียนขึ้นโดยใช้คำสั่งใหญ่ - เล็กหรือปลายเล็กคุณไม่สามารถอ่านค่าที่เหมาะสมได้

เนื่องจากรูปภาพนี้ไม่เพียงแค่อาร์เรย์ที่มีค่าจำนวนเต็มระหว่าง 0 - 255 บางส่วนเป็นอาร์เรย์ของ UINT16 (รูปภาพ 16 บิต) รูปอื่น ๆ จึงเป็นอาร์เรย์ของ UINT32 (รูปภาพ 32 บิต) หรืออื่น ๆ เป็นอาร์เรย์ของ UINT8 (ภาพ 8 บิต) โปรแกรมเมอร์คอมพิวเตอร์ที่มีความคิดสร้างสรรค์มากบางคนสามารถใช้ประเภทของลายเซ็นที่ใช้งานคุณได้ด้วยอาร์เรย์ของ INT8 ซึ่งหมายถึงอาร์เรย์ของค่าระหว่าง -126 ถึง 127

ที่จริงแล้วเมื่อคุณอ่านไฟล์รูปภาพหนึ่งในข้อมูลแรกที่คุณพบมักจะเป็น BIT บางตัวที่แสดงถึงความกว้างและความสูงของรูปภาพ และนั่นไม่ใช่แค่ค่า 0-255 สิ่งเหล่านี้เป็นชนิดข้อมูลบางชนิดที่ถูกโปรแกรมเมอร์เลือกไว้ โปรแกรมเมอร์บางคนอาจคิดว่า 16 BIT นั้นเป็น enogh สำหรับการจัดเก็บความกว้างของภาพสูงสุด 65535 พิกเซลเพราะพวกเขากำลังออกแบบรูปแบบภาพที่ใช้ในเกมเพื่อเก็บรูปภาพปุ่มเล็ก ๆ โปรแกรมเมอร์อื่นบางคนอาจใช้ค่า 32 บิตที่นี่ช่วยให้คุณเก็บภาพที่มีความกว้างและความสูง 4294967295 โปรแกรมเมอร์ NASA ที่บ้าบางคนอาจใช้ 64 บิตในการจัดเก็บภาพถ่ายขนาดใหญ่ของกาแลคซีสูงถึง 18446744073709551615 พิกเซลหากคุณไม่ทราบกฎคุณไม่สามารถอ่าน "ค่า" เหล่านั้นในขณะที่คุณเรียกพวกเขา เพราะคุณไม่ทราบว่าพวกเขาเริ่มต้นที่ใดในไฟล์ภาพและที่สิ้นสุด ดังนั้นคุณจะจบลงด้วย BIT จำนวนมากคุณไม่เข้าใจอะไรเลย

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

รูปแบบไฟล์ที่ใช้งานง่ายของภาพขาวดำที่มีค่าเดียว 166 สำหรับการแสดงภาพ 4x2 พิกเซล:

ภาพ (1 - พิกเซลดำ, 0 - พิกเซลขาว):

1010 
0110

รูปแบบไฟล์นี้ใช้ 1 BIT ต่อ PIXEL เก็บไว้เป็นค่าจำนวนเต็มเดียว 8 บิต 166 (10100110) นั่นคือทั้งหมดที่ ไม่มีการใช้อาร์เรย์ของค่า 0-255 แต่มีค่า 0 หรือ 1 ที่แตกต่างกัน 8 ค่าที่เก็บเป็นค่า 166

หากคุณใช้อาร์เรย์ค่า 0-255 สำหรับแต่ละพิกเซล * 3 ครั้งสำหรับ RGB คุณจะสิ้นสุดด้วยภาพที่ใหญ่กว่า 24 เท่า รูปแบบไฟล์นี้บันทึกเพียง 24 เท่าพื้นที่ดิสก์ที่คุณต้องการบันทึกภาพเช่นนี้หรือน้อยกว่าหน่วยความจำคอมพิวเตอร์ 24 เท่าที่จำเป็นในการอ่านและเก็บภาพนี้ไว้ใน RAM คอมพิวเตอร์เมื่อคุณใช้ภาพนี้เช่นในเกม 3D ที่มีประสิทธิภาพสูง วาดบางสิ่งบางอย่างบนหน้าจอด้วย (พื้นผิวของฝุ่นละอองนับพันที่บินไปมาอาจเป็นตัวเลือกที่ดี :))

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