西安交通大學(xué)數(shù)字圖像處理第三次作業(yè)_第1頁
西安交通大學(xué)數(shù)字圖像處理第三次作業(yè)_第2頁
西安交通大學(xué)數(shù)字圖像處理第三次作業(yè)_第3頁
西安交通大學(xué)數(shù)字圖像處理第三次作業(yè)_第4頁
西安交通大學(xué)數(shù)字圖像處理第三次作業(yè)_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、數(shù)字圖像與視頻處理第 三 次 作 業(yè)姓名: / 班級: 學(xué)號: 提交日期: 2017. 3. 19 摘 要:灰度直方圖是數(shù)字圖像處理中最簡單且有用的工具,它是多種空域處理技術(shù)的基礎(chǔ)。本文以VS2013為開發(fā)環(huán)境,借助openCV視覺庫,實現(xiàn)灰度直方圖的繪制、直方圖均衡、直方圖匹配等操作,并在此基礎(chǔ)上對不同對比度圖片的處理結(jié)果進行比較,分析各操作的優(yōu)缺點。此外,針對目前直方圖閾值分割技術(shù)存在的適用性差、結(jié)果穩(wěn)定性差的缺陷,本文提出一種基于雙峰間谷地容量最大化的直方圖閾值分割算法,即首先進行采樣和內(nèi)插平滑直方圖,消除細(xì)小的凸起和凹陷,然后對各個谷地進行容量統(tǒng)計,選取容量最大谷地的谷點作為閾值。經(jīng)過

2、比較,此算法計算的閾值已十分接近人工選取的結(jié)果,分割誤差近似為零,表現(xiàn)出較好的性能。關(guān)鍵詞:openCV 直方圖 均衡化 直方圖匹配 峰谷點分割 采樣內(nèi)插恢復(fù) 261 繪制圖像的直方圖1.1 直方圖簡介圖像直方圖是反映一幅圖像像素分布的統(tǒng)計表,其橫坐標(biāo)代表了圖像像素的種類,可以是灰度的,也可以是彩色的,縱坐標(biāo)代表了每一種顏色值在圖像中的像素總數(shù)或者占所有像素個數(shù)的百分比。一個灰度級別在范圍0,L-1的數(shù)字圖像的直方圖是一個離散函數(shù),即prk=nkn或prk=nk式中,n是圖像像素的總數(shù),rk是第k個灰度級,nk是圖像中第k個灰度級的像素總數(shù),其嚴(yán)格的數(shù)學(xué)定義應(yīng)為:nk=i=1Mj=1NAijr

3、k ,Aijrk=1 ,fi,j=rk0 ,fi,jrk圖像的直方圖可以是任意維的,一般研究的是便于直觀顯示和分析的一維和二維直方圖,一維直方圖以統(tǒng)計表格的形式呈現(xiàn),二維直方圖則常以圖像的形式呈現(xiàn),某一位置像素的灰度值對應(yīng)該位置所代表的顏色的種類出現(xiàn)的次數(shù)。在數(shù)字圖像處理中,灰度直方圖是最簡單且有用的工具,它是多種空間域處理技術(shù)的基礎(chǔ),對于分析圖像的各灰度占比、灰度級偏向有重要作用,廣泛應(yīng)用于圖像數(shù)據(jù)統(tǒng)計、圖像增強、圖像的壓縮與分割等各方面1。直方圖是圖像的一個重要特征,因為直方圖用少量的數(shù)據(jù)表達圖像的灰度統(tǒng)計特征。圖像的灰度直方圖局域一下性質(zhì)1:(1)灰度直方圖只能反映圖像的灰度分布情況,而

