ปัจจัยใดที่ทำให้หรือป้องกัน“ การสูญเสียโดยรวม” เมื่อ JPEG ถูกบีบอัดซ้ำหลาย ๆ ครั้ง?


29

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

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

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

(โปรดอย่าเพียง แต่ส่งมอบและดึงดูดแนวคิดทั่วไปของการสูญเสีย)

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




ที่เกี่ยวข้อง
Mehrdad

2
@MonkeyZeus ข้อมูลภาพบางส่วน (เล็ก) หายไปเนื่องจากข้อผิดพลาดในการปัดเศษที่คุณภาพ 100 การบีบอัดซ้ำที่การตั้งค่าเดียวกัน (เช่น 80) ไม่ส่งผลให้ข้อมูลสูญหายแบบก้าวหน้า นั่นคือ "ความรู้ทั่วไป" คำถาม & คำตอบนี้มีจุดมุ่งหมายเพื่อแก้ไข
xiota

1
@MonkeyZeus ค่าเช่น "100" และ "80" (หรือ "10, 11, 12" ใน Photoshop) เป็นค่าที่กำหนด - 100% ไม่สูญเสีย
mattdm

คำตอบ:


32

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

  • ขอบเขตของ MCU ยังคงเหมือนเดิม (บล็อก 8x8)

  • การสุ่มตัวอย่าง Chroma ถูกปิดใช้งาน

  • DQT คงที่ (การตั้งค่าคุณภาพเดียวกัน)

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


อัลกอริทึมการบีบอัด JPEG

  1. แปลง colorspace หากต้องการข้อมูลสี downsample (สีมา subsampling) (Lossy) ถ้าไม่ได้ downsampled การสูญเสียของข้อมูลที่เป็นผลมาจากข้อผิดพลาดในการปัดเศษ

  2. การแบ่งกลุ่ม แบ่งแต่ละช่องเป็นบล็อก 8x8 (MCU = หน่วยการเข้ารหัสขั้นต่ำ) (Lossless)

    หมายเหตุ: หากเปิดใช้งานการสุ่มตัวอย่าง Chroma ตัวประมวลผลอาจเป็น 16x8, 8x16 หรือ 16x16 ในแง่ของภาพต้นฉบับ อย่างไรก็ตาม MCUs ยังคงเป็นบล็อก 8x8 ทั้งหมด

  3. การแปลงโคไซน์ไม่ต่อเนื่อง (DCT) ในแต่ละ MCU การสูญเสียข้อมูลที่เป็นผลมาจากข้อผิดพลาดในการปัดเศษ

  4. ควอน  ค่าในแต่ละเซลล์ของ MCU จะถูกหารด้วยตัวเลขที่ระบุในตารางควอนติเซชั่น (DQT) ค่าจะถูกปัดเศษลงซึ่งส่วนใหญ่จะเป็นศูนย์ นี่คือส่วนสูญเสียหลักของอัลกอริทึม

  5. ซิกแซกสแกน จัดเรียงค่าใหม่ใน MCU แต่ละตัวตามลำดับตัวเลขตามรูปแบบ zig-zag ศูนย์ที่เกิดขึ้นระหว่างการควอนตัมจะถูกจัดกลุ่มเข้าด้วยกัน (Lossless)

  6. DPCM = การปรับรหัสพัลส์แบบดิฟเฟอเรนเชียล แปลงลำดับตัวเลขเป็นรูปแบบที่ง่ายต่อการบีบอัด (Lossless)

  7. RLE = เรียกใช้การเข้ารหัสความยาว ศูนย์ที่ต่อเนื่องกันจะถูกบีบอัด (Lossless)

  8. รหัสเอนโทรปี / Huffman (Lossless)

บีบอัด JPEG อีกครั้ง

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

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

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

การสาธิต (การตั้งค่าคุณภาพเดียวกัน)

ฉันเขียนbashสคริปต์ต่อไปนี้ซึ่งใช้ ImageMagick เพื่อบีบอัดไฟล์ JPEG ซ้ำ ๆ ตามการตั้งค่าคุณภาพที่กำหนด:

