本省网站建设建议微信营销的优势
本省网站建设建议,微信营销的优势,联想电脑建设网站前的市场分析,python小学生入门教程转载自http://blog.csdn.net/lu597203933/article/details/14104505 灰度直方图 这次我从最基本的直方图讲起#xff0c;一维直方图#xff0c;至于二维等高维直方图#xff0c;仅作为了解#xff0c;后面有时间另开blog详解。 1#xff1a;首先我们给出一幅图 其中的数据… 转载自http://blog.csdn.net/lu597203933/article/details/14104505 灰度直方图 这次我从最基本的直方图讲起一维直方图至于二维等高维直方图仅作为了解后面有时间另开blog详解。 1首先我们给出一幅图 其中的数据假设对应一副灰度图片的灰度值则直方图的作用就是画出在bin范围内取值的个数如图左边的直方图---相当于我们word中的柱状图。 2在opencv中直方图的结构为: typedef struct CvHistogram { int type; // 不用管 CvArr* bins;存放直方图在每一维上直方柱的具体数据由于存在多维直方图。如果是一维直方图那么bins就是一个一维的矩阵如果是二维直方图那么bins就是一个二维的矩阵等等。 float thresh[CV_MAX_DIM][2]; /* 直方柱的划分 是统一划分的即均等划分的 */ float** thresh2; /*不均等划分可以自动设定每一个直方柱的取值范围。之所以是二级指针每一个柱的取值范围用一级指针表示又存在多个直方柱所以需要二级指针才能表示。每一个不在指定范围的值会被忽略掉。*/ CvMatND mat; /* 存放直方图的数据 */ } 3直方图的创建: CvHistogram* cvCreateHist( int dims, int* sizes, int type, float** rangesNULL, int uniform1); 其中: dims表示直方图的维度 sizes每一维上直方柱(bin)的数据 ----- 创建多大的矩阵 如一维则size[0] 256 二维:则size[0]256size[1] 256;; type ---- 创建一个什么样的矩阵 直方图存储数据的方式: CV_HIST_ARRAY意味着直方图数据表示为多维密集数组CvMatND; CV_HIST_TREE 意味着直方图数据表示为多维稀疏数组CvSparseMat.---- 大于0才开设相应的空间存储它高维的必选它 Ranges: 直方图在每一维度上的范围。 如果是一维则代码为: Floatrange[] {0,255}; Float*ranges[]{range}; 如果是二维则代码为: Floatb_range[] {0,255}; Floatg_range[] {0,255}; Float*ranges[] {b_range, g_range}; uniform 该值为0时表示bin的范围是程序员自由设定的。当该值为非零时表示bin的划分是均等划分。
4创建一个直方图后避免里面存在一些随机值我们可以将其清除cvClearHist 代码: cvClearHist(hist);5计算图像的直方图 cvCalcHist 代码:cvCalcHist(imgBlue, hist, 0, 0);6将得到的直方图画出来: 其中用到了函数 cvGetMinMaxHistVaule, cvQueryHistValue_1D, cvFillConvexPoly.[cpp] view plaincopyprint?IplImage *DrawHistogram(CvHistogram*hist, float scaleX 1, float scaleY 1){ // 画直方图 float histMax 0; cvGetMinMaxHistValue(hist, 0 , histMax, 0, 0); // 取得直方图中的最值 IplImage *imgHist cvCreateImage(cvSize(256 * scaleX, 64*scaleY), 8, 1); cvZero(imgHist); 清空随机值 for(int i 0; i 255; i) { float histValue cvQueryHistValue_1D(hist, i); // 取得直方图中的i值 float nextValue cvQueryHistValue_1D(hist, i1); int numPt 5; CvPoint pt[5]; pt[0] cvPoint(i*scaleX, 64*scaleY); pt[1] cvPoint((i1)*scaleX, 64*scaleY); pt[2] cvPoint((i1)*scaleX, (1 -(nextValue/histMax))* 64 * scaleY); pt[3] cvPoint((i1)*scaleX, (1 -(histValue/histMax))* 64 * scaleY); pt[4] cvPoint(i*scaleX, 64*scaleY); cvFillConvexPoly(imgHist, pt, numPt, cvScalarAll(255)); } return imgHist; }
总结以上给出得到直方图的主要步骤直方图的创建—计算图像的直方图—画出直方图。以下给出完整的代码及运行的结果[cpp] view plaincopyprint?#include iostream #include cv.h #include highgui.h #include cxcore.h using namespace std; IplImage *DrawHistogram(CvHistogram*hist, float scaleX 1, float scaleY 1){ // 画直方图 float histMax 0; cvGetMinMaxHistValue(hist, 0 , histMax, 0, 0); // 取得直方图中的最值 IplImage *imgHist cvCreateImage(cvSize(256 * scaleX, 64*scaleY), 8, 1); cvZero(imgHist); 清空随机值 for(int i 0; i 255; i) { float histValue cvQueryHistValue_1D(hist, i); // 取得直方图中的i值 float nextValue cvQueryHistValue_1D(hist, i1); int numPt 5; CvPoint pt[5]; pt[0] cvPoint(i*scaleX, 64*scaleY); pt[1] cvPoint((i1)*scaleX, 64*scaleY); pt[2] cvPoint((i1)*scaleX, (1 -(nextValue/histMax))* 64 * scaleY); pt[3] cvPoint((i1)*scaleX, (1 -(histValue/histMax))* 64 * scaleY); pt[4] cvPoint(i*scaleX, 64*scaleY); cvFillConvexPoly(imgHist, pt, numPt, cvScalarAll(255)); } return imgHist; } int main() { IplImage *img cvLoadImage(F:\\tongtong.jpg,1); if(!img){ cout No data img endl; } int dims 1; int sizes 256; float range[] {0,255}; float*ranges[]{range}; CvHistogram *hist cvCreateHist(dims, sizes, CV_HIST_ARRAY, ranges, 1); cvClearHist(hist); //清除直方图里面的随机值 IplImage *imgBlue cvCreateImage(cvGetSize(img), 8, 1); IplImage *imgGreen cvCreateImage(cvGetSize(img), 8, 1); IplImage *imgRed cvCreateImage(cvGetSize(img), 8, 1); cvSplit(img, imgBlue, imgGreen, imgRed, NULL); //将多通道图像分解 cvCalcHist(imgBlue, hist, 0, 0); // 计算图像的直方图 IplImage *histBlue DrawHistogram(hist); // 将直方图中的数据画出来 cvClearHist(hist); cvCalcHist(imgGreen, hist, 0, 0); IplImage *histGreen DrawHistogram(hist); cvClearHist(hist); cvCalcHist(imgRed, hist, 0, 0); IplImage *histRed DrawHistogram(hist); cvClearHist(hist); cvNamedWindow(show,0); cvNamedWindow(B, 0); cvNamedWindow(G, 0); cvNamedWindow(R, 0); cvShowImage(show,img); cvShowImage(B,histBlue); cvShowImage(G,histGreen); cvShowImage(R, histRed); cvWaitKey(0); cvReleaseImage(img); cvDestroyWindow(show); cvReleaseImage(histBlue); cvDestroyWindow(B); cvReleaseImage(histGreen); cvDestroyWindow(G); cvReleaseImage(histRed); cvDestroyWindow(R); return 0; }
运行结果/*这部分是后面添加的没有另开blog进行讲解了其实道理一样的*/下面简单介绍二维的情况要统计一个二维直方图二维坐标统计值这就是三维的结构就会变成一个3D图像其实不然。我们的处理技巧是将二维坐标分别作为x和y轴而统计值作为颜色值。如代码cvRectangle(imgHist, cvPoint(i*scaleX, j*scaleY), cvPoint((i1)*scaleX- 1, (j1)*scaleY - 1), CV_RGB(intensity,intensity,intensity), CV_FILLED); i和j分别代表坐标intensity即为统计值。Code[cpp] view plaincopyprint?IplImage *DrawHistogram2(CvHistogram*hist, float scaleX 1, float scaleY 1){ // 画直方图 float histMax 0; cvGetMinMaxHistValue(hist, 0 , histMax, 0, 0); // 取得直方图中的最值 IplImage *imgHist cvCreateImage(cvSize(256 * scaleX, 256*scaleY), 8, 3); cvZero(imgHist); 清空随机值 for(int i 0; i 255; i) { for(int j 0; j 255; j) { float histValue cvQueryHistValue_2D(hist, i, j); // 取得直方图中的i值 int intensity cvRound(histValue * 255 /histMax); float nextValue cvQueryHistValue_1D(hist, i1); int numPt 5; CvPoint pt[5]; pt[0] cvPoint(i*scaleX, j*scaleY); pt[1] cvPoint(i*scaleX, (j1)*scaleY - 1); pt[2] cvPoint((i1)*scaleX - 1, (j1)*scaleY - 1); pt[3] cvPoint((i1)*scaleX - 1, j*scaleY); pt[4] cvPoint(i*scaleX, j*scaleY); cvFillConvexPoly(imgHist, pt, numPt, cvScalarAll(intensity)); //cvRectangle(imgHist, cvPoint(i*scaleX, j*scaleY), cvPoint((i1)*scaleX - 1, (j1)*scaleY - 1), CV_RGB(intensity,intensity,intensity), CV_FILLED); // (i1)*scaleX - 1代表下一个坐标点(i1)*scaleX的最后一点 } } return imgHist; } int main() { IplImage *img cvLoadImage(F:\\baboon.jpg,1); if(!img){ cout No data img endl; } int dims 2; int sizes[2] {256, 256}; // 创建多大的矩阵 float b_range[] {0,255}; // 矩阵的取值范围 float g_range[] {0, 255}; float*ranges[]{b_range, g_range}; CvHistogram *hist cvCreateHist(dims, sizes, CV_HIST_ARRAY, ranges, 1); cvClearHist(hist); //清除直方图里面的随机值 IplImage *imgBlue cvCreateImage(cvGetSize(img), 8, 1); IplImage *imgGreen cvCreateImage(cvGetSize(img), 8, 1); IplImage *imgRed cvCreateImage(cvGetSize(img), 8, 1); IplImage *planes[] {imgBlue, imgGreen}; // 二维是这样处理的******** cvSplit(img, imgBlue, imgGreen, imgRed, NULL); //将多通道图像分解 cvCalcHist(planes,hist, 0, 0); IplImage *bg_image DrawHistogram2(hist); cvNamedWindow(show,0); cvShowImage(show,img); cvNamedWindow(bg_image); cvShowImage(bg_image,bg_image); cvWaitKey(0); cvReleaseImage(img); cvReleaseImage(bg_image); cvDestroyWindow(show); cvDestroyWindow(bg_image); return 0; } Result
作者小村长 出处http://blog.csdn.net/lu597203933 欢迎转载或分享但请务必声明文章出处。 新浪微博小村长zack, 欢迎交流
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/89452.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!