ผมรู้ครับว่าภาพนี้สร้างโดยการใช้เทคนิคที่รูรับแสงที่เรียกว่า “Bokeh” โดยคิดว่าน่าจะไม่ผิดนะ (The Black Eye Peas ชอบมาด้วยเทคนิคการสร้างแบบล้ำๆอยู่แล้ว ) คือเมื่อแสงที่มาแบบห่างจากจุดโฟกัสเรามากๆ มันก็จะ เบลอออกเป็นวงๆ แต่แล้วเขาก็ติดตั้งอุปกรณ์ที่เรียกว่า Aperture Blades รูปหัวใจเข้าไป เพื่อตัดแสงที่เบลอออกมาเป็นรูปหัวใจซะ
แล้วผมก็มีความคิดดีดีว่ามันคงจะดี ถ้าเราจะเอาอย่างบ้าง แต่คราวนี้ ใส่มันไปทั่วเลยเป็นไงละ ปัญหาก็คือเราไม่มี อุปกรณ์พวกนั้นนี้สิ จะทำอย่างไงดี
แน่นอนว่าผมต้องมีทางออกอยู่แล้ว (ไม่งั้นไม่มาเขียนให้เสียเวลาหรอก) แต่ก็ใช้ว่าจะง่ายดายนัก สิ่งที่ผมเริ่มลองทำเป็นอย่างแรกนั้นก็คือ ลองขีดๆเขียนๆ สร้างเ Matrix ขึ้นมาอันหนึ่งก็กะจะให้เป็น Filter Matrix โดยในใจก็นึกถึง Point Spread Function (PSF) ไปด้วยเวลาเขียน ร่างสัตส่วนต่างๆนานาแล้ว (ไม่จำเป็นต้องเข้าใจก็ได้นะ คิดว่าน้อยคนคงรู้เรื่อง) สุดท้ายก็คือจบครับ ทำไมนะหรอ ก็จะทำรูปหัวใจสวยได้มันต้องใช้ Matrix ใหญ่พอตัว แต่กว่าเราใจทำตัวเลขได้ครบก็.... เอาเวลาไปทำอย่างอื่นดีกว่า (เรียกง่ายๆว่าขี้เกียจ)
เวลาผ่านไปอีกหน่อย ผมก็มาเจอกับ OpenCV เป็นอะไรที่จะมาทำให้เรื่องนี้ง่ายขึ้นมากเลย ผมเลือกใช้ cvFilter2D แล้วก็ เหลือแต่สร้าง Matrix รูปหัวใจมากเป็น Kernel ให้ ซึ่งก็ใช้ Matrix ขนาด 13*13 เรียกว่าใหญ่พอตัว ใช่เวลาหน่อย แต่มันก็ออกมาก็ไม่น่าประทับใจเท่าไร (บอกแล้วว่าไม่จำเป็นต้องเข้าใจศัพย์เทคนิคนี้ก็ได้)
เวลาผ่านไปอีกพักหนึ่ง จนมาถึงวันก่อนเขียน Blog นี้ผมก็เริ่มเห็นความจริงว่ามันเป็นเพราะเรื่อง Point Spread Function ที่เคยคิดไว้ก่อน มันมาบังตาทำให้เรา ไม่ได้มองเรื่องอื่น ผมเจอทางที่ดีและเหมาะเข้าแล้ว ผมจะใช้ Dilate Function ว่าแล้วก็ลงมือวาด Kernel รูปหัวใจ ด้วยชุดตัวเลข แต่คราวนี้เพิ่มาขนาดเป็น 15*15
แล้วก็ร่ายมนต์ C++ Code ออกมา
#include(นี้เป็นเพียงบางส่วนเท่านั้น ของ Code เท่านั้น ไม่ต้องแปลกใจถ้ามัน Copy ไปแล้วใช้ไม่ได้)#include #include #include #include #include OPENFILENAME opendlg; char filename[MAX_PATH]={0}; char *OpenImageFromFile(void) { memset(&opendlg, 0, sizeof(opendlg)); opendlg.lStructSize = sizeof(opendlg); opendlg.lpstrFile = filename; opendlg.nMaxFile = sizeof(filename); opendlg.lpstrFilter = "Image Files *.bmp, *.jpg, *.png\0*.bmp;*.jpg;*.png\0"; GetOpenFileNameA(&opendlg); return(filename); } int main() { using namespace cv; char key=0; IplImage *pImg; IplImage *dst; int cArray[225]={ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }; IplConvKernel* element = cvCreateStructuringElementEx( 15, 15, 7, 7, CV_SHAPE_CUSTOM, cArray); cvNamedWindow("Out", CV_WINDOW_AUTOSIZE); printf("File Name : %s\n", OpenImageFromFile()); pImg = cvLoadImage(filename); cvDilate(pImg,pImg,element,1); cvSmooth(pImg,pImg,CV_GAUSSIAN); if(pImg==0) printf("Cannot open file.\n"); else cvShowImage("Out", pImg); cvWaitKey(0); cvReleaseImage(&pImg); cvDestroyWindow("Out"); return 0; }
ถ้าสังเกตจะเห็น Matrix รูปหัวใจของผม ถ้าเห็นไม่ถนัด ลอง Ctrl+f แล้วพิมพ์ "1," มองดูสิ (สวยงามมาก)
ทันใดนั้นโลกก็โดนความรักเข้าครอบครอง
ตั้งแต่ Hong Kong
ถึง Las Vegas เมืองแห่งแสงสี
ไป London เมืองผู้ดี
Mosco ที่ Yuri ชอบเอา ระเบิดไปถล่ม ตอนนี้ก็โดนความรักเข้ายึกครอง
ภูเก็ต
Berlin
หรือ Rome เมืองแห่งศิลปะ และประวัติศาสตร์
แม้นแต่กรุง Seoul ประเทศเกาหลี
และก็ที่กรุงเทพ ริมแม่น้ำเจ้าพระยา
ชอมมาเลย มีหัวใจลอยอยู่ยอด ตึก
0 ความคิดเห็น:
แสดงความคิดเห็น