#!/usr/bin/env bash
n=10001; q1=90
convert original.png -sampling-factor 4:4:4 -quality ${q1} ${n}.jpg

while true ; do
   q2=${q1}            # for variants, such as adding randomness
   convert ${n}.jpg -quality ${q2} $((n+1)).jpg
   #\rm $((n-5)).jpg   # uncomment to avoid running out of space
   n=$((n+1))

   echo -n "$q2  "
   md5sum ${n}.jpg
done

หลังจากให้มันทำงานไปสองสามร้อยครั้งฉันก็วิ่งmd5sumตามผลลัพธ์:

d9c0d55ee5c8b5408f7e50f8ebc1010e  original.jpg

880db8f146db87d293def674c6845007  10316.jpg
880db8f146db87d293def674c6845007  10317.jpg
880db8f146db87d293def674c6845007  10318.jpg
880db8f146db87d293def674c6845007  10319.jpg
880db8f146db87d293def674c6845007  10320.jpg

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

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

แล้วผลลัพธ์ของ @ mattdmล่ะ

ฉันพยายามจำลองผลลัพธ์ของ mattdm โดยใช้ Imagemagick บน Ubuntu 18.04 ต้นฉบับคือการแปลงดิบเป็น TIFF ใน Rawtherapee แต่ดูเหมือนว่าจะไม่สามารถใช้ได้อีกต่อไป ในสถานที่นั้นฉันเอาเวอร์ชั่นขยายและลดขนาดให้เป็นขนาดดั้งเดิม (256x256) จากนั้นฉันบีบอัดซ้ำอีกครั้งที่ 75 จนกระทั่งฉันได้มาบรรจบกัน นี่คือผลลัพธ์ (ดั้งเดิม, 1, n, ความแตกต่าง):

พยายามที่จะทำซ้ำ mattdm

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

แล้วการตัดต่อของ @ thsล่ะ

ฉันบีบอัดรูปภาพจากมุมบนซ้ายของภาพตัดต่อจนกระทั่งลู่เข้าที่ 90 นี่คือผลลัพธ์ (ดั้งเดิม, 1, n, ความแตกต่าง):

พยายามทำซ้ำภาพตัดต่อ

หลังจากเปิดใช้งานการสุ่มตัวอย่าง Chroma สีจะเปลี่ยนตามเวลาที่ถึงสถานะคงที่

ths สีกะ

การเปลี่ยนการตั้งค่าจำนวนเล็กน้อย

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

q2=$(( (RANDOM % 3)*5  + 70 ))

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

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

การเปลี่ยนการตั้งค่าจำนวนมาก

Eeyore ไม่มีความสุขเมื่อq2มีการเปลี่ยนแปลงเช่นนั้น:

q2=$(( (RANDOM % 9)  + 90 ))

ในการสร้างวิดีโอให้ใช้ffmpeg:

rename 's@1@@' 1*.jpg
ffmpeg -r 30 -i %04d.jpg -c:v libx264 -crf 1 -vf fps=25 -pix_fmt yuv420p output.mp4

การรับชมการทำซ้ำ 9999 ครั้งแรกนั้นเกือบจะเหมือนการดูน้ำเดือด อาจต้องการเพิ่มความเร็วในการเล่นเป็นสองเท่า นี่คือ Eeyore หลังจากทำซ้ำ 11,999:

11999 การวนซ้ำสุ่ม DQT

จะเกิดอะไรขึ้นถ้าขอบเขตของ MCU เปลี่ยนแปลง?

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

  • นี่คือสิ่งที่เกิดขึ้นในวิดีโอที่หมุนภาพด้วยขนาดที่ไม่สามารถหารด้วย 8

แล้วการแก้ไขล่ะ?

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

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

แล้ววิดีโอเหล่านั้นล่ะ?

  • การใช้งาน JPEG ผิดพลาดหรือไม่ ( ประหยัดอีก 500 ครั้งด้วย Photoshop ที่ 10/12 )

  • การเปลี่ยนการตั้งค่าคุณภาพ (วิดีโอส่วนใหญ่)

  • รบกวนขอบเขตของ MCU (การครอบตัดหรือการหมุน )

  • กลยุทธ์อื่น ๆ ที่ลดคุณภาพของภาพหรือรบกวนอัลกอริธึม JPEG?

