2014-08-06科學 謝邀。以下有大量圖片,請珍惜流量。 這個問題實在是太大了,展開講三天也講不完,因為數學+編程能做的有意思的事情實在是太多了。你隨意找一個方向,左手捧一套高數右手捧一台電腦,一頭紮下去,相信都能找到無數可以擺弄的事情。在此結合自己做過的專案給你講講高數的套用(省略全部數學細節)。 一、圖形學 圖形學的目標是創造一個真實的三維場景供你在裏面漫遊,它是所有三維遊戲的基礎。它的原理很簡單,在一個空間裏放上三角形、箱子、機器人或雲,擺好網絡攝影機,放置光源,然後計算網絡攝影機應該看到什麽,把結果顯示在電腦螢幕上。不僅是靜態的成像,動態的物理過程也可以實作,比如霧、碰撞、重力等等。 輻射3截圖 1.1 三維漫遊 你可以用OpenGL和C++輕松實作一個三維漫遊程式(流暢性優先),然後不斷往裏面添加各種模型(球體、三角面片幾何體、飛機)和內容(遮擋、抗鋸齒、透明、玻璃、爆炸),最終把你的漫遊程式變成一個精美的即時遊戲。 三維海戰(圖片來自百度圖片) 1.2 光線追蹤器 可以著重研究光線是如何照射和成像的(精美性優先),實作各種相機(雙目、魚眼、弱投影),材質(金屬、玻璃),光源類別(點光源、方向光源、區域光源)以及光照模型(BRDF、路徑追蹤),最終你想畫啥都能畫得惟妙惟肖。光線追蹤器的渲染速度很慢,程式要追蹤海量光線的反射和折射分量,比如下方的鉆石圖案需要執行5分鐘才能畫完。雖然不能即時移動和旋轉相機,但是渲染的結果極其逼真。 用C++實作的玻璃材質 用光線追蹤器pov-ray畫的鉆石 1.3 基於GPU的加速渲染 當然,你也可以兼顧渲染質素和動畫幀速,這個時候就需要使用更強大的計算資源,可以平行計算的GPU是不二的選擇。看看CUDA的程式碼,你可以做一個體渲染模組來即時觀察CT影像,賣給醫學影像處理公司(也許)能賺大錢。 Volume rendering(圖片來自網絡) 二、影像處理 很多影像套用都需要對影像進行必要地預處理,如去噪、融合、分割、去霧、去模糊、影片去抖動等等,這個領域非常廣泛,有大量模型和理論支撐。各位常用的Photoshop和美圖秀秀裏面成百上千的濾鏡,可以說每一個背後都有一個數學模型。下面舉一個例子。 2.1 分割 有一種簡單的分割演算法叫Superpixel,它可以把一幅影像分割成好多個小塊,保證每一個小塊中顏色都差不多。當然,還有其他許多分割演算法,Superpixel的好處是簡單,並且很容易推廣到三維空間。 Superpixel分割(圖片來自 這裏 ) 2.2 醫學影像處理 經過分割後,影像被過度分割成了很多小塊,這時就可以用模式辨識的演算法把屬於同一類的小塊們再合在一起。利用分割+分類的演算法,可以把三維CT影像中的骨頭全自動剔除。 CT影像去骨的結果 三、電腦視覺 電腦視覺的目標是 理解 攝影機拍攝的影像,它的研究範圍極其廣泛,比如人臉辨識、文字辨識、目標追蹤等等。在此介紹這一領域幾個重要的方向。 大家都知道影像是二維的,而真實世界是三維的,上面介紹的圖形學的原理是預先建一個三維場景然後研究網絡攝影機看到的影像是什麽樣子,電腦視覺的野心則大得多:給你幾幅二維影像,還原三維場景是什麽。 3.1 一幅影像與測量 拿到一幅影像,可以獲得平行關系,測量影像中不同物體的長度比值,在知乎也有不少朋友關心這個問題,感興趣可以戳 如何根據一張 A 樓照 B 樓的照片判斷出這張照片是 A 樓的幾層? 以及 如何測量一副圖片中物體的實際尺寸? 單目測量(圖片來自文獻 Single view metrology ) 3.2 兩幅影像與雙目視覺 拿到兩幅在不同位置拍攝的同一場景的影像,就可以恢復出場景,在知乎也有相關討論: 使用兩張角度不同的靜態影像合成連貫的動畫,難度有多大? 3.3 多幅影像與三維重建 電腦視覺在這二十年最激動人心的成果之一就是完成了從多幅影像序列重建三維場景的研究,從數學上和編程實作上解決了這一從二維重建三維的過程。試想你拿著攝影機在街上繞一圈,像CS地圖那樣的三維遊戲場景就即時重建出來是多麽激動人心啊。 三維重建更具體的定義是:透過同一場景的多幅影像,恢復出每一幅影像拍攝時相機的位置和姿態,以及每一幅影像上的每一個點在三維空間中的位置。 鄰居家的一系列照片之一 恢復出的相機位姿和稀疏特征點位置 三維稠密重建(圖片來自文獻 Accurate, Dense, and Robust Multiview Stereopsis ) 四、模式辨識 模式辨識研究輸入和輸出的關系,比如給你一系列病人的體征和誰有病誰沒病,模式辨識需要找一個模型建立體征和是否有病之間的函數關系。在影像處理、電腦視覺、醫療、生物、社會學中具有非常廣泛的套用。在The Elements of Statistical Learning的第一章裏提出了四個典型問題: 垃圾郵件和正常郵件的區分 前列腺癌癥確診 數碼手寫字元辨識 DNA序列和性狀的關系 模式辨識把這些具體問題背後共同的模式抽象出來,集中精力研究什麽樣的特征判別能力更強以及什麽樣的模型正確分類效率高。 五、綜合套用 當你掌握的知識和技能足夠多了,就可以做一些需要很多環節的大專案,隨便舉幾個例子: 在你家門口擺一台攝影機,自動辨識和記錄身高在1米7到1米8之間、身材姣好、長發、愛笑的女生的一舉一動。一旦記錄到一個符合要求的女生,將她加入數據庫,以後單獨更新,不同女生之間不能搞混。 買一個機器人(帶軲轆能自由移動並且安有網絡攝影機的電腦),讓它自己漫遊探測環境,建立三維地圖,搞清楚自己在哪,這也是電腦視覺中的一個已經理論上完美解決的重要問題:即時定位與地圖構建 (Simultaneous localization and mapping, SLAM)。 做一架飛機,它的功能是無論誰在追它都盡量甩掉;做一枚導彈,它的功能是盡量追上飛機,或者在附近爆炸;再做一個酷炫的供軍區司令觀賞的三維場景顯示環境,把一些飛機和導彈放進去追著打去吧。 六、如何入手 6.1 看優秀教材 首先,學好高等數學、概率統計和線性代數(矩陣論)足矣,其他數學知識可以在具體學習模型的過程中掌握。 然後,看一些優秀的外文教材譯文版,比如: 圖形學:OpenGL超級寶典(第5版)、互動式電腦圖形學:基於OpenGL著色器的自頂向下方法(第6版) 光線追蹤器:光跟蹤演算法技術(Ray Tracing from the Ground Up) 影像處理:數碼影像處理(第3版, 干沙里斯著),影像處理、分析與機器視覺(第3版) 電腦視覺:電腦視覺中的多檢視幾何(Multiple View Geometry in Computer Vision),電腦視覺:演算法與套用(Computer Vision: Algorithms and Applications) 模式辨識與機器視覺:模式分類(第二版),模式辨識(第四版),The Elements of Statistical Learning, Pattern Recognition and Machine Learning 6.2 看文獻 6.3 看程式碼 OpenGL、OpenCV、CUDA都有相應的文件和程式碼例項,也可以在網上找附有程式碼的教材,研究程式碼,模仿先人的程式碼。首先練習基本的函數,然後依照興趣實作幾個非常簡單的套用。自己找一個問題,實作一個最簡單的解決方案,然後不斷精進程式碼、嘗試新的模型,最後就精通了這個領域。
謝邀。以下有大量圖片,請珍惜流量。 這個問題實在是太大了,展開講三天也講不完,因為數學+編程能做的有意思的事情實在是太多了。你隨意找一個方向,左手捧一套高數右手捧一台電腦,一頭紮下去,相信都能找到無數可以擺弄的事情。在此結合自己做過的專案給你講講高數的套用(省略全部數學細節)。 一、圖形學 圖形學的目標是創造一個真實的三維場景供你在裏面漫遊,它是所有三維遊戲的基礎。它的原理很簡單,在一個空間裏放上三角形、箱子、機器人或雲,擺好網絡攝影機,放置光源,然後計算網絡攝影機應該看到什麽,把結果顯示在電腦螢幕上。不僅是靜態的成像,動態的物理過程也可以實作,比如霧、碰撞、重力等等。 輻射3截圖 1.1 三維漫遊 你可以用OpenGL和C++輕松實作一個三維漫遊程式(流暢性優先),然後不斷往裏面添加各種模型(球體、三角面片幾何體、飛機)和內容(遮擋、抗鋸齒、透明、玻璃、爆炸),最終把你的漫遊程式變成一個精美的即時遊戲。 三維海戰(圖片來自百度圖片) 1.2 光線追蹤器 可以著重研究光線是如何照射和成像的(精美性優先),實作各種相機(雙目、魚眼、弱投影),材質(金屬、玻璃),光源類別(點光源、方向光源、區域光源)以及光照模型(BRDF、路徑追蹤),最終你想畫啥都能畫得惟妙惟肖。光線追蹤器的渲染速度很慢,程式要追蹤海量光線的反射和折射分量,比如下方的鉆石圖案需要執行5分鐘才能畫完。雖然不能即時移動和旋轉相機,但是渲染的結果極其逼真。 用C++實作的玻璃材質 用光線追蹤器pov-ray畫的鉆石 1.3 基於GPU的加速渲染 當然,你也可以兼顧渲染質素和動畫幀速,這個時候就需要使用更強大的計算資源,可以平行計算的GPU是不二的選擇。看看CUDA的程式碼,你可以做一個體渲染模組來即時觀察CT影像,賣給醫學影像處理公司(也許)能賺大錢。 Volume rendering(圖片來自網絡) 二、影像處理 很多影像套用都需要對影像進行必要地預處理,如去噪、融合、分割、去霧、去模糊、影片去抖動等等,這個領域非常廣泛,有大量模型和理論支撐。各位常用的Photoshop和美圖秀秀裏面成百上千的濾鏡,可以說每一個背後都有一個數學模型。下面舉一個例子。 2.1 分割 有一種簡單的分割演算法叫Superpixel,它可以把一幅影像分割成好多個小塊,保證每一個小塊中顏色都差不多。當然,還有其他許多分割演算法,Superpixel的好處是簡單,並且很容易推廣到三維空間。 Superpixel分割(圖片來自 這裏 ) 2.2 醫學影像處理 經過分割後,影像被過度分割成了很多小塊,這時就可以用模式辨識的演算法把屬於同一類的小塊們再合在一起。利用分割+分類的演算法,可以把三維CT影像中的骨頭全自動剔除。 CT影像去骨的結果 三、電腦視覺 電腦視覺的目標是 理解 攝影機拍攝的影像,它的研究範圍極其廣泛,比如人臉辨識、文字辨識、目標追蹤等等。在此介紹這一領域幾個重要的方向。 大家都知道影像是二維的,而真實世界是三維的,上面介紹的圖形學的原理是預先建一個三維場景然後研究網絡攝影機看到的影像是什麽樣子,電腦視覺的野心則大得多:給你幾幅二維影像,還原三維場景是什麽。 3.1 一幅影像與測量 拿到一幅影像,可以獲得平行關系,測量影像中不同物體的長度比值,在知乎也有不少朋友關心這個問題,感興趣可以戳 如何根據一張 A 樓照 B 樓的照片判斷出這張照片是 A 樓的幾層? 以及 如何測量一副圖片中物體的實際尺寸? 單目測量(圖片來自文獻 Single view metrology ) 3.2 兩幅影像與雙目視覺 拿到兩幅在不同位置拍攝的同一場景的影像,就可以恢復出場景,在知乎也有相關討論: 使用兩張角度不同的靜態影像合成連貫的動畫,難度有多大? 3.3 多幅影像與三維重建 電腦視覺在這二十年最激動人心的成果之一就是完成了從多幅影像序列重建三維場景的研究,從數學上和編程實作上解決了這一從二維重建三維的過程。試想你拿著攝影機在街上繞一圈,像CS地圖那樣的三維遊戲場景就即時重建出來是多麽激動人心啊。 三維重建更具體的定義是:透過同一場景的多幅影像,恢復出每一幅影像拍攝時相機的位置和姿態,以及每一幅影像上的每一個點在三維空間中的位置。 鄰居家的一系列照片之一 恢復出的相機位姿和稀疏特征點位置 三維稠密重建(圖片來自文獻 Accurate, Dense, and Robust Multiview Stereopsis ) 四、模式辨識 模式辨識研究輸入和輸出的關系,比如給你一系列病人的體征和誰有病誰沒病,模式辨識需要找一個模型建立體征和是否有病之間的函數關系。在影像處理、電腦視覺、醫療、生物、社會學中具有非常廣泛的套用。在The Elements of Statistical Learning的第一章裏提出了四個典型問題: 垃圾郵件和正常郵件的區分 前列腺癌癥確診 數碼手寫字元辨識 DNA序列和性狀的關系 模式辨識把這些具體問題背後共同的模式抽象出來,集中精力研究什麽樣的特征判別能力更強以及什麽樣的模型正確分類效率高。 五、綜合套用 當你掌握的知識和技能足夠多了,就可以做一些需要很多環節的大專案,隨便舉幾個例子: 在你家門口擺一台攝影機,自動辨識和記錄身高在1米7到1米8之間、身材姣好、長發、愛笑的女生的一舉一動。一旦記錄到一個符合要求的女生,將她加入數據庫,以後單獨更新,不同女生之間不能搞混。 買一個機器人(帶軲轆能自由移動並且安有網絡攝影機的電腦),讓它自己漫遊探測環境,建立三維地圖,搞清楚自己在哪,這也是電腦視覺中的一個已經理論上完美解決的重要問題:即時定位與地圖構建 (Simultaneous localization and mapping, SLAM)。 做一架飛機,它的功能是無論誰在追它都盡量甩掉;做一枚導彈,它的功能是盡量追上飛機,或者在附近爆炸;再做一個酷炫的供軍區司令觀賞的三維場景顯示環境,把一些飛機和導彈放進去追著打去吧。 六、如何入手 6.1 看優秀教材 首先,學好高等數學、概率統計和線性代數(矩陣論)足矣,其他數學知識可以在具體學習模型的過程中掌握。 然後,看一些優秀的外文教材譯文版,比如: 圖形學:OpenGL超級寶典(第5版)、互動式電腦圖形學:基於OpenGL著色器的自頂向下方法(第6版) 光線追蹤器:光跟蹤演算法技術(Ray Tracing from the Ground Up) 影像處理:數碼影像處理(第3版, 干沙里斯著),影像處理、分析與機器視覺(第3版) 電腦視覺:電腦視覺中的多檢視幾何(Multiple View Geometry in Computer Vision),電腦視覺:演算法與套用(Computer Vision: Algorithms and Applications) 模式辨識與機器視覺:模式分類(第二版),模式辨識(第四版),The Elements of Statistical Learning, Pattern Recognition and Machine Learning 6.2 看文獻 6.3 看程式碼 OpenGL、OpenCV、CUDA都有相應的文件和程式碼例項,也可以在網上找附有程式碼的教材,研究程式碼,模仿先人的程式碼。首先練習基本的函數,然後依照興趣實作幾個非常簡單的套用。自己找一個問題,實作一個最簡單的解決方案,然後不斷精進程式碼、嘗試新的模型,最後就精通了這個領域。