c语言绘制图像直方图 | 您所在的位置:网站首页 › c语言画直方图 › c语言绘制图像直方图 |
#include #include #include "cv.h" #include "highgui.h" #include #include char filename[100]; int main(int argc, char* argv[]) { cvNamedWindow("src", 1); cvNamedWindow("texture",1); cvNamedWindow("LBP-His", 1); cvNamedWindow("LBP-His-Sub", 1); IplImage *pImage=cvLoadImage("lena.jpg",-1);// IplImage* m_cvImage = cvCreateImage(cvGetSize(pImage), 8, 1);//灰度图像 IplImage* m_cvLBPImage = cvCreateImage(cvGetSize(pImage), 8, 1);//LBP值图像 cvShowImage("src", pImage); CvMat *histogram2= NULL; histogram2= cvCreateMat(pImage->height, pImage->width, CV_32FC1); if (pImage->nChannels == 3) { cvCvtColor(pImage,m_cvImage , CV_BGR2GRAY);//色彩空间转换(灰色空间) } cvConvert(m_cvImage, histogram2); for(int i1=0 ; i1< histogram2->rows; i1++) { histogram2->data.fl[i1] = 0.0;///一次一行 } int center=0; int center_lbp=0; //计算每个点的LBP值,生成纹理图 for (int row=1; row < m_cvImage->height-1; row++) for (int col=1; col < m_cvImage->width-1; col++) { center = (int)cvGetReal2D(m_cvImage, row, col); center_lbp = 0; if (center >= cvGetReal2D(m_cvImage, row-1, col-1)) { center_lbp += 1;//从左上开始 顺时针 } if (center >= cvGetReal2D(m_cvImage, row-1, col)) { center_lbp += 2; } if (center >= cvGetReal2D(m_cvImage, row-1, col+1)) { center_lbp += 4; } if (center >= cvGetReal2D(m_cvImage, row, col-1)) { center_lbp += 8; } if (center >= cvGetReal2D(m_cvImage, row, col+1)) { center_lbp += 16; } if (center >= cvGetReal2D(m_cvImage, row+1, col-1)) { center_lbp += 32; } if (center >= cvGetReal2D(m_cvImage, row+1, col)) { center_lbp += 64; } if (center >= cvGetReal2D(m_cvImage, row+1, col+1)) { center_lbp += 128; } cvSetReal2D(m_cvLBPImage, row, col, center_lbp); } 显示整幅图像的纹理图 cvShowImage("texture", m_cvLBPImage); 计算显示整幅图像的纹理直方图 int lbp_bins = 100;块数 float lbp_ranges[] = { 0, 255 };///上下界 float* pb_ranges = lbp_ranges;///格式转换 CvHistogram* hist_lbp = cvCreateHist( 1, &lbp_bins, CV_HIST_ARRAY, &pb_ranges, 1 );//生成直方图 // int dims, int* sizes, int type, float** ranges=NULL, int uniform=1 ); //uniform归一化标识,如果不为0,则ranges[i]是包含两个元素的范围数组,包括直方图第i维的上界和下界。 //在第i维上的整个区域 [lower,upper]被分割成 dims[i] (dims[i]表示直方图第i维的块数)个相等的块 cvCalcHist( &m_cvLBPImage, hist_lbp, 0, 0 );//生成直方图 cvNormalizeHist(hist_lbp,1.0);///直方图归一化 // 获取直方图统计的最大值,用于动态显示直方图 float max_value; cvGetMinMaxHistValue(hist_lbp, 0, &max_value, 0, 0 ); // 设置直方图显示图像 int scale = 2; int hist_height = 100; int height =hist_height;//240; int width = (lbp_bins*scale);///6 IplImage* hist_img = cvCreateImage( cvSize(width,height), 8, 1 ); cvZero( hist_img ); //用来获取bin的灰度值,作为显示的一个参数 IplImage * gray_color = cvCreateImage(cvSize(1,1),8,1); //将直方图转换为图像显示 for(int i=0;i { float r_bin_val = cvQueryHistValue_1D(hist_lbp,i);///获取bin的值 int r_intensity = cvRound(r_bin_val*hist_height/max_value);四舍五入 返回正整数 // 获得当前直方图代表的颜色,填充到图像中 cvSet2D(gray_color,0,0,cvScalar(i*255.f / lbp_bins,0,0,0)); // 转换格式 CvScalar color = cvGet2D(gray_color,0,0); //画矩形并填充颜色-灰度值 cvRectangle( hist_img, cvPoint(i*scale,hist_height-1),//再两个点之间自动选择右上右下 cvPoint((i+1)*scale - 1, hist_height-r_intensity),// color//CV_RGB(100,100,100) ); } cvShowImage("LBP-His", hist_img); //计算每个像素的纹理直方图 R=2 P=6 K=2 IplImage* gray_sub_img[2];子纹理图 320*240 宽*高 CvHistogram* hist_sub_lbp[320][240][2];///子纹理直方图 int lbp_sub_bins = 100;块数 float lbp_sub_ranges[] = { 0, 255 };///上下界 float* pb_sub_ranges = lbp_sub_ranges;///格式转换 ///生成子纹理图直方图 for ( row=1; row < m_cvImage->height-1; row++) for (int col=1; col < m_cvImage->width-1; col++) { gray_sub_img[0]= cvCreateImage( cvSize(3,3), 8, 1 );申请空间,创建子纹理图 gray_sub_img[1]= cvCreateImage( cvSize(3,3), 8, 1 );申请空间,创建子纹理图 hist_sub_lbp[row][col][0]= cvCreateHist( 1, &lbp_sub_bins, CV_HIST_ARRAY, &pb_sub_ranges, 1 );///申请空间,创建子直方图 hist_sub_lbp[row][col][1]= cvCreateHist( 1, &lbp_sub_bins, CV_HIST_ARRAY, &pb_sub_ranges, 1 );///申请空间,创建子直方图 cvZero( gray_sub_img[0]);cvZero( gray_sub_img[1]); ///第一个直方图 int pixel_data;//=(int)cvGetReal2D(m_cvLBPImage, row, col); //cvSetReal2D(gray_sub_img[0],1,1,pixel_data); pixel_data=(int)cvGetReal2D(m_cvImage, row-1, col-1); cvSetReal2D(gray_sub_img[0],0,0,pixel_data); pixel_data=(int)cvGetReal2D(m_cvImage, row-1, col); cvSetReal2D(gray_sub_img[0],0,1,pixel_data); pixel_data=(int)cvGetReal2D(m_cvImage, row-1, col+1); cvSetReal2D(gray_sub_img[0],0,2,pixel_data); pixel_data=(int)cvGetReal2D(m_cvImage, row, col-1); cvSetReal2D(gray_sub_img[0],1,0,pixel_data); pixel_data=(int)cvGetReal2D(m_cvImage, row, col+1); cvSetReal2D(gray_sub_img[0],1,2,pixel_data); pixel_data=(int)cvGetReal2D(m_cvImage, row+1, col); cvSetReal2D(gray_sub_img[0],2,1,pixel_data); pixel_data=(int)cvGetReal2D(m_cvImage, row+1, col+1); cvSetReal2D(gray_sub_img[0],2,2,pixel_data); //第二个直方图 pixel_data=(int)cvGetReal2D(m_cvLBPImage, row-1, col); cvSetReal2D(gray_sub_img[1],0,1,pixel_data); pixel_data=(int)cvGetReal2D(m_cvImage, row-1, col+1); cvSetReal2D(gray_sub_img[1],0,2,pixel_data); pixel_data=(int)cvGetReal2D(m_cvImage, row, col-1); cvSetReal2D(gray_sub_img[1],1,0,pixel_data); pixel_data=(int)cvGetReal2D(m_cvImage, row, col+1); cvSetReal2D(gray_sub_img[1],1,2,pixel_data); pixel_data=(int)cvGetReal2D(m_cvImage, row+1, col-1); cvSetReal2D(gray_sub_img[1],2,0,pixel_data); pixel_data=(int)cvGetReal2D(m_cvImage, row+1, col); cvSetReal2D(gray_sub_img[1],2,1,pixel_data); cvCalcHist( &gray_sub_img[0], hist_sub_lbp[row][col][0], 0, 0 );//生成直方图 cvCalcHist( &gray_sub_img[1], hist_sub_lbp[row][col][1], 0, 0 );//生成直方图 cvNormalizeHist(hist_sub_lbp[row][col][0],1.0);///直方图归一化 cvNormalizeHist(hist_sub_lbp[row][col][1],1.0);///直方图归一化 } //显示子纹理图直方图 // 设置直方图显示图像参数 int sub_scale = 3; hist_height = 100; height =hist_height;//240; width = (lbp_sub_bins*scale);///6 IplImage* hist_sub_img = cvCreateImage( cvSize(width,height), 8, 1 ); cvZero( hist_sub_img ); //用来获取bin的灰度值,作为显示的一个参数 IplImage * gray_sub_color = cvCreateImage(cvSize(1,1),8,1); //将直方图转换为图像显示 // 获取直方图统计的最大值,用于动态显示直方图 float max_sub_value; cvGetMinMaxHistValue(hist_sub_lbp[200][123][0], 0, &max_sub_value, 0, 0 ); for(i=0;i { float r_bin_val = cvQueryHistValue_1D(hist_sub_lbp[200][123][0],i);///获取bin的值 int r_intensity = cvRound(r_bin_val*hist_height/max_sub_value);四舍五入 返回正整数 // 获得当前直方图代表的颜色,填充到图像中 cvSet2D(gray_sub_color,0,0,cvScalar(i*255.f / lbp_sub_bins,0,0,0)); // 转换格式 CvScalar color = cvGet2D(gray_sub_color,0,0); //画矩形并填充颜色-灰度值 cvRectangle( hist_sub_img, cvPoint(i*sub_scale,hist_height-1),//再两个点之间自动选择左上右下 cvPoint((i+1)*sub_scale - 1, hist_height-r_intensity),// color//CV_RGB(100,100,100) ); } cvShowImage("LBP-His-Sub", hist_sub_img); cvWaitKey(0); 释放申请的空间 cvReleaseImage(&gray_sub_img[0]); cvReleaseImage(&gray_sub_img[1]); for ( row=1; row < m_cvImage->height-1; row++) for (int col=1; col < m_cvImage->width-1; col++) { cvReleaseHist(&hist_sub_lbp[row][col][0]); cvReleaseHist(&hist_sub_lbp[row][col][1]); } 释放申请的空间 cvReleaseImage(&m_cvLBPImage); cvReleaseImage(&m_cvImage); cvReleaseImage(&pImage); cvReleaseHist(&hist_lbp); return 0; } //感谢: http://www.cnblogs.com/slysky/archive/2011/10/13/2210745.html |
CopyRight 2018-2019 实验室设备网 版权所有 |