4、不能反映圖像像素的位置,即丟失了像素的位置信息。(2)一幅圖像對應(yīng)唯一的直方圖,反之不成立。不同的圖像可對應(yīng)相同的直方圖。(3)灰度直方圖反映了書胡子圖像中每一灰度級與其出現(xiàn)頻率之間的關(guān)系,它描述該圖像的概貌。1.2 處理過程及結(jié)果openCV(Open Source Computer Vision Library)是一種廣泛使用的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS操作系統(tǒng)上,它由C+語言編寫,主要接口也是C+,但也有大量的Python,Java和 MATLAB的接口。openCV提供的視覺處理算法非常豐富,有大量的圖像處理函數(shù)可供使用,本文

5、的吐下那個處理操作即是在openCV3.1.0和VS2013環(huán)境下進行的。openCV中的直方圖統(tǒng)計函數(shù)是cv:calcHist (),形參主要包括輸入的圖像對象、通道、直方圖尺寸等,具體參數(shù)此處將不一一說明。主要實現(xiàn)步驟包括圖像讀取、定義直方圖參數(shù)、數(shù)據(jù)統(tǒng)計、以圖像形式顯示并存儲直方圖等,具體過程見附錄代碼1。在VS2013環(huán)境下,利用C+編寫程序,得到各圖像的灰度直方圖如下。為方便觀察和比較,本文將原始圖片和其直方圖以成對的方式呈現(xiàn)。圖1 各圖像及其直方圖1.3 結(jié)果討論分析上述各圖及其直方圖可以發(fā)現(xiàn),直方圖有效地揭示了圖像的灰度分部情況。以上總共四組圖像,縱向?qū)Ρ人母痹瓐D(citywal

6、l、elain、lena、woman)可知,不同圖像的直方圖一般是不同的,如果一幅圖中出現(xiàn)了明顯的大面積的同一灰度,那么其直方圖中會出現(xiàn)明顯的峰值。這個結(jié)論在同一組圖的橫向?qū)Ρ戎懈菀装l(fā)現(xiàn),一個極端的情況就是二值圖或者近似二值圖(citywall1、elain1、lena1、woman1),它們的直方圖幾乎只有黑白兩個峰,因為圖像中幾乎不存在其它灰度的像素。此外,在橫向?qū)Ρ戎羞€可以驗證一些結(jié)論,那就是暗圖像(elain3、lena4、woman2)直方圖分量集中在灰度級的低端,亮圖像(lena2)直方圖集中在灰度級的高端,低對比度圖像(citywall2、elain3、lena2)具有較窄的直

7、方圖,而高對比度圖像(citywall、elain、lena、woman)的直方圖灰度分量覆蓋很寬的范圍。2 直方圖均衡化2.1 直方圖均衡化算法直方圖均衡化是指將原圖像通過某種變換,得到一幅灰度直方圖為均勻分布的新圖像的方法,這樣增加了像素灰度值的動態(tài)范圍,從而達到增強圖像整體對比度的效果。直方圖均衡化一般用于增強對比度較低的圖像,可以突出圖像中更多的細(xì)節(jié)。直方圖均衡化算法由連續(xù)量的概率密度函數(shù)運算推導(dǎo),經(jīng)過離散化后得來,直方圖均衡化的一般過程如下: 列出原始圖像灰度級rk; 統(tǒng)計原始直方圖各灰度級像素數(shù)nk; 計算原始直方圖各灰度的概率pk=nkN ,k=0,1,2,L-1 計算累計直方圖

8、sk=j=1kpk 取整(此處+0.5取整數(shù)部分,表示取距離最近的整數(shù))Sk=intL-1sk+0.5 確定映射對應(yīng)關(guān)系rkSk; 統(tǒng)計新直方圖各灰度級像素nk',計算新直方圖。以上各步驟并不全是必須步驟,其中-為必要步驟,是附加步驟,如果目的是對一幅圖像進行均衡,那么-就足夠了,如果需要細(xì)致地觀察直方圖的均衡結(jié)果或得到處理結(jié)果的直方圖,那么也是重要的一步。2.2 直方圖均衡處理結(jié)果在openCV中,在均衡化過程中,除了直方圖顯示和圖像轉(zhuǎn)換之外,用于直方圖均衡化操作的主要函數(shù)是cv:equalizeHist(srcGray, heqResult),其中參數(shù)srcGray是源圖像的Mat

