1. opencv的直方图问题
可以生成 矩阵的直方图。
用法跟图片一样。
应为图片在OpenCV中,就是使用矩阵来存储的。
在OpenCV2.l 之后,已经彻底的从IplImage变成了 Mat 矩阵对象。
以下是使用 图片生成直方图的例子。
把imread函数的地方改成 对函数
//使用 OpenCV 2.1
#include <cv.h>
#include <highgui.h>
using namespace cv;
int main( int argc, char** argv )
{
    Mat hsv;
// 初始化
在此处加入代码, 初始化 hsv对象。
// 初始化 
    // let's quantize the hue to 30 levels
    // and the saturation to 32 levels
    int hbins = 30, sbins = 32;
    int histSize[] = {hbins, sbins};
    // hue varies from 0 to 179, see cvtColor
    float hranges[] = { 0, 180 };
    // saturation varies from 0 (black-gray-white) to
    // 255 (pure spectrum color)
    float sranges[] = { 0, 256 };
    const float* ranges[] = { hranges, sranges };
    MatND hist;
    // we compute the histogram from the 0-th and 1-st channels
    int channels[] = {0, 1};
    calcHist( &hsv, 1, channels, Mat(), // do not use mask
        hist, 2, histSize, ranges,
        true, // the histogram is uniform
        false );
    double maxVal=0;
    minMaxLoc(hist, 0, &maxVal, 0, 0);
    int scale = 10;
    Mat histImg = Mat::zeros(sbins*scale, hbins*10, CV_8UC3);
    for( int h = 0; h < hbins; h++ )
        for( int s = 0; s < sbins; s++ )
        {
            float binVal = hist.at<float>(h, s);
            int intensity = cvRound(binVal*255/maxValue);
            cvRectangle( histImg, Point(h*scale, s*scale),
                         Point( (h+1)*scale - 1, (s+1)*scale - 1),
                         Scalar::all(intensity),
                         CV_FILLED );
        }
    namedWindow( "Source", 1 );
    imshow( "Source", src );
    namedWindow( "H-S Histogram", 1 );
    imshow( "H-S Histogram", histImg );
    waitKey();
}
2. opencv python 怎么建立直方图
Windows环境下把opencv中python的py文件复制到python安装位置的package 里。linux下载opencv-python
3. opencv 中rgb图像的直方图怎么画
看到一个别人的方法。 建议转到HSV颜色空间,opencv 的H范围是0~180,红色的H范围大概是(0~8)∪(160,180) S是饱和度,一般是大于一个值,S过低就是灰色(参考值S>80), V是亮度,过低就是黑色,过高就是白色(参考值220>V>50)。
4. opencv如何实现对图像分块提取颜色直方图
颜色直方图是在许多图像检索系统中被广泛采用的颜色特征。它所描述的是不同色彩在整幅图像中所占的比例,而并不关心每种色彩所处的空间位置,即无法描述图像中的对象或物体。颜色直方图特别适于描述那些难以进行自动分割的图像。
OpenCV对颜色直方图进行统计的代码如下所示,在图像检索,镜头分割等领域使用的还是比较多的。
#include<cv.h>
#include<highgui.h>
#include<iostream>
usingnamespacestd;intmain(intargc,char**argv)
{
IplImage*src=cvLoadImage("F:\test3.jpg");
IplImage*hsv=cvCreateImage(cvGetSize(src),8,3);
IplImage*h_plane=cvCreateImage(cvGetSize(src),8,1);
IplImage*s_plane=cvCreateImage(cvGetSize(src),8,1);
IplImage*v_plane=cvCreateImage(cvGetSize(src),8,1);
IplImage*planes[]={h_plane,s_plane};
/**H分量划分为16个等级,S分量划分为8个等级*/
inth_bins=16,s_bins=8;
inthist_size[]={h_bins,s_bins};
/**H分量的变化范围*/
floath_ranges[]={0,180};
/**S分量的变化范围*/
floats_ranges[]={0,255};
float*ranges[]={h_ranges,s_ranges};
/**输入图像转换到HSV颜色空间*/
cvCvtColor(src,hsv,CV_BGR2HSV);
cvCvtPixToPlane(hsv,h_plane,s_plane,v_plane,0);
/**创建直方图,二维,每个维度上均分*/
CvHistogram*hist=cvCreateHist(2,hist_size,CV_HIST_ARRAY,ranges,1);
/**根据H,S两个平面数据统计直方图*/
cvCalcHist(planes,hist,0,0);
/**获取直方图统计的最大值,用于动态显示直方图*/
floatmax_value;
cvGetMinMaxHistValue(hist,0,&max_value,0,0);
/**设置直方图显示图像*/
intheight=240;
intwidth=(h_bins*s_bins*6);
IplImage*hist_img=cvCreateImage(cvSize(width,height),8,3);
cvZero(hist_img);
/**用来进行HSV到RGB颜色转换的临时单位图像*/
IplImage*hsv_color=cvCreateImage(cvSize(1,1),8,3);
IplImage*rgb_color=cvCreateImage(cvSize(1,1),8,3);
intbin_w=width/(h_bins*s_bins);
for(inth=0;h<h_bins;h++)
{
for(ints=0;s<s_bins;s++)
{
inti=h*s_bins+s;
/**获得直方图中的统计次数,计算显示在图像中的高度*/
floatbin_val=cvQueryHistValue_2D(hist,h,s);
intintensity=cvRound(bin_val*height/max_value);
/**获得当前直方图代表的颜色,转换成RGB用于绘制*/
cvSet2D(hsv_color,0,0,cvScalar(h*180.f/h_bins,s*255.f/s_bins,255,0));
cvCvtColor(hsv_color,rgb_color,CV_HSV2BGR);
CvScalarcolor=cvGet2D(rgb_color,0,0);
cvRectangle(hist_img,cvPoint(i*bin_w,height),
cvPoint((i+1)*bin_w,height-intensity),
color,-1,8,0);
}
}
cvNamedWindow("Source",1);
cvShowImage("Source",src);
cvNamedWindow("H-SHistogram",1);
cvShowImage("H-SHistogram",hist_img);
cvWaitKey(0);
}
5. 如何利用opencv创建空间直方图
//rgb直方图
void CalcHistRgb()
{
    IplImage* img_source;
 
    if (img_source = cvLoadImage("../data/1.bmp",1))
    {
        IplImage* RedChannel = cvCreateImage( cvGetSize(img_source), 8, 1);
        IplImage* GreenChannel = cvCreateImage( cvGetSize(img_source), 8, 1);
        IplImage* BlueChannel = cvCreateImage( cvGetSize(img_source), 8, 1);
        IplImage* alphaChannel = cvCreateImage( cvGetSize(img_source), 8, 1);
        IplImage* gray_plane = cvCreateImage(cvGetSize(img_source),8,1);
//分割为单通道图像
        cvCvtPixToPlane(img_source,BlueChannel,GreenChannel,RedChannel,0);
        // 显示图像
        cvNamedWindow( "RedChannel", 1 );
        cvNamedWindow( "GreenChannel", 1 );
        cvNamedWindow( "BlueChannel", 1 );
        cvNamedWindow( "lphaChannel", 1 );
         
        cvShowImage( "RedChannel", RedChannel );
        cvShowImage( "GreenChannel", GreenChannel );
        cvShowImage( "BlueChannel", BlueChannel );
        cvShowImage( "lphaChannel", alphaChannel );
cvCvtColor(img_source,gray_plane,CV_BGR2GRAY);
        cvNamedWindow("GrayPlane",1);
        cvShowImage("GrayPlane",gray_plane);
        //OpenCV中不管是Windows中Load的还是摄像头取得的都是BGR顺序排列的
 
        //然后为这四幅图创建对应的直方图结构。
        int hist_size = 200;
 
        int hist_height = 200;
 
        float range[] = {0,255};
 
        float* ranges[]={range};
 
        CvHistogram* r_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);
 
        CvHistogram* g_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);
 
        CvHistogram* b_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);
 
        CvHistogram* gray_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);
 
        //接下来计算直方图,创建用于显示直方图的图像,略去了一部分重复代码,以下也是
         
        cvCalcHist(&RedChannel,r_hist,0,0);
        cvCalcHist(&GreenChannel,g_hist,0,0);
        cvCalcHist(&BlueChannel,b_hist,0,0);
        cvCalcHist(&gray_plane,gray_hist,0,0);
        cvNormalizeHist(gray_hist,1.0);
        cvNormalizeHist(r_hist,1.0);
        cvNormalizeHist(g_hist,1.0);
        cvNormalizeHist(b_hist,1.0);
 
        int scale = 2;
 
        IplImage* hist_image = cvCreateImage(cvSize(hist_size*scale,hist_height*4),8,3);
 
        cvZero(hist_image);
 
        //然后开始显示,这里对直方图进行了标准化处理,不然的话无法观察到明显的变化。
 
        float r_max_value = 0;
        float g_max_value = 0;
        float b_max_value = 0;
        float gray_max_value = 0;
        cvGetMinMaxHistValue(r_hist, 0,&r_max_value,0,0);
        cvGetMinMaxHistValue(g_hist, 0,&g_max_value,0,0);
        cvGetMinMaxHistValue(b_hist, 0,&b_max_value,0,0);
        cvGetMinMaxHistValue(b_hist, 0,&gray_max_value,0,0);
        for(int i=0;i<hist_size;i++)
        {
 
            float r_bin_val = cvQueryHistValue_1D(r_hist,i);
 
            int r_intensity = cvRound(r_bin_val*hist_height/r_max_value);
            cvRectangle(
                hist_image,
                cvPoint(i*scale,hist_height-1),
                cvPoint((i+1)*scale - 1, hist_height - r_intensity),
                CV_RGB(255,0,0));
 
            float g_bin_val=cvQueryHistValue_1D(g_hist,i);
            int g_intensity = cvRound(g_bin_val*hist_height/g_max_value);
            cvRectangle(
                hist_image,
                cvPoint(i*scale,2*hist_height-1),
                cvPoint((i+1)*scale - 1, 2*hist_height - g_intensity),
                CV_RGB(0,255,0));
 
            float b_bin_val = cvQueryHistValue_1D(b_hist,i);
            int b_intensity = cvRound(b_bin_val*hist_height/b_max_value);
            cvRectangle(
                hist_image,
                cvPoint(i*scale,3*hist_height-1),
                cvPoint((i+1)*scale - 1, 3*hist_height - b_intensity),
                CV_RGB(0,0,255));
 
            float gray_bin_val = cvQueryHistValue_1D(gray_hist,i);
            int gray_intensity = cvRound(gray_bin_val*hist_height/gray_max_value);
            cvRectangle(
                hist_image,
                cvPoint(i*scale,4*hist_height-1),
                cvPoint((i+1)*scale - 1, 4*hist_height - gray_intensity),
                CV_RGB(100,100,100));
 
        }
         cvNamedWindow( "Source", 1 );
         cvShowImage( "Source", img_source );
 
         cvNamedWindow( "RGB_Histogram", 1 );
         cvShowImage( "RGB_Histogram", hist_image );
}
 
}
6. 怎么使用opencv将图像分成许多小块
设置ROI,移动ROI的起始坐标
7. 怎么用opencv把mat类型的数组绘制成二维直方图
//因为要计算H-S的直方图,所以需要得到一个HSV空间的图像  
    cvtColor(srcImage, hsvImage, CV_BGR2HSV);  
    imshow("【HSV空间的原图】", hsvImage);  
  
    //为计算直方图配置变量  
    //首先是需要计算的图像的通道,就是需要计算图像的哪个通道(bgr空间需要确定计算 b或g货r空间)  
    int channels[] = { 0, 1 };  
    //然后是配置输出的结果存储的 空间 ,用MatND类型来存储结果  
    MatND dstHist;  
    //接下来是直方图的每一个维度的 柱条的数目(就是将数值分组,共有多少组)  
    //如果这里写成int histSize = 256;   那么下面调用计算直方图的函数的时候,该变量需要写 &histSize  
    int histSize[] = { 30, 32 };  
    //最后是确定每个维度的取值范围,就是横坐标的总数  
    //首先得定义一个变量用来存储 单个维度的 数值的取值范围  
    float HRanges[] = { 0, 180 };  
    float SRanges[] = { 0, 256 };  
    const float *ranges[] = { HRanges, SRanges };
8. opencv中如何根据数组数据构造直方图
//因为要计算H-S的直方图,所以需要得到一个HSV空间的图像
cvtColor(srcImage, hsvImage, CV_BGR2HSV);
imshow("【HSV空间的原图】", hsvImage);
//为计算直方图配置变量
//首先是需要计算的图像的通道,就是需要计算图像的哪个通道(bgr空间需要确定计算 b或g货r空间)
int channels[] = { 0, 1 };
//然后是配置输出的结果存储的 空间 ,用MatND类型来存储结果
MatND dstHist;
//接下来是直方图的每一个维度的 柱条的数目(就是将数值分组,共有多少组)
//如果这里写成int histSize = 256;   那么下面调用计算直方图的函数的时候,该变量需要写 &histSize
int histSize[] = { 30, 32 };
//最后是确定每个维度的取值范围,就是横坐标的总数
//首先得定义一个变量用来存储 单个维度的 数值的取值范围
float HRanges[] = { 0, 180 };
float SRanges[] = { 0, 256 };
const float *ranges[] = { HRanges, SRanges };
9. 用opencv和c++写一个基于直方图的镜头分割程序
自己努力写吧,我最近也要做这个...镜头分割方法很多,情况多,什么突变,渐变,麻烦得很