ว่างเว้นจากการเขียน Labs โปรแกรมไปนานพอควรมาคราวนี้เลยต้องนำเสนอเรื่องอยากแต่น่าจะมีประโยชน์กับนักศึกษาที่กำลังสนใจในเรื่องของ Compression Technology หรือการบีบอัดไฟล์มีเดียต่างๆ ซึ่งอัลกอริทึ่มในการบีบอัดไฟล์นั้นมีมากมายหลายตัว แต่วันนี้ว่าจะหยิบเจ้า DCT ฟังก์ชันหรือ Discrete Cosine Transform หรือการแปลงโคไซซน์แบบไม่ต่อเนื่องมาอธิบายการทำงานผ่านโปรแกรม 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 ครับ
ป้อนคำสั่งในการเรียกรูปภาพที่นำเข้าไปเก็บในตัวแปลที่ชื่อว่า IMG ครับ
เก็บไฟล์รูปภาพลงไปในตัวแปล IMG ด้วยคำสั่ง
IMG=imread('girl.png');
ใช้คำสั่ง
imshow(IMG);
ในการเรียกภาพที่เก็บไว้ปรากฏขึ้นมา
การบีบอัดภาพไม่สามารถใช้ภาพสีได้ เพราะเหตุผลของเรื่องแสง และส่วนตกกระทบ ทำให้ต้องใช้ฟังก์ชันในการเปลี่ยนภาพสีให้เป็นขาวดำก่อนเพื่อให้เหลือแค่ แสงสำหรับนำมาพิจารณา ตามกฏที่จะประมวลผลได้ตามหลัก Image Processing ด้วยคำสั่ง rgb2gray เก็บในตัวแปร GIMG โดยนำตัวแปร IMG มาประมวลผล
GIMG=rgb2gray(IMG);
ภาพที่ผ่านการเปลี่ยนเป็นขาวดำก็จะปรากฏขึ้น โดยการเรียกคำสั่ง
imshow(GIMG);
ขึ้นมาเพื่อ แสดงข้อมูล
ใช้ฟังก์ชัน Discrete Cosine Transform หรือ DCT ซึ่งใน Matlab จะต้องเป้นคำสั่ง dct2(); ผ่านตัวแปล DisIMG
DisIMG=dct2(GIMG);
ผลลัพท์จะปรากฏ ตามภาพด้านล่าง
ทำการเรียกดูผ่าน Figure เพื่อดูว่าภาพที่ทำการ DCT แล้วได้ผลลัพท์แบบไหนโดยใช้คำสั่ง
figure, imshow(DisIMg);
ผลลัพธ์ที่ปรากฏขึ้นมาจะเป็นภาพที่ถูกแปลง ถ้ามองดี สามารถแปลงเป็น Matrix ได้ผ่านตัวเลขมากมาย แต่อย่าไปดูเลยครับเดี๋ยวจะงง มากกว่าเก่า
เพิ่มฟังก์ชัน ในการบีบอัดไฟล์ด้วยคำสั่ง ตัวอย่างเอาไว้ดูการเปลี่ยนแปลง
DisCIMG(abs(DisCIMG) < 15)=0;
ทำการแสดงผลลัพธ์รูปที่ผ่านการ Inverse ด้วยตัวแปร ENCIMG
ENCIMG=idct2(DisCIMG);
เรียกผลลัพธ์ขึ้นมาด้วยคำสั่ง
figure, imshow(ENCIMG,[0 255])
ก็จะเห็นว่า ภาพที่ถูกบีบอัดมีการสูญเสีย แต่ก็ยังสามารถแปลงกลับมาได้ใกล้เคียงซึ่งขึ้นอยู่กับ การบีบอัดว่าเราจะยอมสูญเสียมากแค่ไหน ซึ่งในตัวอย่างผมใส่ไป < 15 ครับ ถ้าเปลี่ยนเป็น 10 น่าจะเป็นค่าที่ใกล้เคียงกันมากที่สุด
ตัวอย่างก็มีแค่นี้แหละครับ เอาไว้รอบหน้าจะหามาให้ทดลองกันอีกทีครับ สอบถามได้ที่ [email protected] นะครับ
? error ka
ไม่ error นี่ครับ >_< error ตรงไหนหรือครับ
ไม่ Error นะครับ ใช้ได้ 100%.
พี่ครับผมลองทำขนาดของรูปยังเท่าเดิมอ่ะครับ —
ลองทำแล้วรูปจาก.gif เป็น.jpeg รูปออกมาเป็นสีขาว —