【OpenCV】直方图——一维

来源:互联网 发布:淘宝 河北邢台 羊绒 编辑:程序博客网 时间:2024/05/21 06:49

关于直方图的基本概念坛子里介绍的很多,能用代码表示尽量不多话!

int main(){IplImage* src = cvLoadImage("J:\\baboon.jpg", CV_LOAD_IMAGE_COLOR);//加载原始图像,路径根据实际情况替换IplImage* gray_plan = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);//创建单通道的灰度图像对象IplImage* b_plan = cvCreateImage(cvGetSize(src), 8, 1);//创建蓝色通道的图像对象IplImage* g_plan = cvCreateImage(cvGetSize(src), 8, 1);//创建绿色通道的灰度图像对象IplImage* r_plan = cvCreateImage(cvGetSize(src), 8, 1);//创建红色通道的灰度图像对象IplImage* ept_plan = cvCreateImage(cvGetSize(src), 8, 1);//创建单通道的“空白”图像对象,用来合成RGB3通道图像对象cvZero(ept_plan);//将图像所有通道所有元素都设置为0,否则在用cvMerge合并图像时,得到的结果不是“正色”。感兴趣可以自己cvShowImage ept_plan看看什么样子。cvCvtColor(src, gray_plan, CV_BGR2GRAY);//将原始图像(BGR)转换成灰度图像IplImage* bImg = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);//创建3通道图像IplImage* gImg = cvCreateImage(cvGetSize(src), 8, 3);IplImage* rImg = cvCreateImage(cvGetSize(src), 8, 3);cvSplit(src, b_plan, g_plan, r_plan, 0);//将原始图像分离成B、G、R 3个单通道的图像cvMerge(b_plan, ept_plan, ept_plan, 0, bImg);//合并3通道蓝色图像cvMerge(ept_plan, g_plan, ept_plan, 0, gImg);cvMerge(ept_plan, ept_plan, r_plan, 0, rImg);cvNamedWindow("B-Image", 1);cvShowImage("B-Image", bImg);cvNamedWindow("G-Image", 1);cvShowImage("G-Image", gImg);cvNamedWindow("R-Image", 1);cvShowImage("R-Image", rImg);int dims = 1;//直方图维数int hist_size = 256;//直方图维数的长度int hist_height = 256;//源图像尺寸 512*512//灰度直方图float range[] = {0, 255};//直方图中每个维数对应的取值范围,该值会影响直方图统计结果float* ranges[] = { range };//数组的长度与维数相同CvHistogram* gray_hist = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);//创建直方图对象cvCalcHist(&gray_plan, gray_hist, 0, 0);//计算图像直方图cvNormalizeHist(gray_hist, 1.0);//归一化直方图元素float max_value = 0;cvGetMinMaxHistValue(gray_hist, 0, &max_value, 0, 0);//获取直方图中最大值//蓝色直方图float rangeB[] = {0, 255};float* rangesB[] = {rangeB};CvHistogram* b_hist = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, rangesB, 1);cvCalcHist(&b_plan, b_hist, 0, 0);cvNormalizeHist(b_hist, 1.0);float max_value_b = 0;cvGetMinMaxHistValue(b_hist, 0, &max_value_b, 0, 0);//绿色直方图float rangeG[] = { 0, 255 };float* rangesG[] = { rangeG };CvHistogram* g_hist = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, rangesG, 1);cvCalcHist(&g_plan, g_hist, 0, 0);cvNormalizeHist(g_hist, 1.0);float max_value_g = 0;cvGetMinMaxHistValue(g_hist, 0, &max_value_g, 0, 0);//红色直方图float rangeR[] = { 0, 255 };float* rangesR[] = { rangeR };CvHistogram* r_hist = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, rangesR, 1);cvCalcHist(&r_plan, r_hist, 0, 0);cvNormalizeHist(r_hist, 1.0);float max_value_r = 0;cvGetMinMaxHistValue(r_hist, 0, &max_value_r, 0, 0);int scale = 2;//生成的直方图图像的比例向量int split = 5;//灰度、蓝色、绿色、红色 四个类型直方图在直方图图像中的间隔像素IplImage* hist_image = cvCreateImage(cvSize(hist_size * scale * 2 + split, hist_height * 2 + split), 8, 3);//创建直方图图像对象(在一张图里面显示四种直方图)cvZero(hist_image);for (int i = 0; i < hist_size; i++)//画灰度直方图{float bin_val = cvQueryHistValue_1D(gray_hist, i);int intensity = cvRound(bin_val*hist_height / max_value);//要绘制的高度cvRectangle(hist_image,//矩形画在直方图图像内cvPoint(i*scale, hist_height),//矩形对角线中的一个点cvPoint((i + 1) * scale - 1, hist_height - intensity),//矩形对角线中的另一个点CV_RGB(255, 255, 255));}for (int i = 0; i < hist_size; i++)//画蓝色通道直方图{float bin_val = cvQueryHistValue_1D(b_hist, i);int intensity = cvRound(bin_val * hist_height / max_value_b);cvRectangle(hist_image,cvPoint(i * scale + (split + hist_size * scale), hist_height),cvPoint((i + 1) * scale - 1 + (split + hist_size * scale), hist_height - intensity),CV_RGB(0, 0, 255));}for (int i = 0; i < hist_size; i++)//画绿色通道直方图{float bin_val = cvQueryHistValue_1D(g_hist, i);int intensity = cvRound(bin_val * hist_height / max_value_g);cvRectangle(hist_image,cvPoint(i * scale + split, hist_height * 2 + split),cvPoint((i + 1) * scale - 1 + split, hist_height * 2 + split - intensity),CV_RGB(0, 255, 0));}for (int i = 0; i < hist_size; i++)//画红色通道直方图{float bin_val = cvQueryHistValue_1D(r_hist, i);int intensity = cvRound(bin_val * hist_height / max_value_r);cvRectangle(hist_image,cvPoint(i * scale + (split + hist_size * scale), hist_height * 2 + split),cvPoint((i + 1) * scale - 1 + (split + hist_size * scale), hist_height * 2 + split - intensity),CV_RGB(255, 0, 0));}cvNamedWindow("Gray Source", 1);cvNamedWindow("Histogram", 1);cvShowImage("Gray Source", gray_plan);cvShowImage("Histogram", hist_image);cvWaitKey(0);cvDestroyAllWindows();cvReleaseImage(&gray_plan);cvReleaseImage(&hist_image);}

运行的结果如下:





完整工程(vs2013)源代码下载:点击下载


0 0
原创粉丝点击