Advance

การบีบอัดไฟล์ภาพด้วย Discrete Cosine Transform ด้วย Matlab

ว่างเว้นจากการเขียน Labs โปรแกรมไปนานพอควรมาคราวนี้เลยต้องนำเสนอเรื่องอยากแต่น่าจะมีประโยชน์กับนักศึกษาที่กำลังสนใจในเรื่องของ Compression Technology หรือการบีบอัดไฟล์มีเดียต่างๆ ซึ่งอัลกอริทึ่มในการบีบอัดไฟล์นั้นมีมากมายหลายตัว แต่วันนี้ว่าจะหยิบเจ้า DCT ฟังก์ชันหรือ Discrete Cosine Transform หรือการแปลงโคไซซน์แบบไม่ต่อเนื่องมาอธิบายการทำงานผ่านโปรแกรม Matlab กับตัวอย่างที่จะยกมาให้ดู

วันนี้เราจะมาเรียน Matlab กัน

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

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

การบีบอัดรูปภาพ

หลักการแปลงโคไซน์แบบไม่ต่อเนื่อง Discrete Cosine Transform

เกริ่นมาซะนานเลยก็เอามาเข้าเรื่องเลยแล้วกัน ตัวอย่างในการนำเสนอในบทความนี้จะนำเสนอฟังก์ชัน DCT หรือ Discrete Cosine Transform ที่เป็นสมการในการบีบอัดที่ถูกเรียกใช้มากที่สุด เช่นเวลาเราจะทำการ Resized รูปภาพผ่าน Photoshop หรือ โปรแกรมต่างๆ อย่าง PHP, ASP.NET เรารู้แค่การเรียกฟังก์ชันแต่เรารู้หรือไม่ว่าหลักการของมันนั้นซับซ้อนเหลือขนาด

สมการ Discrete Cosine Transform เป็นสมการทางด้านคณิตศาสตร์ที่พัฒนาขึ้นมาโดย Ahmed, Natarjan และ Rao เมื่อปี 1974 ซึ่งได้มีการนำไปประยุกต์ใช้กับกับงานบีบอัดภาพกราฟิกเพื่อลดขนาดภาพครั้งแรกโดย Chen และ Pratt ในปี 1984

โดยมีเงื่อนไขตามนี้คือ

และ

เอาเป็นว่าถ้าต้องการรู้เรื่องทฤษฏีมากกว่านี้ผมจะแชร์ หลักของแนวคิดผ่าน Slideshare ให้ดูอีกที หรือไปศึกษาเพิ่มเติมที่

http://cs.cf.ac.uk/Dave/Multimedia/node231.html

ก่อนก็ได้ครับ

เริ่มต้นทำ Labs ของ Discrete Cosine Transform ด้วย Matlab

สำหรับซอฟท์แวร์ของ Matlab ที่ผมใช้นั้นเป็นเวอร์ชัน R2009b ที่ใช้บนเครื่อง MAC OSX ซึ่งจะมีเรื่องของลิขสิทธิ์อยู่เล็กน้อยแต่ถ้าใครกลัวเรื่องลิขสิทธิ์แนะนำให้ไปใช้ตัวที่เป็น Freeware และ Open Source แทนได้คือ Scilab และ Matview ครับ

ก่อนอื่นให้ทำการเตรียมภาพที่จะนำมาประมวลผล และ Set Up ตัว Work Space ให้เรียบร้อยก่อนนะครับซึ่งภาพที่จะนำมาประมวลผลนั้นผมตั้งชื่อว่า girl.png ครับ

Folder ที่มีไฟล์ girl.png อยู่ข้างในแล้ว

ป้อนคำสั่งในการเรียกรูปภาพที่นำเข้าไปเก็บในตัวแปลที่ชื่อว่า IMG ครับ

เก็บไฟล์รูปภาพลงไปในตัวแปล IMG ด้วยคำสั่ง

IMG=imread('girl.png');

คำสั่งสร้างตัวแปล IMG มาเก็บไฟล์รูปภาพ

ใช้คำสั่ง

imshow(IMG); 

ในการเรียกภาพที่เก็บไว้ปรากฏขึ้นมา

ตัวอย่างภาพที่เรียกให้แสดงออกมา

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

GIMG=rgb2gray(IMG);

คำสั่งในการเรียกให้แสดง

ภาพที่ผ่านการเปลี่ยนเป็นขาวดำก็จะปรากฏขึ้น โดยการเรียกคำสั่ง

imshow(GIMG); 

ขึ้นมาเพื่อ แสดงข้อมูล

เปลี่ยนภาพ IMG เป็นขาวดำเก็บไว้ในตัวแปร GIMG

ใช้ฟังก์ชัน Discrete Cosine Transform หรือ DCT ซึ่งใน Matlab จะต้องเป้นคำสั่ง dct2(); ผ่านตัวแปล DisIMG

DisIMG=dct2(GIMG);

ผลลัพท์จะปรากฏ ตามภาพด้านล่าง

ทำการ DCT ภาพเพื่อบีบอัดเบื้องต้น

ทำการเรียกดูผ่าน Figure เพื่อดูว่าภาพที่ทำการ DCT แล้วได้ผลลัพท์แบบไหนโดยใช้คำสั่ง

figure, imshow(DisIMg);

ฟังก์ชัน DCT2

ผลลัพธ์ที่ปรากฏขึ้นมาจะเป็นภาพที่ถูกแปลง ถ้ามองดี สามารถแปลงเป็น Matrix ได้ผ่านตัวเลขมากมาย แต่อย่าไปดูเลยครับเดี๋ยวจะงง มากกว่าเก่า

ผลลัพธ์ในการผ่าน Discrete Cosine Transform

เพิ่มฟังก์ชัน ในการบีบอัดไฟล์ด้วยคำสั่ง ตัวอย่างเอาไว้ดูการเปลี่ยนแปลง

DisCIMG(abs(DisCIMG) < 15)=0;

ทำการแสดงผลลัพธ์รูปที่ผ่านการ Inverse ด้วยตัวแปร ENCIMG

ENCIMG=idct2(DisCIMG);

แสดงผลลัพธ์ผ่านคำสั่งเพิ่มเติม

เรียกผลลัพธ์ขึ้นมาด้วยคำสั่ง

figure, imshow(ENCIMG,[0 255])

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

เปรียบเทียบภาพต้นฉบับ และ ภาพที่ผ่านการบีบอัดไปแล้ว

ตัวอย่างก็มีแค่นี้แหละครับ เอาไว้รอบหน้าจะหามาให้ทดลองกันอีกทีครับ สอบถามได้ที่ [email protected] นะครับ

Asst. Prof. Banyapon Poolsawas

อาจารย์ประจำสาขาวิชาการออกแบบเชิงโต้ตอบ และการพัฒนาเกม วิทยาลัยครีเอทีฟดีไซน์ & เอ็นเตอร์เทนเมนต์เทคโนโลยี มหาวิทยาลัยธุรกิจบัณฑิตย์ ผู้ก่อตั้ง บริษัท Daydev Co., Ltd, (เดย์เดฟ จำกัด)

Related Articles

5 Comments

Leave a Reply

Back to top button

Adblock Detected

เราตรวจพบว่าคุณใช้ Adblock บนบราวเซอร์ของคุณ,กรุณาปิดระบบ Adblock ก่อนเข้าอ่าน Content ของเรานะครับ, ถือว่าช่วยเหลือกัน