2 คะแนน โดย GN⁺ 2024-05-15 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • แม้ดูเผิน ๆ จะเป็น ภาพถ่ายผู้หญิง แต่เป็นการทดลองที่เมื่อใช้ DCT กับภาพแล้ว จะเผยให้เห็นแมวที่ซ่อนอยู่ในโดเมนความถี่
  • โดเมนเวลา·อวกาศและ โดเมนความถี่ เชื่อมกันด้วยการแปลงที่ย้อนกลับได้ ทำให้ภาพเดียวกันสามารถถูกตีความได้คนละแบบ
  • หากนำแพตเทิร์น “noise” ที่ได้จากการแปลงภาพแมวด้วย DCT มาผสมทับด้วยค่าความทึบต่ำ ภาพต้นฉบับจะยังคงอยู่ ขณะที่ผลลัพธ์หลังการแปลงยังเหลือรูปร่างของแมว
  • ภาพที่ผสมแล้วแม้ผ่านการ resize ก็ยังมีข้อมูลของแมวเหลืออยู่ แต่เมื่อขยายจะซ้ำเหมือน tile และเมื่อย่อจะถูกตัดออก
  • เมื่อปรับคุณภาพ JPEG ให้ต่ำลง โดยเฉพาะ องค์ประกอบความถี่สูง จะถูก quantize อย่างรุนแรง ทำให้มองเห็นได้ด้วยตาว่าการบีบอัดแบบสูญเสียข้อมูลทิ้งข้อมูลไปมากเพียงใด

การทดลอง “มิติกระจก” ที่สร้างด้วย DCT

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

กระบวนการซ่อนแมวไว้ในโดเมนความถี่

  • เริ่มจากการแปลงภาพถ่ายแมวให้เป็นรูปแบบโดเมนความถี่ด้วย Discrete Cosine Transform (DCT)
  • นำแพตเทิร์น “noise แมว” ในโดเมนความถี่ไปผสมทับบนภาพถ่ายผู้หญิงจากตัวอย่างก่อนหน้า ด้วยค่าความทึบต่ำ
    • การผสมภาพนี้มีการสูญเสียข้อมูล
    • ผลลัพธ์ที่คาดหวังคือ ภาพผู้หญิงจะถูกแยกด้วย DCT ออกมาเป็น noise ที่ค่อนข้างสม่ำเสมอ ส่วน noise แมวที่แทรกเข้าไปจะรวมตัวกลับเป็นภาพแมว
  • ในความเป็นจริง เมื่อใช้ DCT กับภาพที่ผสมแล้ว จะเห็นรูปร่างแมวปรากฏขึ้น
  • มีภาพผสมและตัวอย่าง MATLAB ให้ลองตรวจสอบได้โดยตรง
    • woman-with-cat.png
    • คำนวณ DCT ด้วย dct2(woman) และแสดงผลลัพธ์ที่ทำให้นุ่มขึ้นด้วย imgaussfilt(cat, 1)
  • แมวจะยังคงอยู่แม้หลังการ resize
    • เมื่อขยาย ภาพจะซ้ำเหมือน tile
    • เมื่อย่อ ภาพจะถูกตัดออก
  • เมื่อปรับค่าคุณภาพ JPEG ให้ต่ำลง ข้อมูลของแมวจะเสียหาย
    • ที่คุณภาพ JPEG สูง ภาพยังดูค่อนข้างดี
    • ที่คุณภาพต่ำ จตุภาคขวาล่าง ซึ่งสอดคล้องกับองค์ประกอบความถี่สูงจะถูก quantize อย่างหนัก
  • การแสดงภาพนี้ชี้ให้เห็นว่าอัลกอริทึม JPEG ทำลายข้อมูลจำนวนมากในแบบที่เราไม่ค่อยสังเกตเห็น
  • มีกรณีก่อนหน้า เช่น การใส่ข้อความที่ซ่อนอยู่ในสเปกโทรแกรมเสียง หรือการอภิปรายเรื่องการซ้อน text steganography บนค่าสัมประสิทธิ์ DCT ของ JPEG
    • จุดเน้นไม่ได้อยู่ที่ความใช้งานได้จริงหรือความใหม่หมดจดของเทคนิคนี้ แต่อยู่ที่การเชื่อมโยงกันอย่างน่าสนใจระหว่าง โดเมนความถี่ กับโดเมนเวลา
  • แถมยังมีวิดีโอการเสื่อมคุณภาพของแมวในโดเมนความถี่แบบ “standalone” ตามค่าคุณภาพ JPEG ต่าง ๆ: https://vimeo.com/940487310/8a929a5eb5