ฉันสามารถเขียนต้นฉบับของฉันด้วย JPEG ที่บีบอัดใหม่ได้หรือไม่

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

JPEG ไม่สามารถใช้กับภาพที่ใช้มากกว่า 8 บิตต่อสี


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

2
ฉันเพิ่งทดสอบด้วยสคริปต์เดียวกับในคำตอบ นี่คือภาพตัดต่อของทุก ๆ ภาพที่ 20 ขึ้นไป tp 100: i.stack.imgur.com/xtob6.jpgที่สำคัญ
ths

2
อา พบปัญหากับภาพของฉัน หากคุณเปิดใช้การสุ่มตัวอย่าง Chroma ไว้นั่นจะนำไปสู่การลดระดับความก้าวหน้า
ths

2
พบว่าเกินไป ดังนั้นการเปิดใช้งานการสุ่มสี Chroma จะเปลี่ยนสีในภาพก่อนถึงสถานะคงที่
xiota

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

20

การสูญเสียการบีบอัดซ้ำเป็นจริงโดยเฉพาะเมื่อทำงานกับการบีบอัด JPEG ในระดับที่สูงขึ้น

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

หากคุณบันทึกอีกครั้งด้วยการบีบอัดในระดับต่ำ (คุณภาพสูงเช่น "100" ใน Gimp หรือ 11 หรือ 12 ใน Photoshop) สิ่งประดิษฐ์ที่เพิ่มเข้ามาใหม่จะยากที่จะสังเกตเห็น มันจะไม่ทำให้ภาพดีขึ้นแต่ไม่แย่ลงอย่างมีนัยสำคัญ อย่างไรก็ตามมันจะแนะนำการเปลี่ยนแปลงทั่วทั้งภาพ

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

นี่คือต้นฉบับที่ไม่บีบอัด:

ดั้งเดิมไม่มีการบีบอัด jpeg

นี่คือผลลัพธ์ของ JPEG ที่ 75%:

jpeg แรก

และนี่คือที่บันทึกใหม่:

รอบที่สอง

การบันทึกในวินาทีเดียวนั้นทำให้เกิดการย่อยสลายจำนวนมาก!

และนี่คือภาพที่รวมกันเป็นครั้งสุดท้าย (รอบที่ 8):

jpeg แปรสภาพ

อีกครั้งแน่นอนว่าสีสันนั้นมีมากยิ่งขึ้นรวมถึงรูปแบบสีผิดเพี้ยน อัลกอริทึมมาบรรจบกัน แต่เป็นเวอร์ชั่นที่เสื่อมโทรมอย่างมาก ดังนั้นอย่าทำอย่างนั้น

แต่นี่คือสิ่งเดียวกันกับระดับคุณภาพ 99% หลังจากผ่านไป 9 ครั้ง (จุดที่มันรวมกันเพื่อให้ผ่านเหมือนกัน):

99% 9 ครั้ง

ที่นี่ความแตกต่างเพิ่งจะลงทะเบียน (ฉันหมายถึงอย่างแท้จริงเปรียบเทียบพิกเซลทีละพิกเซลกับรุ่นที่ไม่บีบอัดและการเบี่ยงเบนเป็นเพียงเสียงสุ่มเล็กน้อย) ดังนั้นถ้าฉันกลับไปที่ภาพ 75% แรกแล้วบันทึกเป็น 99% อย่างนี้ (หลังจากเพียงครั้งเดียว):

75% หนึ่งครั้งและ 99% ครั้งเดียว

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

ในวิดีโอเหล่านั้น: ฉันพบว่าวิดีโอนี้เป็นเพลงยอดนิยมของ Google โปรดทราบว่ามันระบุไว้ในคำอธิบาย:

นี่คือสิ่งที่จะเกิดขึ้นหากคุณเข้ารหัสภาพ JPEG ซ้ำหลาย ๆ ครั้งที่การตั้งค่าคุณภาพสูงแบบสุ่ม (85 หรือสูงกว่า)

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

