opencv二维直方图

1、H-S直方图:

#include<highgui.h>
#include<cv.h>
//宏定义
#define cvQueryHistValue_2D(hist,idx0,idx1)\
    cvGetReal2D((hist)->bins,(idx0),(idx1))

using namespace std;
using namespace cv;
int main()
{
    IplImage* image = cvLoadImage("E:\\project\\images\\baboon.jpg");
    cvNamedWindow("image");
    cvShowImage("image", image);
    IplImage* hsv = cvCreateImage(cvGetSize(image), 8, 3);
    cvCvtColor(image, hsv, CV_BGR2HSV);
    IplImage* h_image = cvCreateImage(cvGetSize(image), 8, 1);
    IplImage* s_image = cvCreateImage(cvGetSize(image), 8, 1);
    IplImage* v_image = cvCreateImage(cvGetSize(image), 8, 1);
    //拆分为单通道图像
    cvSplit(hsv, h_image, s_image, v_image, 0);

    IplImage* images[] = { h_image, s_image };

    //*****************计算直方图********************
    //准备参数
    int h_size = 256;
    int s_size = 180;
    int size[] = { h_size, s_size };
    float h_range[] = { 0, 256 };
    float s_range[] = { 0, 180 };
    float* ranges[] = { h_range, s_range };

    CvHistogram* hist = cvCreateHist(2, size, CV_HIST_ARRAY, ranges, 1);
    cvCalcHist(images, hist, 0, 0);

    //绘制图像

    int scale = 2;
    IplImage* hist_image = cvCreateImage(cvGetSize(image), 8, 3);
    float hist_max = 0;
    cvGetMinMaxHistValue(hist, 0, &hist_max, 0, 0);
    for (int i = 0; i < h_size; i++)
    {
        for (int j = 0; j < s_size; j++)
        {
            float bin_value = cvQueryHistValue_2D(hist, i,j);
            int intensity = cvRound(bin_value * 256 / hist_max);
            cvRectangle(hist_image,
                CvPoint(i*scale, j*scale),
                CvPoint((i+1)*scale-1,(j+1)*scale-1),
                CV_RGB(intensity,intensity,intensity),
                CV_FILLED);
        }
    }

    cvNamedWindow("H-S Histogram");
    cvShowImage("H-S Histogram", hist_image);
    cvWaitKey(0);
        return 0;
}

结果展示:
这里写图片描述

2、B-G直方图:

#include<highgui.h>
#include<cv.h>
//宏定义
#define cvQueryHistValue_2D(hist,idx0,idx1)\
    cvGetReal2D((hist)->bins,(idx0),(idx1))

using namespace std;
using namespace cv;
int main()
{
    //二维R-G直方图
    IplImage* image = cvLoadImage("E:\\project\\images\\baboon.jpg");
    cvNamedWindow("image");
    cvShowImage("image", image);


    IplImage* imgBlue = cvCreateImage(cvGetSize(image), 8, 1);
    IplImage* imgGreen = cvCreateImage(cvGetSize(image), 8, 1);
    IplImage* imgRed = cvCreateImage(cvGetSize(image), 8, 1);
    cvSplit(image, imgBlue, imgGreen, imgRed, 0);
    IplImage* images[] = { imgBlue,imgGreen };

    int dims = 2;
    int b_size = 256;
    int g_size = 256;
    int sizes[] = { b_size, g_size };
    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);
    cvCalcHist(images,hist,0,0);

    //绘制图像
    //初始画布
    int scale = 2;
    IplImage* hist_image = cvCreateImage(cvGetSize(image), 8, 3);
    cvZero(hist_image);

    float hist_max = 0;
    cvGetMinMaxHistValue(hist, 0, &hist_max, 0, 0);

    for (int i = 0; i < b_size; i++)
    {
        for (int j = 0; j < g_size; j++)
        {
            float bin_value = cvQueryHistValue_2D(hist, i, j);
            int intensity = cvRound(bin_value * 255 / hist_max);
            cvRectangle(hist_image,
                CvPoint(i*scale, j*scale),
                CvPoint((i + 1)*scale - 1, (j + 1)*scale - 1),
                CV_RGB(intensity, intensity, intensity),
                CV_FILLED);
        }
    }

    cvNamedWindow("B-G Histogram");
    cvShowImage("B-G Histogram", hist_image);
    cvWaitKey(0);
    return 0;
}

结果显示:
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值