9、對象,heqResult是輸出圖像的Mat對象。結(jié)合1.1中顯示直方圖的方法,本文為方便觀察分析除在下圖給出源圖像和均衡后的圖像之外,在附錄中還成對展示直方圖均衡化前后兩圖像的直方圖。(a)四幅原始圖像的均衡化效果(b)幾幅對比度較低的圖像的均衡化效果(c)灰度級較小的圖片的均衡效果圖2 直方圖均衡化效果對比2.3 均衡結(jié)果討論從以上各圖的均衡化前后對比中可以看出,直方圖均衡化操作有其獨特的適用性。從(a)組處理結(jié)果可以看出,對于對比度適中的圖像,直方圖均衡化帶來的效果并不顯著,只是稍微增加了對比度,這從(a)組第一幅圖紅色圓圈中細(xì)節(jié)的增強,以及后面兩幅圖人物面部對比度的增加中可以直觀的體會到

10、。但該組圖像的直方圖均衡化操作也帶來一定弊端,那就是物體的顯示出現(xiàn)類似過度曝光的現(xiàn)象,造成一定程度的失真,并不能達到最好的視覺效果。(b)組圖像的特點是對比度較小,要么偏暗要么偏亮,這時直方圖均衡化帶來的效果就非常顯著。從附錄中均衡前后的直方圖中可以發(fā)現(xiàn),這些圖像較窄的灰度級被映射到整個灰度級范圍,圖像細(xì)節(jié)大大增強,顯示起來接近質(zhì)量較高的原始圖像,可見直方圖均衡化對對比度較低的圖片最為適用。(c)組圖像是灰度分級非常少的一組圖,這些圖像要么是二值圖,要么是像素灰度集中在極少數(shù)灰度級的圖像,這種情況下直方圖均衡化幾乎起不到什么效果,雖然前面兩幅圖有輕微改善(紅色圓圈中),這是因為它們并不是嚴(yán)格的

11、二值圖,所以想通過直方圖均衡化操作優(yōu)化二值圖的對比度是不可取的。3 直方圖匹配化直方圖匹配,又稱直方圖規(guī)定化,即變換原圖的直方圖為規(guī)定的某種形式的直方圖,從而使兩幅圖像具有類似的色調(diào)和反差2。直方圖匹配屬于非線性點運算,其關(guān)鍵就是灰度映像函數(shù)。3.1 直方圖匹配算法討論直方圖規(guī)定化的原理:對兩個直方圖都做均衡化,變成相同的歸一化的均勻直方圖,以此均勻直方圖為媒介,再對參考圖像做均衡化的逆運算。一般的直方圖匹配算法步驟簡化敘述為: 對原始圖像進行直方圖均衡化操作: s=T(r); 對目標(biāo)直方圖對應(yīng)的圖像進行均衡化操作:v=G(z); 令s=v,則z=G-1Tr,得到灰度映像函數(shù)。3.2 直方圖匹

12、配結(jié)果在openCV環(huán)境下,利用以上算法編寫C+程序,對各圖像進行直方圖匹配化操作,效果如下所示:(a)附加同一灰度分量導(dǎo)致的對比度低(b)銳化圖片(c)二值圖圖2 直方圖匹配化效果(按類型分組)3.3 匹配結(jié)果討論從本文涉及的直方圖均衡化的例子可以看出,均衡化操作只是使原圖像的直方圖接近目標(biāo)直方圖,并不能實現(xiàn)真正的完全匹配。對于二值圖,均衡化操作并不能使其顯示得到優(yōu)化,因為圖像在二值化過程中丟失的信息太多。而對于明顯的由于附加額外灰度分量導(dǎo)致的對比度較低的圖片,指定恰當(dāng)?shù)哪繕?biāo)直方圖則能較好的恢復(fù)原始圖片。對于高對比度圖片,指定低對比度的目標(biāo)圖片后,直方圖匹配化一般會使其對比度下降。與直方圖均

