基于颜色特征图像检索源代码c内容摘要:

Dlg::OnShowIm() { CString imagefilepath = strfile。 //if (imagefilepath = 39。 39。 ) {AfxMessageBox(请选择一幅关键图 )。 return。 } CalculateColor(imagefilepath)。 HistogramShow(IDC_DLG_HIST_SHOW)。 } //计算颜色直方图 void CImageRetrievalDlg::CalculateColor(CString pathfile) { CBitmap hbmp。 HBITMAP hbitmap。 int R,G,B,H,S,V。 int i,j。 hbitmap=(HBITMAP)::LoadImage (::AfxGetInstanceHandle(),pathfile, IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION)。 (hbitmap)。 BITMAP bm。 (amp。 bm)。 CDC dcMem。 (GetDC())。 (hbmp)。 int width=。 int height=。 COLORREF clr。 //定义一个 COLORREF结构,因为提取的象素点的颜色是以 RGB形式表示的 int x,y。 for(int fda=0。 fda4。 fda++) for(int sda=0。 sda4。 sda++) for(int tda=0。 tda256。 tda++){ Ha[fda][sda][tda]=0。 } for(int fdb=0。 fdb4。 fdb++) for(int sdb=0。 sdb4。 sdb++) for(int tdb=0。 tdb256。 tdb++){ Sa[fdb][sdb][tdb]=0。 } for(int fdc=0。 fdc4。 fdc++) for(int sdc=0。 sdc4。 sdc++) for(int tdc=0。 tdc256。 tdc++){ Va[fdc][sdc][tdc]=0。 } for( i=0。 i4。 i++) for( j=0。 j4。 j++) for(int k=0。 kwidth。 k++) for(int l=0。 lheight。 l++){ x=j*width+l。 y=i*height+k。 clr=(x,y)。 R=GetRValue(clr)。 G=GetGValue(clr)。 B=GetBValue(clr)。 //RGB转 HSV int maxp=max(R,G)。 int max=max(maxp,B)。 int minp=min(R,G)。 int min=min(minp,B)。 if(max!=0) {S=(maxmin)/max。 } else {S=0。 H=1。 break。 } //饱和度 if(max==min) {break。 } if (R == max) H = (GB)/(maxmin)。 else if (G == max) H = 2 + (BR)/(maxmin)。 else H = 4 + (RG)/(maxmin)。 H = H * 60。 if (H 0) H = H + 360。 //色彩度 V=max。 //亮度 Ha[i][j][H]++。 Sa[i][j][S]++。 Va[i][j][V]++。 } } //绘置直方图 void CImageRetrievalDlg::HistogramShow(int idc) { int m。 CWnd* pWnd = GetDlgItem(idc)。 // 获取绘制直方图文本框的标签 // 获取设备上下文 CDC* pDC = pWndGetDC()。 pWndInvalidate()。 pWndUpdateWindow()。 pDCRectangle(0, 0, 367,338)。 CPen* pPenRed = new CPen。 // 创建画笔对象 pPenRedCreatePen(PS_SOLID, 1, RGB(255,0,0))。 // 创建红色画笔(用于绘制坐标轴) CPen* pOldPen = pDCSelectObject(pPenRed)。 // 选入红色画笔,并保存以前的画笔 pDCMoveTo(40,40)。 // 绘制坐标轴 pDCLineTo(40, 300)。 // 绘制垂直轴 pDCLineTo(340, 300)。 // 绘制水平轴 // 绘制 X轴刻度值 CString strTemp。 (0)。 pDCTextOut(40, 303, strTemp)。 (50)。 pDCTextOut(90, 303, strTemp)。 (100)。 pDCTextOut(140, 303, strTemp)。 (150)。 pDCTextOut(190, 303, strTemp)。 (200)。 pDCTextOut(240, 303, strTemp)。 (255)。 pDCTextOut(295, 303, strTemp)。 // 绘制 X轴刻度 for (m = 0。 m 256。 m += 5) { if ((m amp。 1) == 0) { // 10的倍数 pDCMoveTo(m + 40, 303)。 pDCLineTo(m + 40, 307)。 } else { // 5的奇数倍数 pDCMoveTo(m + 40, 303)。 pDCLineTo(m + 40, 310)。 } } // 绘制 X轴箭头 pDCMoveTo(335,295)。 pDCLineTo(340,300)。 pDCLineTo(335,305)。 // 绘制 Y轴箭头 pDCMoveTo(40,40)。 pDCLineTo(35,45)。 pDCMoveTo(40,40)。 pDCLineTo(45,45)。 LONG lMaxCount = 0。 // 直方图中最大计数值 // 计算最大计数值 for (m = 0。 m = 255。 m ++) { // 判断是否大于当前最大值 if (Ha[1][1][m] lMaxCount) { // 更新最大值 lMaxCount = Ha[1][1][m]。 } } pDCTextOut(10, 150, hue)。 CPen* pPenBlue = new CPen。 // 声名画笔对象 pPenBlueCreatePen(PS_SOLID, 1, RGB(0,0,255))。 // 创建蓝色画笔(用于绘制直方图) pDCSelectObject(pPenBlue)。 // 选入蓝色画笔 // 判断是否存在计数值 if(lMaxCount 0){ // 绘制直方图 for (m =。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。