วิดีโอที่สองผมพบว่า:

ภาพ JPEG ถูกคัดลอกและหมุนการปฏิวัติเต็มรูปแบบสำหรับแต่ละภาพ [... ] (การกระทำ 596 "หมุนตามเข็มนาฬิกา")

ดังนั้นอีกครั้งมีการดำเนินการบางอย่างเพื่อเก็บข้อผิดพลาดสะสม

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

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


(1) คุณประหยัดได้ 75% เมื่อตั้งค่าดังกล่าวคาดว่าจะสูญเสียคุณภาพของภาพ (2) ภาพนั้นถูกเลือกและแก้ไขเพื่อให้เกินขนาดการบีบอัดไฟล์ JPEG (3) ภาพมาบรรจบกันหลังจากรอบการบีบอัดซ้ำ 8 รอบหลังจากนั้นจะไม่มีการลดคุณภาพของภาพลงอีก (4) วิดีโอของภาพที่แสดง "การสูญเสียรุ่น" จะไม่มีอะไรเกิดขึ้นมากมายหลังจาก 1/4 วินาทีแรก
xiota

5
(1) ใช่ (2) "ถูกเลือก" เป็นภาพถ่ายทั่วไปที่ใคร ๆ ก็สนใจสิ่งนี้ "Altered" เพื่อซูมเข้าเท่านั้นโปรดทราบว่านี่เป็นเพียงการแสดงที่นี่ - ฉันไม่ได้เพิ่มขนาดภาพที่ฉันใช้งานเป็นสองเท่า (3) ใช่ แต่ในทางปฏิบัติสำหรับการแก้ไขมันเป็นสองสามรอบแรกที่คุณอาจสนใจ (4) นั่นเป็นความจริง แต่ก็ไม่ได้หมายความว่าการมาบรรจบกันในกรณีที่เลวร้ายที่สุดและการอยู่ที่นั่นมีประโยชน์ไม่ว่าทางใด
mattdm

ในการทำซ้ำถ่ายภาพแรกและปรับขนาดเป็น 256 × 256 โดยไม่มีการสุ่มใหม่หรือการแก้ไขใด ๆ
mattdm

ฉันไม่เห็นความแตกต่างระหว่างภาพที่คุณแสดงมากนัก แต่ถ้าฉันใช้ความแตกต่างของภาพที่บีบอัดซ้ำและภาพที่บีบอัดซ้ำซ้อนและขยายภาพเพื่อให้มองเห็นได้ฉันจะได้ผลลัพธ์ ( น่าเชื่อถือมากกว่านี้): i.stack.imgur.com/57uaY.pngตอบสิ่งที่ทำอย่างแน่นอน) มันน่าเชื่อถือมากขึ้นเพราะคนไม่ต้องจ้องมองที่ภาพเพื่อตรวจจับความแตกต่างของนาที
Szabolcs

ความแตกต่างนั้นค่อนข้างเล็ก หากคุณมีหน้าจอ LCD ขนาดใหญ่ "แกมมา" ที่แตกต่างกันซึ่งเป็นผลมาจากมุมมองที่แตกต่างกันเล็กน้อยสามารถทำให้สิ่งประดิษฐ์โดดเด่นยิ่งขึ้น
xiota

5

การบีบอัดซ้ำมีผลต่อการวัดคุณภาพของภาพและเอฟเฟกต์นั้นเด่นชัดมากขึ้นเมื่อเปลี่ยนอัตราการบีบอัด

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

  • บันทึกภาพ TIFF เป็น JPG95 - .9989
  • บันทึกภาพ TIFF เป็น JPG83 - .9929
  • บันทึกภาพ JPG95 เป็น JPG95 10 ครั้ง - .9998
  • บันทึกภาพ JPG83 เป็น JPG83 อีก 10 ครั้ง - .9993
  • บันทึก JPG95 เป็น JPG83 จากนั้นบันทึกเป็น JPG95 - .9929
  • บันทึก JPG95 เป็น JPG83 จากนั้น JP83 เป็น JP92 จากนั้น JPG92 เป็น JPG86 - .9914