1 ความคิดเห็น

 
GN⁺ 2024-05-15
ความคิดเห็นบน Hacker News
  • ภาพถ่ายส่วนใหญ่ที่มีวัตถุซึ่งมองออกได้ จะมี พลังงานสเปกตรัม กระจุกอยู่ใกล้จุดกำเนิด หรือก็คือบริเวณมุมซ้ายบน เหมือนตัวอย่างนี้

    https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_pr...

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

    https://substackcdn.com/image/fetch/w_1456,c_limit,f_webp,q_...

    ฝั่งภาพผู้หญิงก็ใช้หลักการเดียวกันในทางกลับกัน

    • เรื่องนี้ใช้ได้กับ DCT เท่านั้น การแปลงฟูเรียร์สองมิติของภาพโดยทั่วไปมักมีข้อมูลกระจุกอยู่ใกล้กึ่งกลางภาพ
  • อยากตรวจสอบว่าผมเข้าใจกระบวนการนี้ถูกไหม: a) นำภาพผู้หญิงกับภาพแมวมา, b) แปลงแมวเป็นโดเมนความถี่ด้วย DCT, c) นำแมวในโดเมนความถี่ไปซ้อนบนภาพที่มองเห็นของผู้หญิง, d) เมื่อทำ DCT กับภาพผสม ก็จะได้แมวกลับมา
    ถ้าพูดให้แม่นกว่านั้น น่าจะได้ผลลัพธ์เป็นแมวเชิงภาพที่ผสมกับผู้หญิงในโดเมนความถี่ แต่หมายความว่าแมวเชิงภาพจะเด่นกว่า

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

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

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

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

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

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

    • ถ้าอีกฝ่ายไม่รู้ว่าต้องหาอะไร ก็คงตรวจจับได้ยาก แต่ถ้ารู้แล้วก็คงง่าย

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

  • Aphex Twin และคนอื่น ๆ เคยใช้ทริกสนุก ๆ คล้ายกัน ทำให้มีใบหน้าประหลาดปรากฏใน สเปกโทรแกรมเสียง ของแทร็กหนึ่ง: https://news.ycombinator.com/item?id=8509105

    • MetaSynth มีมาตั้งแต่ช่วงปลายยุค 90 และแปลงระหว่างตัวอย่างเสียงในโดเมนเวลา กับภาพในโดเมนความถี่ ผสานเข้ากับฟิลเตอร์ภาพแบบ Photoshop

      https://uisoftware.com/metasynth/

  • บทความยิ่งอ่านไปจนจบก็ยิ่งดีขึ้นเรื่อย ๆ

    ไม่น่าเชื่อว่าทำไมเพิ่งมานึกได้ว่าโดเมนความถี่สามารถใช้กับ การบีบอัดภาพ ได้ พอเห็นแล้วก็ชัดเจนมาก อัลกอริทึมบีบอัดภาพส่วนใหญ่ทำงานแบบนี้หรือเปล่า? คือแค่ลบส่วนที่อ่อนกว่าในโดเมนความถี่ทิ้งไปใช่ไหม?

    • ใช่ MP3, Ogg-Vorbis, JPEG ล้วนทำงานแบบนี้
      การเลือกค่าน้ำหนักว่าจะเก็บความถี่ไหนไว้น่าจะอิงจากโมเดลจิตอะคูสติก แต่พูดแบบคร่าว ๆ ก็คือทิ้งข้อมูลความถี่ลำดับสูงไปจริง ๆ

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

    • โดยทั่วไปไม่ได้ลบ ความถี่สูง ทิ้งทั้งหมด แต่เข้ารหัสด้วยจำนวนบิตที่น้อยลง

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

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

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

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

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

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

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