基本統計直方圖計算
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
int BlueHistogramData[256]={0};
int GreenHistogramData[256]={0};
int RedHistogramData[256]={0};
int GrayLevelHistogramData[256]={0};
int main()
{
IplImage *Image1=cvLoadImage("waterfall.jpg",1);
CvScalar Scalar1;
int BlueColor,GreenColor,RedColor,GrayLevelColor;
for(int i=0;i<Image1->height;i++)
{
for(int j=0;j<Image1->width;j++)
{
Scalar1=cvGet2D(Image1,i,j);
BlueColor=(int)Scalar1.val[0];
GreenColor=(int)Scalar1.val[1];
RedColor=(int)Scalar1.val[2];
GrayLevelColor=(int) (0.299*RedColor+0.587*GreenColor+0.114*BlueColor);
BlueHistogramData[BlueColor]++;
GreenHistogramData[GreenColor]++;
RedHistogramData[RedColor]++;
GrayLevelHistogramData[GrayLevelColor]++;
}
}
printf("Red\tGreen\tBlue\tGrayLevel\n");
for(int i=0;i<256;i++)
{
printf("%d\t%d\t%d\t%d\t\n",RedHistogramData[i],GreenHistogramData[i],BlueHistogramData[i],GrayLevelHistogramData[i]);
}
cvNamedWindow("waterfall",1);
cvShowImage("waterfall",Image1);
cvWaitKey(0);
}
原始圖片:

執行結果:
上面的程式碼,就是將RGB值做統計,將R值,G值,B值累加在0~255的範圍裡,因此就可以知道這張圖的色彩分布的結構,灰階圖亦然,而OpenCV亦可以做到圖表的呈現的方式,利用的是繪圖函式來實作,用cvLine()或是cvRectangle()就可以做到統計值方圖的繪製,OpenCV在統計直方圖製作部分有一個CvHistogram的資料結構可以實作,而下面這個,則是直接將上面的程式碼修改繪製上去的統計值方圖製作.
統計直方圖計算與繪製
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
int BlueHistogramData[256]={0};
int GreenHistogramData[256]={0};
int RedHistogramData[256]={0};
int GrayLevelHistogramData[256]={0};
int main()
{
IplImage *Image1=cvLoadImage("waterfall.jpg",1);
IplImage *BlueHistogramImage,*GreenHistogramImage,*RedHistogramImage;
IplImage *GrayLevelHistogramImage;
BlueHistogramImage=cvCreateImage(cvSize(256,250),IPL_DEPTH_8U,3);
GreenHistogramImage=cvCreateImage(cvSize(256,250),IPL_DEPTH_8U,3);
RedHistogramImage=cvCreateImage(cvSize(256,250),IPL_DEPTH_8U,3);
GrayLevelHistogramImage=cvCreateImage(cvSize(256,250),IPL_DEPTH_8U,3);
BlueHistogramImage->origin=1;
GreenHistogramImage->origin=1;
RedHistogramImage->origin=1;
GrayLevelHistogramImage->origin=1;
CvScalar Scalar1;
int BlueColor,GreenColor,RedColor,GrayLevelColor;
for(int i=0;i<Image1->height;i++)
{
for(int j=0;j<Image1->width;j++)
{
Scalar1=cvGet2D(Image1,i,j);
BlueColor=(int)Scalar1.val[0];
GreenColor=(int)Scalar1.val[1];
RedColor=(int)Scalar1.val[2];
GrayLevelColor=(int) (0.299*RedColor+0.587*GreenColor+0.114*BlueColor);
BlueHistogramData[BlueColor]++;
GreenHistogramData[GreenColor]++;
RedHistogramData[RedColor]++;
GrayLevelHistogramData[GrayLevelColor]++;
}
}
for(int i=0;i<255;i++)
{
cvLine(BlueHistogramImage,cvPoint(i,BlueHistogramData[i]/10),cvPoint(i,0),CV_RGB(0,0,255));
cvLine(GreenHistogramImage,cvPoint(i,GreenHistogramData[i]/10),cvPoint(i,0),CV_RGB(0,255,0));
cvLine(RedHistogramImage,cvPoint(i,RedHistogramData[i]/10),cvPoint(i,0),CV_RGB(255,0,0));
cvLine(GrayLevelHistogramImage,cvPoint(i,GrayLevelHistogramData[i]/10),cvPoint(i,0),CV_RGB(128,128,128));
}
cvNamedWindow("waterfall",1);
cvShowImage("waterfall",Image1);
cvNamedWindow("Blue Histogram",1);
cvShowImage("Blue Histogram",BlueHistogramImage);
cvNamedWindow("Green Histogram",1);
cvShowImage("Green Histogram",GreenHistogramImage);
cvNamedWindow("Red Histogram",1);
cvShowImage("Red Histogram",RedHistogramImage);
cvNamedWindow("GrayLevel Histogram",1);
cvShowImage("GrayLevel Histogram",GrayLevelHistogramImage);
cvWaitKey(0);
}
執行結果:
在繪製圖形的時候,亦要開啟圖表的空間,IplImage資料結構,在將IplImage資料結構的origin設為1,為Window XP預設圖形起始點,這部份在"資料結構操作與運算-IplImage資料結構"有詳細的介紹,再來就是讀取RGB值做統計,以及使用cvLine()做繪製,cvLine()的繪製方法則是在"OpenCV繪圖的實作-cvLine,cvRectangle"有介紹到,而CvHistogram資料結構也是使用類似上面的原理,在OpenCV裡面,統計直方圖的部分還是需要自己動手畫,沒有很方便的函式可以直接實作出視覺化圖形的呈現.
0 意見:
張貼留言