Qt+OpenCV联合开发(二十四)--图像二维直方图(calcHist)

一、函数原型

calcHist函数

作用:计算一维或多维图像直方图

c++原型:

参数:

  1. images:输入图像的指针,一定是同样的深度(CV_8U or CV_32F)。且一个图像可以有多个channes。
  2. nimages:输入图像的个数
  3. channels:计算直方图的channes的数组。如果输入的图像的个数为2,第一张图像有0,1,2共三个channel,第二张图像只有0一个channel,那么输入就一共有4个通道,如果int channels[3] = {3, 0, 1},那么就表示是使用第二张图像的第一个通道和第一张图像的第0和第1个通道来算
  4. mask:掩码。跟前面说的mask一致,非0区域才会用来做直方图的计算。如果不用就表示完整计算整张图像,这时Mat()参数为空。如果要用mask,那么它必须是一个8位(CV_8U)的数组,并且它的大小的和images[i]的大小相同,值为1的点用来计算
  5. hist:计算出来的直方图
  6. dims:计算出来的直方图的维数,这里是一维的,如果想要二维可以定义一个数组,数组里有两个值
  7. histSize:在每一维上直方图的个数。简单把直方图看作一个一个的竖条的话,就是每一维上竖条的个数。
  8. ranges:用来进行统计的范围      例如:float scope[] = {100, 255};const float *rangs[1] = { scope };那么就是对100-255的范围的值进行统计。多个范围可再定义数组
  9. uniform:每一个竖条的宽度是否相等
  10. accumulate:是否累加。如果为true,在下次计算的时候不会首先清空直方图
     

二、实现效果

原始二维直方图

Qt+OpenCV联合开发(二十四)--图像二维直方图(calcHist)_第1张图片

 用applyColorMap函数绘制出不同颜色的二维直方图Qt+OpenCV联合开发(二十四)--图像二维直方图(calcHist)_第2张图片

三、代码

void test1::hist2d_drawing(Mat &image)
{
    Mat hsv,hs_hist;
    cvtColor(image,hsv,COLOR_BGR2HSV);
    int hbins = 30,sbins = 32;
    int hist_bins[] = {hbins,sbins};
    float h_range[] = {0,180};
    float s_range[] = {0,256};
    const float* hs_ranges[] = {h_range,s_range};
    int hs_channels[] = {0,1};
    calcHist(&hsv,1,hs_channels,Mat(),hs_hist,2,hist_bins,hs_ranges,true,false);
    double maxValue = 0;
    minMaxLoc(hs_hist,0,&maxValue,0,0);
    int scaleVal = 10;
    Mat hist2d_img = Mat::zeros(sbins*scaleVal,hbins*scaleVal,CV_8UC3);
    for(int h=0;h(h,s);
            int itensity = cvRound(binVal * 255 /maxValue);
            rectangle(hist2d_img,Point(h*scaleVal,s*scaleVal),
                      Point((h+1)*scaleVal-1,(s+1)*scaleVal-1),Scalar::all(itensity),-1);
        }
    }
    imshow("hist2d_drawing1", hist2d_img);

}

1、applyColorMap(hist2d_img,hist2d_img,COLORMAP_JET);可以绘制出不同颜色的二维直方图,第三个参数是不同的颜色,如下

//    COLORMAP_AUTUMN,
//    COLORMAP_BONE,
//    COLORMAP_JET,
//    COLORMAP_WINTER,
//    COLORMAP_RAINBOW,
//    COLORMAP_OCEAN,
//    COLORMAP_SUMMER,
//    COLORMAP_SPRING,
//    COLORMAP_COOL,
//    COLORMAP_HSV,
//    COLORMAP_PINK,
//    COLORMAP_HOT,

2、转到HSV空间更容易对图像进行处理

 原创不易,转载请注明出处:

Qt+OpenCV联合开发(二十四)--图像二维直方图(calcHist)

你可能感兴趣的:(C/C++,opencv,Qt实战,opencv,qt,计算机视觉)