标签:des blog http color os io for ar 2014
学习openCV上的一个例子,根据输入的图像构造色相饱和度的直方图
#include <cv.h>
#include <highgui.h>
void main()
{
//以原始通道数读取图片1
IplImage* img1 = cvLoadImage("D://vc6.0//MSDev98//MyProjects//MachineVision//TestPic//PeppersRGB.bmp",CV_LOAD_IMAGE_UNCHANGED);
//创建图片1的一个空副本
IplImage* img2 = cvCreateImage(cvGetSize(img1), 8, 3);
//从RGB色彩空间转换到HSV色彩空间
cvCvtColor(img1, img2, CV_BGR2HSV);
IplImage* h_plane = cvCreateImage(cvGetSize(img1), 8, 1);
IplImage* s_plane = cvCreateImage(cvGetSize(img1), 8, 1);
IplImage* v_plane = cvCreateImage(cvGetSize(img1), 8, 1);
IplImage* planes[] = {h_plane, s_plane};
//将HSV图像分成H,S,V三个通道分别操作
cvCvtPixToPlane(img2, h_plane, s_plane, v_plane, 0);
//建立直方图
//确定直方图中方块的数量
int h_bins = 30;
int s_bins = 32;
CvHistogram* hist;
int hist_size[] = {h_bins, s_bins};
//设定h和s直方图横坐标的范围
float h_ranges[] = {0, 180};
float s_ranges[] = {0, 255};
float* ranges[] = {h_ranges, s_ranges};
//创建一个二维直方图,1代表均匀分割
hist = cvCreateHist(2, hist_size, CV_HIST_ARRAY, ranges, 1);
//计算直方图
cvCalcHist(planes, hist, 0, 0);
//归一化
cvNormalizeHist(hist, 1.0);
int scale = 10;
IplImage* histogram = cvCreateImage(cvSize(h_bins * scale, s_bins * scale), 8, 3);
cvZero(histogram);
float max_value = 0;
//获取最大的直方图高度
cvGetMinMaxHistValue(hist, 0, &max_value, 0, 0);
//
for (int h = 0; h < h_bins; h++)
{
for (int s = 0; s < s_bins; s++)
{
//获取某个直方块的高度
float bin_val = cvQueryHistValue_2D(hist, h, s);
int intensity = cvRound(bin_val * 255 / max_value);
//将不同高度的直方块用不同深度的灰度表示
cvRectangle(histogram,
cvPoint(h*scale, s*scale),
cvPoint((h+1)*scale - 1, (s+1)*scale - 1),
CV_RGB(intensity,intensity,intensity),
CV_FILLED
);
}
}
//命名窗口
cvNamedWindow("Source", CV_WINDOW_AUTOSIZE);
cvShowImage("Source", img1);
cvNamedWindow("Histogram", CV_WINDOW_AUTOSIZE);
cvShowImage("Histogram", histogram);
cvWaitKey(0);
cvDestroyAllWindows();
cvReleaseImage(&img1);
cvReleaseImage(&histogram);
}
标签:des blog http color os io for ar 2014
原文地址:http://blog.csdn.net/lampqiu/article/details/38822131