基于顏色特征圖像檢索源代碼c_第1頁
基于顏色特征圖像檢索源代碼c_第2頁
基于顏色特征圖像檢索源代碼c_第3頁
基于顏色特征圖像檢索源代碼c_第4頁
基于顏色特征圖像檢索源代碼c_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

基于內(nèi)容的圖像檢索(CBIR)所謂基于內(nèi)容圖像的檢索是指由圖像分析軟件對輸入的圖像先進(jìn)行圖像分析,根據(jù)圖像中物體或區(qū)域的顏色(color)、形狀(shape)或紋理(texture)等特征以及這些特征的組合,自動抽取特征,在將輸入圖像存入圖像庫的同時(shí)將其相應(yīng)的特征向量也存入與圖像庫相連的特征庫。在進(jìn)行檢索圖像時(shí),對每一幅給定的查詢圖,進(jìn)行圖像分析,并提取圖像特征向量。將該圖像的特征向量和特征庫中的特征向量進(jìn)行匹配,根據(jù)匹配的結(jié)果到圖像庫中搜索就可以提取出所需要的檢索圖。這是一種基于圖像固有屬性的機(jī)械匹配,特別適用于檢索目標(biāo)明確的查詢要求(例如對商標(biāo)的檢索),產(chǎn)生的結(jié)果也比較準(zhǔn)確。目前這種較成熟的檢索技術(shù)主要應(yīng)用于圖像數(shù)據(jù)庫的檢索。在基于Web的圖像搜索引擎中應(yīng)用這種檢索技術(shù)雖還具有一定的困難,但已有部分圖像搜索引擎進(jìn)行了嘗試,如、yahoo,WebSEEK就提供了基于圖像的形狀或顏色直方圖的粗陋的可視檢索功能?;趦?nèi)容的圖像檢索是一個(gè)逐步求精的過程,大致可以經(jīng)過以下幾個(gè)步驟:(1).特征提取對圖像數(shù)據(jù)進(jìn)行自動或半自動的特征提取,提取用戶感興趣的、適合檢索要求的特征。特征提取可以是全局性的,如整幅圖像,也可能是針對某個(gè)目標(biāo),如圖像中的子區(qū)域等。(2).圖像匹配在選取了特征之后,需要選擇或?qū)ふ疫m當(dāng)?shù)呐袆e準(zhǔn)則,從而判斷出待識別的圖像的特征與數(shù)據(jù)庫中的哪些圖像的特征最接近。常用的度量準(zhǔn)則是距離度量法。(3).結(jié)果輸出,將滿足一定相似性條件的一組候選結(jié)果按相似度大小排列后返回給用戶。(4).特征調(diào)整,對系統(tǒng)返回的結(jié)果可通過瀏覽來挑選,直至找到滿意的結(jié)果,或從候選結(jié)果中選擇一個(gè)示例,經(jīng)過特征調(diào)整,形成一個(gè)新的查詢。圖像特征的提取的方法圖像特征提取的好壞,將直接影響著圖像檢索系統(tǒng)的性能,特征提取是基于內(nèi)容的圖像檢索的基礎(chǔ)。特征的提取可以分為手工提取、半自動提取和自動提取。這在很大程度上依賴于圖像處理技術(shù)的發(fā)展。從圖像中提取出來的圖像特征,主要分為三個(gè)層次:低層次、中層次和高層次。低層次的圖像特征是形狀、紋理、顏色、輪廓等圖像某一方面的特征。高層次的圖像特征是在圖像中層次特征基礎(chǔ)上的再一次抽象,它賦予圖像一定的語義信息,是圖像所包含內(nèi)容的一種抽象概括,也是基于內(nèi)容的圖像檢索所要達(dá)到的最終目標(biāo)。本文主要是針對顏色特征的提取進(jìn)行研究?;陬伾卣鞯膱D像檢索在圖像的形狀、顏色、紋理等特征中,顏色特征是最顯著、最可靠、最穩(wěn)定的視覺特征,是人識別圖像的主要感知特征。相對于幾何特征而言,顏色對圖像中子對象的大小和方向的變化都不敏感,具有相當(dāng)強(qiáng)的魯棒性。同時(shí),在許多情況下,顏色又是描述一幅圖像最簡便而有效的特征。人們對于一幅圖像的印象,往往從圖像中顏色的空間分布開始。所有這些都促使顏色成為基于內(nèi)容的圖像檢索所采取的主要手段之一。對于基于顏色特征的圖像檢索,科學(xué)工作者們提出了多種方案。譬如顏色直方圖、主色調(diào)、顏色矩(ColorMoments),顏色集(Colorsets)、聚類、掃描線投影等檢索算法,顏色直方圖是目前較常使用的檢索方法。特征提取與圖像子塊的劃分特征提取是圖像分析和識別的基礎(chǔ)。特征提取的方法是決定圖像檢索系統(tǒng)效率的關(guān)鍵。一般情況下,圖像的目標(biāo)形狀可以通過圖像分割獲得。但是,圖像分割是圖像分析中公開的難題,尤其對于場景復(fù)雜的圖像,通過分割直接提取有意義的形狀特征幾乎是不可能的。為了避免圖像分割的困難,文中采用幾何劃分的方法對圖像進(jìn)行局部特征提取,并用特征組合描述整幅圖像。本文將圖像劃分成大小相等的柵格狀區(qū)域,提取每塊的顏色直方圖作為特征矢量。用具有視覺一致性的HSV顏色空間模型分析圖像顏色信息。為了減少計(jì)算復(fù)雜性,將HSV空間的每一維分量都均勻量化為10份。因?yàn)楣庹諒?qiáng)度不影響圖像的內(nèi)容表示,所以V分量可以忽略不計(jì)。這樣計(jì)算顏色直方圖時(shí),通過劃分后,每一個(gè)塊的特征包含了顏色的局部分布信息,而所有塊的空間分布,又反映了圖像內(nèi)容的顏色模式結(jié)構(gòu)。因此,對于一幅場景復(fù)雜的圖像,可以從結(jié)構(gòu)分布的角度,用特征組合的方式描述。在基于劃分的特征表示方法中,劃分尺度的選擇直接影響圖像內(nèi)容描述的有效性[6]。全局顏色直方圖雖然具有計(jì)算簡單,對平移和旋轉(zhuǎn)不敏感的優(yōu)點(diǎn),但無法捕捉顏色組成之間的空間關(guān)系,丟失了圖像的空間信息。這無疑是不夠準(zhǔn)確的。兩幅顏色直方圖非常相似的圖像其內(nèi)容可能絲毫無相似之處。因此,在基于顏色的圖像檢索中引入空域的信息對于確保檢索精度是十分重要的。事實(shí)上,顏色的不同空間分布極大地影響了人們對圖像的相似性判斷。鑒于此,解決方法之一就是基于圖像空間的固定劃分,即人為地將圖像劃分成適當(dāng)?shù)姆謮K,然后為每個(gè)分塊提取相應(yīng)的局部顏色特征。我們知道分塊太大則失去分塊的意義,若分塊太小則會增加檢索過程的計(jì)算量[3]。圖3.1顯示了分別劃分成4塊和16塊的情形,當(dāng)然我們可以劃分更多的子塊,劃分的子塊越多,圖像的距離矩陣攜帶的空間信息越完備,檢索精度也越高,計(jì)算復(fù)雜度也越高。距離度量圖像檢索的性能不僅依賴于所抽取的圖像特征,而且也與所采用的距離度量或相似度量函數(shù)密切相關(guān).所謂相似度量函數(shù),就是根據(jù)某些預(yù)先設(shè)定的準(zhǔn)則來計(jì)算并返回兩個(gè)圖像之間的相似度.為了確定合適的相似度量函數(shù),我們對不同的距離度量進(jìn)行了實(shí)驗(yàn),例如,Lp距離、余弦距離等.我們在實(shí)驗(yàn)中發(fā)現(xiàn),使用不同的Lp距離度量均能得到較滿意的檢索結(jié)果,并且不同的Lp距離度量幾乎均給出相同的檢索結(jié)果.因此,我們就選取最簡單的歐氏距離作為距離度量[7].設(shè)x=(x1,x2,?-?-,xk),y=(y1,y2,?-?-,yk)為兩個(gè)圖像,則它們之間的距離定義為:d2hist(x,y)=(x1-y1)2+(x2-y2)2+?-?-+(xn-yn)2(①)(②)3.3.4相似性度量設(shè)G和S表示要進(jìn)行比較的兩幅圖像,N表示圖片中出現(xiàn)的顏色級數(shù),gk和sk分別表示圖G和S中k級色出現(xiàn)的頻數(shù),則兩幅圖像的相似度可用如下公式表示:(③).Sim值越接近1,兩幅圖像越相似。??設(shè)圖像G分割成(m?án)個(gè)子塊,用顏色對來表示圖像G的特征,如果顏色對的值用兩個(gè)子塊顏色直方圖的歐氏距離表示,則圖G中子塊Gij(i=1,2,?,m;j=1,2,?,n)的顏色對表就是該子塊與周圍子塊歐氏距離的顏色對。為了消除顏色噪聲,若圖像G中子塊Gij的顏色對表中任意兩個(gè)顏色對值之差小于某一閾值,則刪除其中一個(gè)顏色對。算法的描述顏色直方圖的實(shí)現(xiàn)算法描述1.從圖像庫中讀入關(guān)鍵圖;2.計(jì)算目標(biāo)圖片的直方圖;3.定位子塊,即指定用戶輸入的圖征對象所在子塊坐標(biāo)位置;4.按式(①)計(jì)算兩幅圖像的各對應(yīng)子塊的相似度;5.對用戶指定的塊設(shè)置權(quán)重為1,其他塊降低權(quán)重為0.7,;6.將N幅被比較的圖像與用戶輸入的源圖像的最后計(jì)算出來的相似度結(jié)果記錄放入數(shù)組中。7.將N個(gè)相似度從大到小排列;8.根據(jù)相似度的排列顯示檢索到的圖像。改進(jìn)的顏色直方圖實(shí)現(xiàn)算法描述結(jié)合前面顏色直方圖的實(shí)現(xiàn)思路,提出了些改進(jìn),其具體實(shí)現(xiàn)過程如下:1.從圖像庫中讀入關(guān)鍵圖;2.定位圖像中的子塊,并計(jì)算子塊直方圖,即用戶選定包含查詢圖像的子塊;3.計(jì)算子塊(x,y)的顏色對表,采取“八方向鄰接技術(shù)”計(jì)算這些子塊與周圍相鄰子塊的顏色對表,用calcuatecolorpair()函數(shù)實(shí)現(xiàn);4.將這些顏色對中差值小于某一域值的顏色對刪除,以消除顏色澡聲;5.將該子塊計(jì)算得到的顏色對表填入該圖像的特征顏色對表,并對其從大到小排列,給定一個(gè)域值,選取顏色對表中最大的幾個(gè)顏色對做為圖像的代表特征;6.顏色匹配,讀取待比較的N幅圖像,計(jì)算當(dāng)前被比較的圖像的顏色直方圖,搜索目標(biāo)圖像的每一子塊的顏色對表,匹配時(shí)不能使用精確匹配,因此顏色對誤差小于2%也屬于該匹配值;7.統(tǒng)計(jì)單一匹配次數(shù),按順序計(jì)算目標(biāo)圖像中一子塊與其同周圍子塊的顏色對,然后在用戶輸入的圖像顏色對表中查詢計(jì)算出來的顏色對,差值小于某域值,則匹配到,并置顏色匹配對標(biāo)志;8.如果有60%以上的特征顏色匹配到,就說明該圖像被檢索到;9.顯示檢索結(jié)果。基于顏色直方圖的圖像檢索系統(tǒng)的實(shí)現(xiàn)開發(fā)工具的選取本文的系統(tǒng)實(shí)現(xiàn)選用的開發(fā)工具為Microsoft公司的VisualC++6.0。C++是最流行的面向?qū)ο笳Z言之一,支持對象、類、方法、消息等概念,同時(shí)也支持面向?qū)ο蠓椒ǖ姆庋b機(jī)制和繼承、多態(tài)性機(jī)制。1998年,C++由ISO(InternationalStandardsOrganization)完成了標(biāo)準(zhǔn)化,C++標(biāo)準(zhǔn)提供了統(tǒng)一的C++標(biāo)準(zhǔn)庫,為用戶提供了最為廣泛的編程基礎(chǔ)設(shè)施。VisualC++6.0是Microsoft公司推出的基于Windows的可視化集成開發(fā)環(huán)境,將編輯、編譯、鏈接和執(zhí)行集成為一體,能用它來開發(fā)32位程序。VisualC++經(jīng)歷了從1.0到6.0版本的發(fā)展,軟件系統(tǒng)逐漸龐大,功能日益完善。系統(tǒng)結(jié)構(gòu)系統(tǒng)結(jié)構(gòu)圖圖像查詢流程圖4.2圖像查詢流程圖主要類方法和數(shù)據(jù)結(jié)構(gòu)位圖類該系統(tǒng)的實(shí)現(xiàn),沒有采用數(shù)據(jù)庫的形式,直接以文件夾的形式調(diào)用圖像庫。classCPicture{public:CPicture();virtual~CPicture();private:IPicture*m_pic;HGLOBALhGlobal;public:HBITMAPLoadPicture(char*FileName);HBITMAPLoadPicture(char*FileName,HDChdc);VOIDFreePicture(VOID);HDC_GetDC(VOID);HBITMAP_GetHandle(VOID);DWORD_GetWidth(VOID);DWORD_GetHeight(VOID);BOOLDrawPicture(HDChdc,longx,longy,longcx,longcy);};CImageRetrievalDlg類classCImageRetrievalDlg{public:voidShowPic(CStringpathfile,intidc);//picture中顯示圖片voidStartDir(constCString&strfile1);//對所有目錄查找,取得圖像目錄下文件路徑voidRunDir(constCString&strfile2);//對*.bmp文件查找voidCalculateColor(CStringpathfile);//計(jì)算顏色直方圖voidHistogramShow(intidc);//繪置直方圖voidCalculateColorPair(intx,inty);//計(jì)算子塊的顏色對表voidSortColorPair();//對四個(gè)子塊的顏色對表排序voidSeekImage();//部分方法略protected://部分變量定義略structpairs{intx1;inty1;doubleo_dis1;}pair[32];structobj_sets{intx;inty;}obj_set[4];//定義子塊位置結(jié)構(gòu)};主要程序界面打開關(guān)鍵圖:指定關(guān)鍵圖子塊位置顯示關(guān)鍵圖直方圖選擇圖像庫實(shí)驗(yàn)結(jié)果以藍(lán)天白云為例關(guān)鍵圖:路徑為\2006519\樣本\cloud.bmp圖像庫:路徑為\2006519\圖像庫\clouds檢索結(jié)果:用戶指定一個(gè)檢索圖像,系統(tǒng)從圖像庫中自動檢索與檢索圖像最相似的圖像,檢索結(jié)果按距離的降序排列。特別是對于輪廓或邊界分明的圖像,該算法的檢索結(jié)果比全局圖像的顏色直方圖算法明顯要好。附錄主要函數(shù)://picture中顯示圖片voidCImageRetrievalDlg::ShowPic(CStringpathfile,intidc){CBitmaphbmp;HBITMAPhbitmap;//將pStatic指向要顯示的地方CStatic*pStaic;pStaic=(CStatic*)GetDlgItem(idc);//裝載資源hbitmap=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),pathfile,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);hbmp.Attach(hbitmap);//獲取圖片格式BITMAPbm;hbmp.GetBitmap(&bm);//創(chuàng)建臨時(shí)的內(nèi)存DC對象CDCdcMem;dcMem.CreateCompatibleDC(GetDC());CBitmap*poldBitmap=(CBitmap*)dcMem.SelectObject(hbmp);CRectlRect;pStaic->GetClientRect(&lRect);lRect.NormalizeRect();//顯示位圖pStaic->GetDC()->StretchBlt(lRect.left,lRect.top,lRect.Width(),lRect.Height(),&dcMem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);dcMem.SelectObject(&poldBitmap);pStaic->ReleaseDC(&dcMem);}//打開關(guān)鍵圖voidCImageRetrievalDlg::OnOpenImage(){CFileOpenfileOpenDlg(TRUE);if(fileOpenDlg.DoModal()!=IDOK)return;//使菜單可用CMenu*mmenu=GetMenu();mmenu->EnableMenuItem(ID_START_RETRIEVAL,0);mmenu->EnableMenuItem(ID_STOP_RETRIEVAL,0);mmenu->EnableMenuItem(ID_SHOW_IM,0);mmenu->EnableMenuItem(ID_SHOW_IM2,0);mmenu->EnableMenuItem(ID_SHOW_INFO,0);//畫格子CWnd*pWnd=GetDlgItem(IDC_VIEW1);CDC*pDC=pWnd->GetDC();pWnd->Invalidate();pWnd->UpdateWindow();CPen*pPenRed=newCPen;pPenRed->CreatePen(PS_SOLID,1,RGB(255,0,0));CPen*pOldPen=pDC->SelectObject(pPenRed);/*pDC->MoveTo(1,1);//PictureBox寬194高172pDC->LineTo(1,172);pDC->MoveTo(1,86);pDC->LineTo(211,86);pDC->MoveTo(97,1);pDC->LineTo(97,190);pDC->MoveTo(48,1);pDC->LineTo(48,190);pDC->MoveTo(145,1);pDC->LineTo(145,190);pDC->MoveTo(1,43);pDC->LineTo(211,43);pDC->MoveTo(1,129);pDC->LineTo(211,129);*///取得文件路徑POSITIONpos=fileOpenDlg.GetStartPosition();strfile=fileOpenDlg.GetNextPathName(pos);ShowPic(strfile,IDC_VIEW1);}//選擇圖像庫目錄voidCImageRetrievalDlg::OnMutiImageIndb(){CStringm_strPath;tempi=0;//打開通用對話框BROWSEINFObrowse;ZeroMemory(&browse,sizeof(browse));//fillsablockofmemorywithzeros.browse.hwndOwner=NULL;browse.pszDisplayName=m_strPath.GetBuffer(MAX_PATH);browse.lpszTitle="請選擇一個(gè)圖像目錄";LPITEMIDLISTlpItem=SHBrowseForFolder(&browse);if(lpItem==NULL)return;m_strPath.ReleaseBuffer();if(SHGetPathFromIDList(lpItem,m_strPath.GetBuffer(MAX_PATH))==false)return;m_strPath.ReleaseBuffer();AfxMessageBox("您選擇的目錄為:"+m_strPath,MB_ICONINFORMATION|MB_OK);//得到圖像目錄下文件的路徑CStringtempath;CStringtemps;tempath=m_strPath;tempath.TrimRight();tempath.TrimLeft();//去除前后多余CStringstrfilepath=tempath;counts=0;StartDir(strfilepath);temps.Format("該目錄下共有%d幅圖像!",counts);AfxMessageBox(temps,MB_ICONINFORMATION|MB_OK);//for(inti=0;i<counts;i++)//{//AfxMessageBox(temp[i],MB_ICONINFORMATION|MB_OK);//}}//對所有目錄查找,取得圖像目錄下文件路徑voidCImageRetrievalDlg::StartDir(constCString&strfile1){BOOLyesno;CFileFindfind;chartempFileFind[200];sprintf(tempFileFind,"%s\\*.*",strfile1);RunDir(strfile1);yesno=(BOOL)find.FindFile(tempFileFind);//查找下級目錄while(yesno){yesno=find.FindNextFile();if(find.IsDots()!=TRUE){charfoundFileName[200];strcpy(foundFileName,find.GetFileName().GetBuffer(200));if((find.IsDirectory()==TRUE)){chartempDir[200];sprintf(tempDir,"%s\\%s",strfile1,foundFileName);//遞歸調(diào)用StartDir(tempDir);}}}find.Close();return;}//對*.bmp文件查找voidCImageRetrievalDlg::RunDir(constCString&strfile2){BOOLyesno;CFileFindfind;chartempFileFind[200];sprintf(tempFileFind,"%s\\*.bmp",strfile2);yesno=find.FindFile(tempFileFind);while(yesno){yesno=find.FindNextFile();charfoundFileName[200];strcpy(foundFileName,find.GetFileName().GetBuffer(200));if(!find.IsDots()){chartempFileName[200];sprintf(tempFileName,"%s\\%s",strfile2,foundFileName);CStringstrfilepath1;strfilepath1.Format("%s",tempFileName);counts++;temp[tempi]=newCString(strfilepath1);tempi++;}}find.Close();return;}//單個(gè)圖像特征向量voidCImageRetrievalDlg::OnSingleImageIndb(){CFileOpenfileOpenDlg1(TRUE);if(fileOpenDlg1.DoModal()!=IDOK)return;//取得文件路徑POSITIONpos=fileOpenDlg1.GetStartPosition();strfile=fileOpenDlg1.GetNextPathName(pos);AfxMessageBox(strfile);}//顯示關(guān)鍵圖的直方圖voidCImageRetrievalDlg::OnShowIm(){CStringimagefilepath=strfile;//if(imagefilepath=''){AfxMessageBox("請選擇一幅關(guān)鍵圖");return;}CalculateColor(imagefilepath);HistogramShow(IDC_DLG_HIST_SHOW);}//計(jì)算顏色直方圖voidCImageRetrievalDlg::CalculateColor(CStringpathfile){CBitmaphbmp;HBITMAPhbitmap;intR,G,B,H,S,V;inti,j;hbitmap=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),pathfile,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);hbmp.Attach(hbitmap);BITMAPbm;hbmp.GetBitmap(&bm);CDCdcMem;dcMem.CreateCompatibleDC(GetDC());dcMem.SelectObject(hbmp);intwidth=bm.bmWidth/4;intheight=bm.bmHeight/4;COLORREFclr;//定義一個(gè)COLORREF結(jié)構(gòu),因?yàn)樘崛〉南笏攸c(diǎn)的顏色是以RGB形式表示的intx,y;for(intfda=0;fda<4;fda++)for(intsda=0;sda<4;sda++)for(inttda=0;tda<256;tda++){Ha[fda][sda][tda]=0;}for(intfdb=0;fdb<4;fdb++)for(intsdb=0;sdb<4;sdb++)for(inttdb=0;tdb<256;tdb++){Sa[fdb][sdb][tdb]=0;}for(intfdc=0;fdc<4;fdc++)for(intsdc=0;sdc<4;sdc++)for(inttdc=0;tdc<256;tdc++){Va[fdc][sdc][tdc]=0;}for(i=0;i<4;i++)for(j=0;j<4;j++)for(intk=0;k<width;k++)for(intl=0;l<height;l++){x=j*width+l;y=i*height+k;clr=dcMem.GetPixel(x,y);R=GetRValue(clr);G=GetGValue(clr);B=GetBValue(clr);//RGB轉(zhuǎn)HSVintmaxp=max(R,G);intmax=max(maxp,B);intminp=min(R,G);intmin=min(minp,B);if(max!=0){S=(max-min)/max;}else{S=0;H=-1;break;}//飽和度if(max==min){break;}if(R==max)H=(G-B)/(max-min);elseif(G==max)H=2+(B-R)/(max-min);elseH=4+(R-G)/(max-min);H=H*60;if(H<0)H=H+360;//色彩度V=max;//亮度Ha[i][j][H]++;Sa[i][j][S]++;Va[i][j][V]++;}}//繪置直方圖voidCImageRetrievalDlg::HistogramShow(intidc){intm;CWnd*pWnd=GetDlgItem(idc);//獲取繪制直方圖文本框的標(biāo)簽//獲取設(shè)備上下文CDC*pDC=pWnd->GetDC();pWnd->Invalidate();pWnd->UpdateWindow();pDC->Rectangle(0,0,367,338);CPen*pPenRed=newCPen;//創(chuàng)建畫筆對象pPenRed->CreatePen(PS_SOLID,1,RGB(255,0,0));//創(chuàng)建紅色畫筆(用于繪制坐標(biāo)軸)CPen*pOldPen=pDC->SelectObject(pPenRed);//選入紅色畫筆,并保存以前的畫筆pDC->MoveTo(40,40);//繪制坐標(biāo)軸pDC->LineTo(40,300);//繪制垂直軸pDC->LineTo(340,300);//繪制水平軸//繪制X軸刻度值CStringstrTemp;strTemp.Format("0");pDC->TextOut(40,303,strTemp);strTemp.Format("50");pDC->TextOut(90,303,strTemp);strTemp.Format("100");pDC->TextOut(140,303,strTemp);strTemp.Format("150");pDC->TextOut(190,303,strTemp);strTemp.Format("200");pDC->TextOut(240,303,strTemp);strTemp.Format("255");pDC->TextOut(295,303,strTemp);//繪制X軸刻度for(m=0;m<256;m+=5){if((m&1)==0){//10的倍數(shù)pDC->MoveTo(m+40,303);pDC->LineTo(m+40,307);}else{//5的奇數(shù)倍數(shù)pDC->MoveTo(m+40,303);pDC->LineTo(m+40,310);}}//繪制X軸箭頭pDC->MoveTo(335,295);pDC->LineTo(340,300);pDC->LineTo(335,305);//繪制Y軸箭頭pDC->MoveTo(40,40);pDC->LineTo(35,45);pDC->MoveTo(40,40);pDC->LineTo(45,45);LONGlMaxCount=0;//直方圖中最大計(jì)數(shù)值//計(jì)算最大計(jì)數(shù)值for(m=0;m<=255;m++){//判斷是否大于當(dāng)前最大值if(Ha[1][1][m]>lMaxCount){//更新最大值lMaxCount=Ha[1][1][m];}}pDC->TextOut(10,150,"hue");CPen*pPenBlue=newCPen;//聲名畫筆對象pPenBlue->CreatePen(PS_SOLID,1,RGB(0,0,255));//創(chuàng)建藍(lán)色畫筆(用于繪制直方圖)pDC->SelectObject(pPenBlue);//選入藍(lán)色畫筆//判斷是否存在計(jì)數(shù)值if(lMaxCount>0){//繪制直方圖for(m=0;m<=255;m++){if(Ha[1][1][m]>=1040){pDC->MoveTo(m+40,300);pDC->LineTo(m+40,40);}elseif(Ha[1][1][m]>0&&Ha[1][1][m]<1040){pDC->MoveTo(m+40,300);pDC->LineTo(m+40,300-Ha[1][1][m]/4);}if(Ha[1][1][m]>0){strTemp.Format("%d",Ha[1][1][m]);pDC->TextOut(m+40,20,strTemp);}}}pDC->SelectObject(pOldPen);//恢復(fù)以前的畫筆//刪除新的畫筆deletepPenRed;deletepPenBlue;}//顯示匹配圖的直方圖voidCImageRetrievalDlg::OnShowIm2(){CDlgHistShowdlgShow;dlgShow.DoModal();}//計(jì)算子塊的顏色對表voidCImageRetrievalDlg::CalculateColorPair(intx,inty){//采用歐氏距離表示顏色對for(intka=0;ka<8;ka++){o_dis[ka]=0;}for(intnumb=0;numb<32;numb++){pair[numb].x1=-1;pair[numb].y1=-1;pair[numb].o_dis1=-1;}//計(jì)算(x,y)與周圍所有子塊的顏色直方圖的歐氏距離for(inti=0;i<256;i++){if((x-1)>=0&&(y-1)>=0)o_dis[0]=o_dis[0]+(Ha[x-1][y-1][i]-Ha[x][y][i])*(Ha[x-1][y-1][i]-Ha[x][y][i]);elseo_dis[0]=-1;if((y-1)>=0)o_dis[1]=o_dis[1]+(Ha[x][y-1][i]-Ha[x][y][i])*(Ha[x][y-1][i]-Ha[x][y][i]);elseo_dis[1]=-1;if((x+1)<=3&&(y-1)>=0)o_dis[2]=o_dis[2]+(Ha[x+1][y-1][i]-Ha[x][y][i])*(Ha[x+1][y-1][i]-Ha[x][y][i]);elseo_dis[2]=-1;if((x-1)>=0)o_dis[3]=o_dis[3]+(Ha[x-1][y][i]-Ha[x][y][i])*(Ha[x-1][y][i]-Ha[x][y][i]);elseo_dis[3]=-1;if((x+1)<=3)o_dis[4]=o_dis[4]+(Ha[x+1][y][i]-Ha[x][y][i])*(Ha[x+1][y][i]-Ha[x][y][i]);elseo_dis[4]=-1;if((x-1)>=0&&(y+1)<=3)o_dis[5]=o_dis[5]+(Ha[x-1][y+1][i]-Ha[x][y][i])*(Ha[x-1][y+1][i]-Ha[x][y][i]);elseo_dis[5]=-1;if((y+1)<=3)o_dis[6]=o_dis[6]+(Ha[x][y+1][i]-Ha[x][y][i])*(Ha[x][y+1][i]-Ha[x][y][i]);elseo_dis[6]=-1;if((x+1)<=3&&(y+1)<=3)o_dis[7]=o_dis[7]+(Ha[x+1][y+1][i]-Ha[x][y][i])*(Ha[x+1][y+1][i]-Ha[x][y][i]);elseo_dis[7]=-1;}//取平方根for(intj=0;j<8;j++){if(o_dis[j]>=0)o_dis[j]=sqrt(o_dis[j]);}//取得顏色已有數(shù)目intnum=0;for(intpairnum=0;pairnum<32;pairnum++){if(pair[pairnum].x1!=-1)num++;}//計(jì)算域值doubleave=0;for(inte=0;e<8;e++){ave+=o_dis[e];}ave=ave/8;ave=ave*0.02;//對該子塊的顏色對表進(jìn)行從大到小的排序(冒泡排序)intcount=8;doubletemp;for(inti1=count;i1>0;i1--){for(intj1=0;j1<i1-1;j1++){if(o_dis[j1]<o_dis[j1+1]){temp=o_dis[j1];o_dis[j1]=o_dis[j1+1];o_dis[j1+1]=temp;}}}//消除那些顏色對差值小于域值的顏色對,以消除那些沒有意義的小對象for(intk1=0;k1<count-1;k1++){if(fabs(o_dis[k1]-o_dis[k1+1])<ave){for(intl=k1+1;l<count-1;l++){o_dis[l]=o_dis[l+1];}count--;o_dis[count]=-1;k1--;}}//將該字塊計(jì)算得到的顏色對表填入該圖像的特征顏色對表for(intscan=0;scan<8;scan++){if(o_dis[scan]>0){pair[num].x1=x;pair[num].y1=y;pair[num].o_dis1=o_dis[scan];num++;}}}//對四個(gè)子塊的顏色對表排序voidCImageRetrievalDlg::SortColorPair(){//32個(gè)數(shù)據(jù)項(xiàng)中有count個(gè)實(shí)際數(shù)值for(intcount=0;count<32;count++){if(pair[count].x1==-1)break;}//對顏色對表從大到小排列序structpairstemp;for(inti=count;i>0;i--){for(intj=0;j<i;j++){if(pair[j].o_dis1<pair[j+1].o_dis1){temp=pair[j];pair[j]=pair[j+1];pair[j+1]=temp;}}}//計(jì)算域值doubleave=0;for(inte=0;e<count;e++){ave+=pair[e].o_dis1;}ave=ave/count;ave=ave*0.02;//消除差值小于域值的顏色對for(intk=0;k<count-1;k++){if(fabs(pair[k].o_dis1-pair[k+1].o_dis1)<ave){for(intl=k+1;l<count-1;l++){pair[l]=pair[l+1];}pair[count-1].x1=-1;count--;k--;}}//置特征顏色對數(shù)目變量pair_count=count;}//顯示關(guān)鍵圖(1,1)塊顏色對信息voidCImageRetrievalDlg::OnShowInfo(){CWnd*pWnd=GetDlgItem(IDC_STATIC_SHOWINFO);CDC*pDC=pWnd->GetDC();pDC->Rectangle(0,0,120,160);intt1=0;CStringimagefilepath=strfile;CalculateColor(imagefilepath);CalculateColorPair(1,1);for(intka1=0;ka1<8;ka1++){CStringsd1;sd1.Format("%d",o_dis[ka1]);pDC->TextOut(0,t1,sd1);t1+=20;}}//開始檢索voidCImageRetrievalDlg::OnStartRetrieval(){UpdateData(TRUE);for(intobjset=0;objset<4;objset++){obj_set[objset].x=0;obj_set[objset].y=0;}intm1=0;if(m_00==TRUE){obj_set[m1].x=0;obj_set[m1].y=0;m1++;}if(m_01==TRUE){obj_set[m1].x=0;obj_set[m1].y=1;m1++;}if(m_02==TRUE){obj_set[m1].x=0;obj_set[m1].y=2;m1++;}if(m_03==TRUE){obj_set[m1].x=0;obj_set[m1].y=3;m1++;}if(m_10==TRUE){obj_set[m1].x=1;obj_set[m1].y=0;m1++;}if(m_11==TRUE){obj_set[m1].x=1;obj_set[m1].y=1;m1++;}if(m_12==TRUE){obj_set[m1].x=1;obj_set[m1].y=2;m1++;}if(m_13==TRUE){obj_set[m1].x=1;obj_set[m1].y=3;m1++;}if(m_20==TRUE){obj_set[m1].x=2;obj_set[m1].y=0;m1++;}if(m_21==TRUE){obj_set[m1].x=2;obj_set[m1].y=1;m1++;}if(m_22==TRUE){obj_set[m1].x=2;obj_set[m1].y=2;m1++;}if(m_23==TRUE){obj_set[m1].x=2;obj_set[m1].y=3;m1++;}if(m_30==TRUE){obj_set[m1].x=3;obj_set[m1].y=0;m1++;}if(m_31==TRUE){obj_set[m1].x=3;obj_set[m1].y=1;m1++;}if(m_32==TRUE){obj_set[m1].x=3;obj_set[m1].y=2;m1++;}if(m_33==TRUE){obj_set[m1].x=3;obj_set[m1].y=3;m1++;}if(m1!=4){AfxMessageBox("請選擇四個(gè)小方塊");return;}SeekImage();}voidCImageRetrievalDlg::SeekImage(){CStringimagefilepath=strfile;CalculateColor(imagefilepath);CalculateColorPair(obj_set[0].x,obj_set[0].y);CalculateColorPair(obj_set[1].x,obj_set[1].y);CalculateColorPair(obj_set[2].x,obj_set[2].y);CalculateColorPair(obj_set[3].x,obj_set[3].y);SortColorPair();structpairstemps[32];for(intcount1=0;count1<32;count1++){temps[count1].x1=pair[c

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論