13、衡化相比,直方圖匹配操作更加靈活。當(dāng)使用均衡化達不到目的時,比如均衡化后圖像依然整體低對比度或者某些細(xì)節(jié)因為低對比度而無法細(xì)致觀察,指定恰當(dāng)?shù)哪繕?biāo)直方并進行直方圖匹配化一般可以取得較好的效果,原始直方圖的細(xì)小改變會使圖像的外觀得到顯著改進。4 圖像的直方圖分割在計算機視覺和圖像分析的研究和應(yīng)用中,圖像分割是一種基本的和關(guān)鍵的技術(shù),其目的是把感興趣區(qū)域同其它無關(guān)區(qū)域分割開來,便于對特定區(qū)域的針對性研究。圖像分割分為二值化和多值化,二值化是為了把原始多灰度級圖像轉(zhuǎn)化為二值圖,而多值化則是把原圖像轉(zhuǎn)化為具有特定幾個灰度級的新圖像,一般二值化應(yīng)用較為廣泛。直方圖分割法,即在灰度直方圖上取谷點作為分割閾

14、值來對圖像進行二值化,是最常用的圖像分割方法,這種方法認(rèn)為灰度直方圖的分布具有雙峰,分別與圖像的背景和物體對應(yīng),并且在雙峰之間存在著谷點,當(dāng)閾值取為谷點時,認(rèn)為對圖像進行了最好的分割3。為實現(xiàn)最優(yōu)閾值的自動選取,必須對直方圖中的谷點進行效果檢測,選取恰當(dāng)?shù)闹笜?biāo)評價谷點分割效果對最終結(jié)果有很大影響。因此本文將直方圖相鄰兩個峰值及它們之間的谷點看作一個“蓄水池”,具有最優(yōu)二值分割能力的谷點應(yīng)該具備“容量”最大化的特點。4.1 一種基于“谷地容量”最大化的直方圖閾值分割算法4.1.1 直方圖的采樣內(nèi)插平滑通過對大量圖像直方圖的觀察發(fā)現(xiàn),若把一維直方圖看作離散數(shù)字信號a(n),那么其中夾雜著很多高頻噪

15、聲,表現(xiàn)為除直方圖整體表現(xiàn)出一定的輪廓外,相鄰的幾個數(shù)據(jù)是上下波動的,即在整體趨勢之外會有很多的細(xì)小凸起和凹陷,如果直接進行后續(xù)操作,那么這些噪聲將會使算法停滯在對局部特征的判斷上,而忽略了閾值分割所注重的整體特征。因此在進一步處理之前,必須先提取直方圖大致的外輪廓,也就是對直方圖序列進行平滑。最常用的平滑方法是滑動平均法,經(jīng)過實驗發(fā)現(xiàn)該方法并不能有效平滑大片出現(xiàn)的凸起好凹陷。本文選取采樣內(nèi)插法作為平滑手段,因為其簡單高效,附加計算量小,且性能足以滿足本算法需求。假設(shè)采樣間隔設(shè)為N,采用線性插值法,那么中間的缺省值可以用下式求得an+m=an+man+N-a(n)N ,n=kN,k=0,1,2

