導航:首頁 > 動漫圖片 > opencv怎麼把圖片分成直方圖

opencv怎麼把圖片分成直方圖

發布時間:2022-02-15 17:08:49

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++寫一個基於直方圖的鏡頭分割程序

自己努力寫吧,我最近也要做這個...鏡頭分割方法很多,情況多,什麼突變,漸變,麻煩得很

閱讀全文

與opencv怎麼把圖片分成直方圖相關的資料

熱點內容
圖片團競用黑色衣服變成造句 瀏覽:760
怎麼用word加圖片標尺 瀏覽:76
怎麼下載攜程的圖片 瀏覽:935
最近火的男生圖片 瀏覽:810
word圖片如何調整傾斜 瀏覽:751
新娘頭飾圖片簡單又漂亮 瀏覽:197
個性的微信女生頭像圖片 瀏覽:795
word怎樣打圖片文檔 瀏覽:618
寸頭戰士發型圖片大全 瀏覽:265
素描游戲動漫人物男生圖片 瀏覽:414
情侶牽手高清圖片 瀏覽:734
2016發型顏色大全圖片大全 瀏覽:24
少兒拳擊圖片霸氣女孩 瀏覽:803
冷暖風扇圖片價格 瀏覽:886
適合長臉正反面男生頭型的圖片 瀏覽:964
朋友圈配的文字圖片 瀏覽:557
ps怎麼把圖片多邊形 瀏覽:228
可愛的寶寶的圖片 瀏覽:388
女孩子吃魷魚過敏圖片大全 瀏覽:669
天秤座圖片動漫少女 瀏覽:879