ดังนั้นปริมาณของความคล้ายคลึงกันของโครงสร้างที่สูญเสียไปกับการบีบอัดซ้ำที่ 10 เท่าคือ 1 / 10th ของการสูญเสียซึ่งเป็นการประหยัดที่คุณภาพจาก tiff อย่างไรก็ตามการสูญเสียคุณภาพจากการเปลี่ยนการบีบอัด JPG แม้แต่ครั้งเดียวก็เท่ากับคุณภาพที่สูญเสียไปเป็นการบันทึกภาพนั้นจาก Tiff เป็น JPG

ฉันจะใช้การทดสอบนี้อีกไม่กี่วิธีและอัปเดต

วิธีการ : ใน ImageJ:

  1. แปลง Tiff RGB เป็นระดับสีเทา 8 บิต
  2. บันทึก JPG95 และ JPG83 จาก Tiff Original
  3. ดำเนินการบันทึกใหม่อีกครั้งตามที่ระบุ
  4. โหลดภาพเปรียบเทียบและใช้ปลั๊กอินดัชนี SSIM

หมายเหตุ: หลายคนกำลังดูค่า SSIM เป็นครั้งแรกที่อ่านเป็นเปอร์เซ็นต์และถือว่าความแตกต่างนั้นเล็ก นี่ไม่จำเป็นต้องเป็นเรื่องจริง ควรเปรียบเทียบค่า SSIM เทียบกับค่าอื่นแทนที่จะถือว่าเป็นความแปรปรวนจาก 1


@xiota ฉันใช้ปลั๊กอิน SSIM สำหรับ ImageJ เป็นหนึ่งในการปรับใช้ SSIM ไม่กี่ตัวที่อนุญาตให้ปรับพารามิเตอร์ (ฉันตั้งค่าความกว้างของตัวกรองเป็น 8 เพื่อที่จะตรวจจับการเปลี่ยนแปลงภายในบล็อก JPEG ขนาด 16px ได้มากกว่า) ฉันชอบ SSIM เพราะไวต่อความแตกต่างของพลังงาน แจกจ่าย ภาพที่แตกต่างอาจทำให้เข้าใจผิดหากความแตกต่างถูกยกเลิกหรือความแตกต่างมีความเข้มข้นในพื้นที่ขนาดเล็ก
วิทยาศาสตร์ PhotoSerator

และสำหรับคำถามที่สองของคุณที่บอกว่าความแตกต่างจาก JPG95 ถึง JPG83 ถึง JPG95 นั้นเหมือนกับ Tiff ถึง JPG83 ถ้าคุณต้องการ Tiff-JPG95-JPG83-JPG95 นั่นคือ. 9923
วิทยาศาสตร์ภาพถ่าย

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

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

4

ไม่มีอะไรที่เหมือนกับการทดลอง สคริปต์ทุบตีต่อไปนี้ (เขียนบน Linux สามารถทำงานบน OSX หากคุณมีImageMagick ):

  • เริ่มต้นด้วยภาพแรก (ชื่อstep000.jpg)
  • ใช้ไฟล์ JPEG เพิ่มจุดสีขาว (เพื่อพิสูจน์ว่านี่เป็นภาพใหม่) และบันทึกเป็น (PNG แบบไม่สูญเสียข้อมูล)
  • ใช้ PNG และบีบอัดอีกครั้งเป็น JPEG (ดังนั้นเราจึงไม่เคยบีบอัด JPEG-to-JPEG และไม่สามารถตั้งสมมติฐานได้ว่าซอฟต์แวร์เพิ่งคัดลอกบล็อกที่เข้ารหัส)
  • สร้างรูปภาพที่แสดงพิกเซลที่แตกต่างระหว่าง JPEG สองรายการ
  • ล้างและทำซ้ำโดยใช้เอาต์พุต JPG ของขั้นตอนก่อนหน้า