16、,其中信號下標(biāo)(灰度)從0開始,m表示當(dāng)前位置的下標(biāo)對N的余數(shù),考慮到信號長度可能不是N的整數(shù)倍,那么最后一組數(shù)據(jù)可借助最后兩個采樣值后向延伸恢復(fù)。兩個直方圖平滑的例子如下圖所示。圖 直方圖的采樣內(nèi)插平滑結(jié)果從上圖可以看出,經(jīng)過采樣和內(nèi)插恢復(fù)之后的直方圖已經(jīng)具有很有規(guī)律的外輪廓,基本消除了凸起和凹陷的干擾,小的凹陷已經(jīng)連接成較大的谷地。為減少不必要的運算量,本文采用線性內(nèi)插法恢復(fù)缺省點,在對輪廓平滑度要求較高的場合也可以采用二次或者三次內(nèi)插來得到平滑的輪廓波形。4.1.2 谷地定位及容量的計算根據(jù)前述分析可知,谷地的定位需要找到兩個相鄰的峰值及中間的谷點,每個谷地對應(yīng)兩個峰值和一個谷點,不同的

17、谷地可能有峰值重合但不可能有相同的谷點,因此本文選取谷點下標(biāo)作為谷地的唯一特征。具體操作辦法如下: 對直方圖信號a(n)進行一階差分,得到差分?jǐn)?shù)組d(n)dn=an+1-a(n) 遍歷整個信號數(shù)組,對峰谷點進行位置標(biāo)記,標(biāo)記方法為峰點:dn-1>0 dn<0谷點:dn-1<0 dn>0 根據(jù)谷點位置查找相鄰的兩個峰值點,找出每個谷地的三個關(guān)鍵參數(shù):起始峰值點ph,谷點v,終止峰值點pe 計算每個谷地的“容量”C,定義如下:C=j=phpeap-aj ,a(p)=maxaph,pe 選取“容量”最大的谷地的谷點坐標(biāo)作為二值化分割閾值。4.2 實驗結(jié)果利用C+結(jié)合openC

18、V編程實現(xiàn)以上直方圖分割算法。為描述谷地,可定義“pool”結(jié)構(gòu)體,每個步驟獨立編寫函數(shù),具體C+程序見附錄源代碼4。對woman.bmp和elain.bmp進行直方圖閾值分割。由于Matlab中數(shù)組下標(biāo)是從1開始,所以兩幅圖像對應(yīng)的閾值分別為210和90,結(jié)果如下圖所示。圖 直方圖閾值分割結(jié)果4.3 分割結(jié)果討論分析以上分割結(jié)果可知,該算法計算的閾值已經(jīng)十分接近根據(jù)人眼判斷手動選擇的閾值,這些輕微的差距是由于數(shù)列采樣損失掉部分信息導(dǎo)致的,雖然結(jié)果不完全相等,但是兩種方法選擇的閾值在同一個谷點附近。由直方圖性質(zhì)可知,谷點附近區(qū)域的灰度應(yīng)處于背景和目標(biāo)之間,二值化之后僅僅在目標(biāo)內(nèi)部會有一定的差異

19、,邊界差異幾乎可以忽略。即使是直方圖出現(xiàn)大量凸起和凹陷的圖像(woman.bmp),本算法依然具有較好的分割效果,表明算法適用性較強。表1 手工選擇和自動計算閾值對比圖像名稱手動選擇閾值自動計算閾值elain.bmp214211Woman.bmp8090附錄參考文獻1趙小川. MATLAB圖像處理程序?qū)崿F(xiàn)與模塊化仿真. 北京:北京航空航天大學(xué)出版社. 2014.2Kenneth R.Castleman. 數(shù)字圖像處理. 朱志剛,林學(xué)訚,石定機,等譯. 北京:電子工業(yè)出版社. 2001.3王文寧,王匯源,牟文英. 一種新的灰度直方圖分割閾值的自動檢測方法J. 計算機工程與應(yīng)用. 2005,(26

20、):89-90+173.圖表附圖1 均衡化前后各圖像直方圖對比源代碼1. 求圖像的灰度直方圖(openCV C+)/繪制圖像的灰度直方圖#include <opencv2opencv.hpp> int main()/ 圖像源獲取及判斷 cv:Mat Image, ImageGray;Image = cv:imread("woman2.bmp");if (Image.empty()return -1;/ 轉(zhuǎn)換為灰度圖像cv:cvtColor(Image, ImageGray, CV_BGR2GRAY);cv:imshow("Image", Im

