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