ผลที่ได้คือ:

  1. ไม่มีการสูญเสียคุณภาพ JPG สูงนัก
  2. ในที่สุดข้อผิดพลาดในการปัดเศษจะเสร็จสมบูรณ์หลังจากผ่านไปหลายชั่วอายุคนสิ่งต่าง ๆ ไม่ลดลงอีกต่อไป

แน่นอนว่าทั้งหมดนี้สันนิษฐานว่า JPEG ถูกบันทึกไว้โดยซอฟต์แวร์เดียวกันพร้อมพารามิเตอร์เดียวกันทุกครั้ง

#! /bin/bash
# Runs successive JPEG saves on an image to evaluate JPEG losses

# convert & compare command from imagemagick
# if you use a recent version of IM, set these variables to:
# compare="magick compare"
# convert="magick convert"
convert=convert
compare=compare

dotradius=2
defaultsteps=10
defaultquality=90 # default quality for "convert"

function usage {
        echo "Usage: $0 [quality [steps]]"
        echo ""
        echo "Where:"
        echo "       - 'quality' is the quality factor of the JPEG compression "
        echo "          (1-100, 100 is best, default is $defaultquality)"
        echo "       - 'steps' is the number of successive steps to perform"
        echo "         (default is $defaultsteps)"
        echo ""
        echo "Produces:"
        echo "   - successive saves of a JPEG image to test JPEG-induced losses."
        echo "   - compare images with the original file and the 1st JPEG save."
        echo ""
        echo "Starts from a 'step000.jpg' file in the current directory."
        exit 1
}

[[ -n "$3" ]] && { usage ; exit 1 ; }
steps=${1:-$defaultsteps}
quality=${2:-$defaultquality}    
dotcolor="white" # change this if the top of the image is too clear

echo "Running with $steps steps with quality $quality"

for step in $(seq $steps)
do 
    echo "Step $step of $steps"
    src=$(printf step%03d $(( $step - 1 )) ) 
    dst=$(printf step%03d $(( $step )) )
    dif=$(printf diff%03d $(( $step )) )
    # dot coordinates
    let cxc="2 * $dotradius * $step"
    let cxr="$cxc + $dotradius"
    let cyc="$dotradius * 2"
    let cyr="$dotsradius * 2"

    $convert $src.jpg -fill white -draw "circle $cxc,$cyc,$cxr,$cyr" $dst.png
    $convert $dst.png -quality $quality $dst.jpg
    rm $dst.png
    $compare $src.jpg $dst.jpg $dif.jpg
done

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


1
ฉันอยากรู้เกี่ยวกับซอฟต์แวร์ต่าง ๆ ฉันพยายามบันทึก 7x จาก 7 ซอฟต์แวร์ที่แตกต่างกัน ความแตกต่างค่อนข้างใหญ่ดังนั้นฉันจึงพังลงมาเพื่อดูว่าแต่ละแอปพลิเคชันมีการสูญเสียเหมือนกันหรือไม่ 1 ในแอพรับผิดชอบการเปลี่ยนแปลงทั้งหมด เมื่อฉันเอาปลาเฮอริ่งแดงออกแล้วโปรแกรม 6x บันทึกจากโปรแกรม 6x ก็เหมือนกับ 6x บันทึกจาก ImageJ
PhotoScientist

มีแนวโน้มว่าซอฟต์แวร์ที่เข้ารหัสไม่ดีบางอย่าง นอกจากนี้ยังเป็นไปได้ที่การผสมอัลกอริทึมจากแอพต่างๆจะป้องกันข้อผิดพลาดในการปัดเศษจากการจ่ายเช่นกัน
xenoid

@xiota มันเป็นโปรแกรมเล็ก ๆ ที่เรียกว่า FLEMinimizer ฉันจำไม่ได้ว่าทำไมฉันถึงได้เป็นคนแรก ส่วนคนอื่น ๆ ก็คือ ImageJ, Matlab, Photoshop, FastStone Image Viewer, Ifranview และ CameraRaw แทบจะไม่มีการเปลี่ยนแปลงในขั้นตอนใด ๆ ระหว่างหกสิ่งเหล่านี้
วิทยาศาสตร์ PhotoSerator
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.