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++寫一個基於直方圖的鏡頭分割程序
自己努力寫吧,我最近也要做這個...鏡頭分割方法很多,情況多,什麼突變,漸變,麻煩得很