导航:首页 > 动漫图片 > 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怎么把图片分成直方图相关的资料

热点内容
个性的微信女生头像图片 浏览:793
word怎样打图片文档 浏览:618
寸头战士发型图片大全 浏览:265
素描游戏动漫人物男生图片 浏览:414
情侣牵手高清图片 浏览:734
2016发型颜色大全图片大全 浏览:24
少儿拳击图片霸气女孩 浏览:803
冷暖风扇图片价格 浏览:886
适合长脸正反面男生头型的图片 浏览:964
朋友圈配的文字图片 浏览:556
ps怎么把图片多边形 浏览:227
可爱的宝宝的图片 浏览:387
女孩子吃鱿鱼过敏图片大全 浏览:668
天秤座图片动漫少女 浏览:878
男生骨头突出图片 浏览:750
可爱小帆船简笔画图片 浏览:663
15岁男生普通照片图片 浏览:103
两个图片怎么合并 浏览:809
三轮摩托车价格图片 浏览:980
酷小女孩图片 浏览:885