图像处理职位面试题汇总(3)
圖像處理基礎部分
1. 敘述GABOR濾波器原理?
2. Graph-cut的基本原理和應用?
3. 常用的分類器有哪些,并簡述其原理?
4. 簡述SVM,GMM, SIFT/SURF和LDA/PCA的基本原理?
5. 簡述監督學習和非監督學習的區別并舉例說明?
6. 常用的顏色空間有哪些?各有什么特征?
7. Random Forest的隨機性表現在哪里?
8. 常用的圖像分割算法有哪些,各有什么優缺點?
9. 數學形態中有哪些常用的算法,各算法的功能?
10. 常用紋理特征有哪些?
11. 常用聚類方法有哪些,并簡述其原理?
12. 小波分析中常用的小波有哪些?經過一層小波分解后相關特性?
13. 椒鹽噪聲用什么濾波處理比較有效?
14. 圖像的像素數與分辨率有什么區別?
15.簡述你熟悉的聚類算法并說明其優缺點。
16. 請說出使用過的分類器和實現原理。
C/C++部分
1.? Windows中的消息是什么意思?簡述一下windows中的消息機制?
解:消息就是在事件驅動模式下,事件發布函數和具體功能執行函數(或者代碼段)之間的調用協議,調用協議的執行表現為窗口事件發布函數跟具體功能執行函數(或者代碼段)之間的選擇關系。在Windows系統下(下面所述均為Windows系統),對計算機外設的操作,例如當用戶敲擊鍵盤鍵、點擊鼠標、熱插拔USB盤等,系統都認為外設發生了事件,于是系統調用專職函數就把這些事件進行收集,形成現場信息,賦值給一個叫做“消息結構體”的對象,那么這個被賦予特定意義的消息結構體對象就可以稱之為“消息”;然后,專職函數再把這個“消息”投遞到(Post)到系統中一個專職消息管理的機構中去,這個過程就完成了消息形成和投遞。可以這樣想象這個所謂的“消息管理機構”的主要運作:
- 系統每時每刻都有可能發生事件,所發事件都是針對某個或者某些具體應用程序的,所以計算機需要先對這些由事件形成的消息進行集中收集,并完成存操作(即消息投遞),一般來說新來的消息都存放在靠后位置,也就是嚴格按照先來后到的時間順序進行存操作的;
- 再由系統專職函數對這些消息進行讀取,完成取操作。取操作跟存操作剛好相反,是從頭開始的,就是先取存放時間最早的那個消息。然后,這些專職函數根據所取的消息的參數的含義,把所取的消息再投遞到指定的應用程序的“消息管理機構”中去。
2.Windows中的進程與線程理解,它們之間有什么關系?
解:Windows中的進程簡單地說就是一個內存中的可執行程序,?提供程序運行的各種資源.?進程擁有虛擬的地址空間,?可執行代碼,?數據,?對象句柄集,?環境變量,?基礎優先級,?以及最大最小工作集. Windows中的線程是系統處理機調度的基本單位.?線程可以執行進程中的任意代碼,?包括正在被其他線程執行的代碼.?進程中的所有線程共享進程的虛擬地址空間和系統資源.?每個線程擁有自己的例外處理過程,?一個調度優先級以及線程上下文數據結構.?線程上下文數據結構包含寄存器值,?核心堆棧,?用戶堆棧和線程環境塊.
進程的虛擬地址空間,首先可以把"虛擬"這個詞拿掉,?對于簡化進程模型有很大幫助(當對進程/線程和虛擬內存部分都充分理解后,?那時結合起來再考量會有更深程度的掌握). 地址空間就是系統給予進程的,?進程內任何可執行代碼都可以感知的內存區域.(注意,?這里用了"感知"一詞而不是訪問,?其中的原因可以在后面講解中找到) 問題:?地址空間有多大??基地址和最大地址是什么?系統尋址能力決定了地址空間的大小.?主流的Windows系統是32位系統,?尋址能力是32位(形象的說就是指針是32位的),?所以地址空間的大小是4GB.?地址空間的基地址為0x00000000,?最大地址是0xFFFFFFFF.?4GB的地址空間被劃分為2個大的內存區域,?用戶區和系統區.
進程和線程的關系?--?進程是容器:每個windows進程開始于它的被默認創建的第一個線程,?通常稱其為主線程.?這種機制暗示了一個事實:?進程含有至少一個線程.?主線程和其它的線程沒有任何區別,?每個線程都可以創建新的線程.?進程中所有線程都結束時進程會自動被結束,?而主動結束進程時,?如果還有線程沒完成,?則系統自動結束這些線程.在windows中,?進程不再是處理機資源分配的最小單位,?那么它還是一個動態的實體嗎??是的,?從多進程并發的角度來看,?進程仍然是一個動態的實體,?但它的動態是它的線程的動態特征的抽象.?舉個例子,?一個進程含有3個線程,?那么當3個線程都阻塞時,?進程表現為阻塞.?但只要有一個線程是就緒態,?哪怕其它2個線程是阻塞態,?進程仍然表現為就緒. 從線程的角度看,?進程表現的更像一個容器,?它代表線程接受分配到的資源(除處理機資源),?為線程提供主體(執行代碼+數據),?自己卻沒有運行的概念.?此時,?進程是靜態的實體.
3. 64位與32位操作系統有什么區別?
解:術語“32 位”和“64 位”是指計算機的處理器(也稱為“CPU”)處理信息的方式。64 位版本的Windows 可處理大量的隨機存取內存 (RAM),其效率遠遠高于 32 位的系統。64bit計算主要有兩大優點:可以進行更大范圍的整數運算;可以支持更大的內存。不能因為數字上的變化,而簡單的認為64bit處理器的性能是 32bit處理器性能的兩倍。實際上在32bit應用下,32bit處理器的性能甚至會更強,即使是64bit處理器,目前情況下也是在32bit應用下性能更強。所以要認清64bit處理器的優勢,但不可迷信64bit。
內存這是64位系統最顯著的優點,它可以使用超過4GB的內存 。大多數新的臺式機和筆記本電腦至少擁有4GB的內存。問題是,像Vista和Win 7的32位版本只能夠用大約3GB的內存 。相比之下,64位的Windows 不僅可以利用高達192GB的內存,還能夠使用的內存映射取代BIOS的功能,從而使操作系統真正使用完整的4GB的。因此,如果您安裝Win7 x64,對于有的4GB內存的機器你不會浪費1GB內存。
4. C++中的this理解?
解: 我們 要理解class的意思。class應該理解為一種類型,象int,char一樣,是用戶自定義的類型。(雖然比int char這樣build-in類型復雜的多,但首先要理解它們一樣是類型)。用這個類型可以來聲明一個變量,比如int x, myclass my等等。這樣就像變量x具有int類型一樣,變量my具有myclass類型。理解了這個,就好解釋this了,my里的this 就是指向my的指針。如果還有一個變量myclass mz,mz的this就是指向mz的指針。 這樣就很容易理解this 的類型應該是myclass *,而對其的解引用*this就應該是一個myclass類型的變量。通常在class定義時要用到類型變量自身時,因為這時候還不知道變量名(為了通用也不可能固定實際的變量名),就用this這樣的指針來使用變量自身。- this指針的用處:一個對象的this指針并不是對象本身的一部分,不會影響sizeof(對象)的結果。this作用域是在類內部,當在類的非靜態成員函數中訪問類的非靜態成員的時候,編譯器會自動將對象本身的地址作為一個隱含參數傳遞給函數。也就是說,即使你沒有寫上this指針,編譯器在編譯的時候也是加上this的,它作為非靜態成員函數的隱含形參,對各成員的訪問均通過this進行。例如,調用date.SetMonth(9) <===> SetMonth(&date, 9),this幫助完成了這一轉換 .
- this指針的使用一種情況就是,在類的非靜態成員函數中返回類對象本身的時候,直接使用 return *this;另外一種情況是當參數與成員變量名相同時,如this->n = n (不能寫成n = n)。
5. C++中虛函數有什么作用?
解:我們都知道,c++為了與c語言能夠兼容,c++做出了很大的犧牲,包括保留了struct關鍵字,還有編譯期間添加了好多隱藏的代碼。但是虛函數卻不能與c語言實現兼容。而且有了虛函數,類的數據對象布局都發生了巨大的變化。這些暫時不說,還是回到上面的問題吧!我們都知道函數可以分為三種,一種是類的成員函數(member function),又可分為非靜態成員函數(non-static member function),以及靜態成員函數(static member function),而還有一種非類的成員函數(non-member function)。在類的非靜態成員函數中又可以分為普通的函數以及虛函數。根據這種函數的分類,就知道了函數絕對是不能同時為虛函數以及靜態成員函數的。對虛函數還可以繼續細分,一是純虛函數,一種就是普通的虛函數。純虛函數必須在普通的虛函數基礎上加上“=0”,同時普通的虛函數必須要有函數的實現。而純虛函數默認情況是只有定義,而無需實現的,即只是定義一個接口(當然也可以實現,這時實現認為是默認的一種狀態顯示),同時包含了純虛函數的類表明該類時一個抽象類,不能定義該類的對象,也就是說該類被定義成基類,是要被繼承的,通過繼承類來完成基類對象的生成。最后,強調一下,虛函數必須有一個關鍵字來修飾:virtual ,同時不能有static修飾。
虛函數的作用?我們知道面向對象語言的意義是讓程序用一種符合人的思維來運行,而虛函數在c++面向對象語言的實現中起著舉足輕重的作用。簡而言之,虛函數的作用就是實現“動態聯編”,也就是在程序的運行階段動態地選擇合適的成員函數。具體的實現方式是:在定義了虛函數后,可以在基類的派生類中對虛函數重新定義,在派生類中重新定義的函數應與虛函數具有相同的形參個數和形參類型。以實現統一的接口,不同定義過程。如果在派生類中沒有對虛函數重新定義,則它繼承其基類的虛函數。編譯器在編譯過程中發現類的函數名前的關鍵字virtual后,會自動將其作為動態聯編處理,即在程序運行時動態地選擇合適的成員函數,具體的實現機制下篇再講。
這里提前說一下,類的靜態成員函數與非類的成員函數對于類對象來說,訪問函數的效率相當,都是在編譯器確定,而虛函數需要在運行期確定,所以效率較低(符合上帝是公平的規律吧)。虛函數的使用?正確的使用虛函數是一個比較簡單的問題。要實現動態聯編,即只能用一個基類的指針或者引用來指向派生類對象,為什么必須要這樣,見后面的虛函數實現機制。而把派生類對象賦值或者拷貝給基類的對象,只能實現派生類隱式轉換成基類,即在編譯器完成了派生類的截斷,不能達到動態聯編得作用。
6.Static理解?
解:static關鍵字是C, C++中都存在的關鍵字。static從字面理解,是“靜態的“的?意思,與此相對應的,應該是“動態的“。static的作用主要有以下3個:
1、擴展生存期
這一點主要是針對普通局部變量和static局部變量來說的。聲明為static的局部變量的生存期不再是當前作用域,而是整個程序的生存期。在程序中,常用內存類型主要有堆、棧和靜態存儲區。要理解static局部變量就必須首先理解這三種內存類型。在C/C++中,?局部變量按照存儲形式可分為三種auto, static, register
2、限制作用域
這一點相對于普通全局變量和static全局變量來說的。對于全局變量而言,不論是普通全局?變量還是static全局變量,其存儲區都是靜態存儲區,因此在內存分配上沒有什么區別。區別在于:
3、數據唯一性
這是C++對static關鍵字的重用。主要指靜態數據成員/成員函數。表示屬于一個類而不是屬于此類的任何特定對象的變量和函數.?這是與普通成員函數的最大區別,?也是其應用所在,?比如在對某一個類的對象進行計數時,?計數生成多少個類的實例,?就可以用到靜態數據成員.在這里面, static既不是限定作用域的,?也不是擴展生存期的作用,?而是指示變量/函數在此類中的唯一性.這也是”屬于一個類而不是屬于此類的任何特定對象的變量和函數”的含義.?因為它是對整個類來說是唯一的,?因此不可能屬于某一個實例對象的. (針對靜態數據成員而言,?成員函數不管是否是static,?在內存中只有一個副本,?普通成員函數調用時,?需要傳入this指針, static成員函數調用時,?沒有this指針.?)
static數據成員的初始化:1) 初始化在類體外進行,而前面不加static,以免與一般靜態變量或對象相混淆。2)?初始化時不加該成員的訪問權限控制符private,public等。3)?初始化時使用作用域運算符來標明它所屬類,因此,靜態數據成員是類的成員,而不是對象的成員。4)?靜態數據成員是靜態存儲的,它是靜態生存期,必須對它進行初始化。
Static成員函數:靜態成員函數和靜態數據成員一樣,它們都屬于類的靜態成員,它們都不是對象成員。因此,對靜態成員的引用不需要用對象名。靜態成員函數僅能訪問靜態的數據成員,不能訪問非靜態的數據成員,也不能訪問非靜態的成員函數,這是由于靜態的成員函數沒有this指針。
7. 求一個正整數N的開方,要求不能用庫函數sqrt(),結果的精度在0.001.
解:牛頓迭代
#include<iostream> using namespace std; int main() { int N; cout<<"輸入N的值:"; cin>>N double x1 = 1; double x2 = x1/2.0+N/2.0/x1; while( fabs(x2-x1)>0.001) { x1 = x2; x2 = x1/2.0+N/2.0/x1; } cout<<x1<<endl; return 0; }邏輯和概率部分
1. a和b兩個人每天都會在7點-8點之間到同一個車站乘坐公交車,a坐101路公交車,每5分鐘一班【7:00,7:05....】,b坐102路公交車,每10分鐘一班【7:03,7:13...】,問a和b碰面的概率是多少?
解:
ab┗━━━━┳━━┻━━━━━━━┻━━━━┳━━┻━━━━━━━┻??┅??┅??┅??┻━━━━┳━━┻━━━━━━━┻━━━━┳━━┻━━━━━━━┛?
上圖表示7點-8點之間的60分鐘區間內, a、b兩人可用的乘車時間點(a上b下)
可以看出每10分鐘有一個最小循環, 那么可以先就前10分鐘的區間進行分析.
以b為主體, b的時間可以被各時間點切成三份(30?3,23?5,55?10), 那么在這個區間里, 兩人相遇的概率是
360×30?360+260×130?1360+560×85?1360=753600
需要注意的是后兩項"使用了"下一個循環區間的時間, 因此需要單獨考慮最后10分鐘的相遇概率
360×350?5360+260×1050?6060+560×555?6060=543600
匯總的相遇概率為
753600×5+543600=1431200
2.假設某日是否有雨只和前一日是否有雨相關:今日有雨,則明日有雨的概率是0.7;今日無雨,則明日有雨的概率是0.5。如果周一有雨,求周三也有雨的概率?
解:
轉移矩陣為
A=(0.70.50.30.5)
P(周三有雨|周一有雨)=[(1?0)A2]1,1=[(0.7?0.3)(0.70.50.30.5)]1,1=0.643. 有 A 和 B 兩路公交車,平均發車間隔分別為 5 分鐘和 10 分鐘。某乘客在站點 S 可以 任意選擇兩者之一乘坐,假定 A 和 B 到達 S 的時刻無法確定,那么該乘客的平均等待時間約為多少?
解:首先,平均等待時間即為等待時間的期望,倘若依照題意,發車間隔并不固定又如何呢?
發車間隔不固定,那么 tA,tB 的值域變為[0,+∞),隨之而來的是另一個問題,概率密度分布是什么樣的?此時值域不再有限,無法使用均等分布。注意這里問題的關鍵字是等待,說起等待,首先就應該想到泊松分布(Poisson Distribution)和泊松過程(Poisson process)。這里,等車的過程就可以看作兩個相互獨立的泊松過程。泊松過程的平穩獨立增量假設十分重要,這意味著從任意時刻開始分布都是一樣的,也就是說并不存在等待越久公車更可能即將到來這件事情。由此,泊松過程中,兩次事件中的間隔時間服從指數分布,即
t~λe?λt,t?0
平均間隔時間即期望間隔時間E[t]=∫+∞0tλe?λt?dt=1λ????(1)
由這個結論加上已知可得tA~15?e?15tA,tA?0;?tB~110?e?110tB,tB?0
那么仍然根據獨立假設,可得p(tA,tB)=15e?15tA110e?110tB,?tA?0,?tB?0
此時積分有
??????????E[t]=∫+∞0∫+∞tBtB15e?15tA110e?110tB?dtA?dtB+∫+∞0∫+∞tAtA15e?15tA110e?110tB?dtB?dtA
???????=∫+∞0tB110e?110tBe?15tB?dtB+∫+∞0tA15e?15tAe?110tA?dtA
???????=∫+∞0x(15+110)?e?(15+110)x?dx
? ? ? ?? =115+110 ??
???????=313===================================================================== 轉載請注明出處:http://blog.csdn.net/songzitea/article/details/13629389 =====================================================================
總結
以上是生活随笔為你收集整理的图像处理职位面试题汇总(3)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android----在线点9图片制作
- 下一篇: 使用fiddler 分析视频网站