21、ageGray);/ 定義直方圖參數(shù)const int channels1 = 0 ;const int histSize1 = 256 ;float pranges2 = 0, 255 ;const float* ranges1 = pranges ;cv:MatND hist;/ 計算直方圖cv:calcHist(&ImageGray, 1, channels, cv:Mat(), hist, 1,histSize, ranges);/ 初始化畫布參數(shù)int hist_w = 500;int hist_h = 500;int nHistSize = 255;/ 區(qū)間int bin_

22、w = cvRound(double)hist_w / nHistSize);cv:Mat histImage(hist_w, hist_h,CV_8UC3, cv:Scalar(255, 255, 255);/白色畫布/ 將直方圖歸一化到范圍 0, histImage.rows normalize(hist, hist, 0, histImage.rows,cv:NORM_MINMAX, -1, cv:Mat();/ 在直方圖畫布上畫出直方圖for (int i = 1; i < nHistSize; i+)line(histImage, cv:Point(bin_w*(i - 1),

23、hist_h - cvRound(hist.at<float>(i - 1),cv:Point(bin_w*(i),hist_h - cvRound(hist.at<float>(i),cv:Scalar(0, 0, 255), 2, 8, 0);/ 顯示直方圖cv:imshow("histogram_woman2", histImage);/以圖像形式保存直方圖cv:imwrite("histogram_woman2.bmp", histImage);cv:waitKey();return 0;2. 直方圖均衡化(OpenCV

24、C+)/實現(xiàn)圖像的直方圖均衡化#include <opencv2/opencv.hpp>int main()cv:Mat srcImage = cv:imread("citywall2.bmp");if (!srcImage.data)return 1;cv:Mat srcGray;cv:cvtColor(srcImage, srcGray, CV_BGR2GRAY);cv:imshow("srcGray", srcGray);/ 直方圖均衡化cv:Mat heqResult;cv:equalizeHist(srcGray, heqResul

25、t);/ 定義直方圖參數(shù)const int channels1 = 0 ;const int histSize1 = 256 ;float pranges2 = 0, 255 ;const float* ranges1 = pranges ;cv:MatND hist;/ 計算直方圖cv:calcHist(&heqResult, 1, channels, cv:Mat(), hist, 1,histSize, ranges);/ 初始化畫布參數(shù)int hist_w = 500;int hist_h = 500;int nHistSize = 255;/ 區(qū)間int bin_w = cv

26、Round(double)hist_w / nHistSize);cv:Mat histImage(hist_w, hist_h,CV_8UC3, cv:Scalar(255,255, 255);/ 將直方圖歸一化到范圍 0, histImage.rows normalize(hist, hist, 0, histImage.rows,cv:NORM_MINMAX, -1, cv:Mat();/ 在直方圖畫布上畫出直方圖for (int i = 1; i < nHistSize; i+)line(histImage, cv:Point(bin_w*(i - 1),hist_h - cvR

27、ound(hist.at<float>(i - 1),cv:Point(bin_w*(i),hist_h - cvRound(hist.at<float>(i),cv:Scalar(0, 0, 255), 2, 8, 0);/ 顯示直方圖,并以圖像形式保存直方圖cv:imshow("histImage", histImage); cv:imwrite("equlized_histogram_citywall2.bmp", histImage);/顯示直方圖均衡化結(jié)果,并保存cv:imshow("heqResult&quo

28、t;, heqResult);cv:imwrite("histograme_equalization_citywall2.bmp", heqResult);cv:waitKey(0);return 0;3. 直方圖匹配化程序(openCV C+)/實現(xiàn)圖像的直方圖匹配化#include <opencv2/core/core.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/highgui/highgui.hpp>#include <iostream>usin

29、g namespace cv;using namespace std;int main()/ 加載源圖像并顯示cv:Mat srcImage = cv:imread("woman1.bmp");cv:Mat dstImage = cv:imread("woman.bmp");if (!srcImage.data | !dstImage.data)return 1;cv:resize(dstImage, dstImage, cv:Size(srcImage.rows, srcImage.cols), 0, 0, CV_INTER_LINEAR);cv:im

30、show("srcImage", srcImage);cv:imshow("dstImage", dstImage);/初始化累計分布參數(shù)float srcCdfArr256;float dstCdfArr256;int srcAddTemp256;int dstAddTemp256;int histMatchMap256;for (int i = 0; i < 256; i+)srcAddTempi = 0;dstAddTempi = 0;srcCdfArri = 0;dstCdfArri = 0;histMatchMapi = 0;float

31、sumSrcTemp = 0;float sumDstTemp = 0;int nSrcPix = srcImage.cols * srcImage.rows;int nDstPix = dstImage.cols * dstImage.rows;int matchFlag = 0;/ 求解源圖像與目標(biāo)圖像的累積直方圖for (size_t nrow = 0; nrow < srcImage.rows; nrow+)for (size_t ncol = 0; ncol < srcImage.cols; ncol+)srcAddTemp(int)srcImage.at<ucha

32、r>(nrow, ncol)+;dstAddTemp(int)dstImage.at<uchar>(nrow, ncol)+;/ 求解源圖像與目標(biāo)圖像的累積概率分布for (int i = 0; i<256; i+)sumSrcTemp += srcAddTempi;srcCdfArri = sumSrcTemp / nSrcPix;sumDstTemp += dstAddTempi;dstCdfArri = sumDstTemp / nDstPix;/ 直方圖匹配實現(xiàn)for (int i = 0; i< 256; i+)float minMatchPara =

33、20;for (int j = 0; j< 256; j+)/ 判斷當(dāng)前直方圖累計差異if (minMatchPara > abs(srcCdfArri - dstCdfArrj)minMatchPara = abs(srcCdfArri - dstCdfArrj);matchFlag = j;histMatchMapi = matchFlag;/ 初始化匹配圖像cv:Mat HistMatchImage =cv:Mat:zeros(srcImage.rows, srcImage.cols, CV_8UC3);cv:cvtColor(srcImage, HistMatchImage

34、, CV_BGR2GRAY);/ 通過map映射成匹配圖像for (int i = 0; i < HistMatchImage.rows; i+)for (int j = 0; j < HistMatchImage.cols; j+)HistMatchImage.at<uchar>(i, j) =histMatchMap(int)HistMatchImage.at<uchar>(i, j);/顯示并保存直方圖匹配結(jié)果cv:imshow("resultImage", HistMatchImage);cv:imwrite("hist

35、Matching_woman1.bmp", HistMatchImage);cv:waitKey(0);return 0;4. 直方圖分割(openCV C+)/基于“谷底蓄水”最大化的直方圖閾值分割程序/采樣內(nèi)插環(huán)節(jié)似乎除了問題,用的matlab實現(xiàn),txt存取接口#include <opencv2opencv.hpp> #include <iostream>#include <fstream>#include <string >#include <sstream>using namespace std;/定義“pool”

36、結(jié)構(gòu)體struct poolint begin;int end;int valley;float capacity;/數(shù)組滑動平均函數(shù)/n:滑動平均尺度,len:數(shù)組長度void arraySmooth1(float data, float result, int n, int len)int delt = (n - 1) / 2;/首末補零for (int i = 0; i<delt; i+) resulti = 0;resultlen - 1 - i = 0;/開始平滑for (int i = 2; i < len - 2; i+)resulti = 0;for (int j

37、= i - delt; j <= i + delt; j+)resulti = resulti + dataj;resulti = resulti / n;/數(shù)組采樣內(nèi)插平滑函數(shù)/scale:采樣間隔,len:數(shù)組長度void arraySmooth2(float data, float result, int scale, int len)for (int i = 0; i < len; i+)int remainder = i%scale;if (remainder = 0)resulti = datai;continue;if (remainder != 0 &&am

38、p; i - remainder + scale < len)int beginTag, endTag;beginTag = i - remainder;endTag = i - remainder + scale;resulti = datai + (dataendTag - databeginTag)*remainder / scale;cout << datai << " " << resulti << endl;/數(shù)組微分函數(shù) void arrayDif(float data, float tempData, i

39、nt len)for (int i = 0; i < len - 1; i+)tempDatai = datai + 1 - datai;tempDatalen - 1 = 0;/末尾補零 /查找峰谷,峰1,谷-1 void findExtreme(float dataDif, int pv, int len)for (int i = 0; i < len - 1; i+)if (dataDifi > 0 && dataDifi + 1<0) pvi + 1 = 1;if (dataDifi < 0 && dataDifi + 1&

40、gt;0) pvi + 1 = -1;/已知vally,把pool結(jié)構(gòu)補全 pool findPool(int pv, int val)pool p;p.valley = val;for (int i = val; i+)if (pvi = 1)p.end = i;break;for (int i = val; i-)if (pvi = 1)p.begin = i;break;p.capacity = 0;return p;/計算pool容量 float calcPool(float dataSmooth, pool p)float sum = 0;p.capacity = 0;if (dat

41、aSmoothp.begin <= dataSmoothp.end)for (int i = p.begin; i <= p.end; i+)if (dataSmoothp.begin - dataSmoothi>0)sum = sum + dataSmoothp.begin - dataSmoothi;elsefor (int i = p.begin; i <= p.end; i+)if (dataSmoothp.end - dataSmoothi>0)sum = sum + dataSmoothp.end - dataSmoothi;/cout <<

42、; p.valley << " " <<sum << endl;return sum;/求最大容量的poolint findMaxPool(pool poolArray, int len)pool temp;temp = poolArray0;for (int i = 0; i<len; i+)if (temp.capacity<poolArrayi.capacity)temp = poolArrayi;return temp.valley;/定義求閾值函數(shù)int getValley(float data, int len)i

43、nt thresh;float *dataSmooth = new floatlen;float *dataDif = new floatlen;/arraySmooth1(data, dataSmooth,5, len); /對直方圖進行均值平滑,(elain scale=5,woman sacle=1)arraySmooth2(data, dataSmooth, 15, len);/*/直方圖數(shù)據(jù)寫入TXTofstream outfile("Data.txt");if (!outfile.is_open()cout << " the file op

44、en fail" << endl;exit(1);for (int i = 0; i<256; i+)outfile << dataSmoothi << endl;outfile.close();*/*for (int i = 0; i < len; i+)cout << i << " " << datai<< " " << dataSmoothi << endl;*/arrayDif(dataSmooth, dataDif,

45、 len); /完成差分int *pv = new intlen;findExtreme(dataDif, pv, len); /標(biāo)記峰谷,峰1,谷-1/獲取峰谷的數(shù)量int numOfPool = 0;int numOfPeak = 0;for (int i = 0; i < len; i+)if (pvi = 1) numOfPeak+;if (pvi = -1) numOfPool+;pool *poolPointer = new poolnumOfPool; /生成動態(tài)數(shù)組,長度等于numOfPool/求所有pool組成的數(shù)組 for (int i = 0, poolIndex

46、= 0; i<len; i+)if (pvi = -1)poolPointerpoolIndex = findPool(pv, i);poolPointerpoolIndex.capacity = calcPool(dataSmooth, poolPointerpoolIndex);poolIndex+;thresh = findMaxPool(poolPointer, numOfPool);return thresh;int main()/ 圖像源獲取及判斷 int histogramThreshold;cv:Mat Image, ImageGray;Image = cv:imread("elain.bmp");if (Image.empty()return -1;cv:imshow("Image",

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論