opencv中,怎么计算彩色图像的直方图calchist

opencv中,怎么计算彩色图像的直方图calchist,第1张

CV_EXPORTS void calcHist( const Mat images,
int nimages,
const int channels,
InputArray mask,
OutputArray hist,
int dims,
const int histSize,
const float ranges,
bool uniform=true,
bool accumulate=false );
参数1表示需要用来计算直方图的源图像序列,因此可以允许有多张大小一样,数据类型相同的图像被用来统计其直方图特征。
参数2表示的就是使用多少张图像序列中的图像用于计算直方图。
参数3的出现主要是考虑到输入的每一张图像有可能是多通道的,比如说RGB图就是3通道的,那么从统计意义上来讲,
一张RGB图其实就是3张单通道的图像,而计算直方图时其本质也是针对单张图像进行的。这里虽然我们输入的图像序列images中有很多,但是并不是
每一张的每一个通道都会被用来计算。所以参数3的功能是指定哪些通道的图像被用来计算(后面的解释都假设图像序列中图像是3通道的,那么有的图像可能
有多个通道都被用来计算,有的图像可能连一个通道都没有被采用),这时参数3里面保存的是通道的序号,那么图像序列images中的第一张的通道序号
(假设图像时3通道的)为0,1,2;images中第二张的图像序列接着上一次的,为3,4,5,;依次类推即可。
参数4是mask掩膜 *** 作,即指定每张的哪些像素被用于计算直方图,这个掩膜矩阵不能够针对特定图像设定特定的掩膜,因此在这里是一视同仁对待的。
参数5是保存计算的直方图结果的矩阵,有可能是多维矩阵。
参数6是需要计算的直方图的维数。
参数7是所需计算直方图的每一维的大小,即每一维bin的个数。
参数8是所需计算直方图的每一维的范围,如果参数9的uniform为true,这此时的参数8的大小为2,里面的
元素值表示的是每一维的上下限这两个数字;如果参数9的uniform为false,则此时的参数8的大小为bin的个数,即参数7的值,参数8里面的元
素值需要人为的指定,即每一维的坐标值不一定是均匀的,需要人为指定。
参数9如果为true的话,则说明所需计算的直方图的每一维按照它的范围和尺寸大小均匀取值;如果为false的话,说明直方图的每一维不是均匀分布取值的,参考参数8的解释。
参数10如果为false,则表示直方图输出矩阵hist在使用该函数的时候被清0了,如果为true,则表示hist在使用calcHist()函数时没有被清0,计算的结果会累加到前一次保存的值中。
使用该函数的时候需要注意,如果在默认参数的情况下uniform = true,则此时的ranges大小必须是histSize大小的两倍,并且channels的大小必须等于dims维数。
从上面可以理解,channels里的值已经指定了使用哪些单通道的图像来计算目标直方图,因此一旦channels的尺寸确定,则对应的直方图的维数也就确定了,所以我们不能使用多张图像来计算一个一维的直方图。
以上内容来自:基础学习笔记之opencv(19):有关图像序列的直方图计算
[cpp] view plain copy print
#include "opencv2/highgui/highguihpp"
#include "opencv2/imgproc/imgprochpp"
#include <iostream>
#include <stdioh>

using namespace std;
using namespace cv;

/ @函数 main /
int main( int argc, char argv )
{
Mat src, dst;

/// 装载图像
src = imread( argv[1], 1 );

if( !srcdata )
{ return -1; }

/// 分割成3个单通道图像 ( R, G 和 B )
vector<Mat> rgb_planes;
split( src, rgb_planes );

/// 设定bin数目
int histSize = 255;

/// 设定取值范围 ( R,G,B) )
float range[] = { 0, 255 } ;
const float histRange = { range };

bool uniform = true; bool accumulate = false;

Mat r_hist, g_hist, b_hist;

/// 计算直方图:
calcHist( &rgb_planes[0], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, uniform, accumulate );
calcHist( &rgb_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRange, uniform, accumulate );
calcHist( &rgb_planes[2], 1, 0, Mat(), b_hist, 1, &histSize, &histRange, uniform, accumulate );

// 创建直方图画布
int hist_w = 400; int hist_h = 400;
int bin_w = cvRound( (double) hist_w/histSize );

Mat histImage( hist_w, hist_h, CV_8UC3, Scalar( 0,0,0) );

/// 将直方图归一化到范围 [ 0, histImagerows ]
normalize(r_hist, r_hist, 0, histImagerows, NORM_MINMAX, -1, Mat() );
normalize(g_hist, g_hist, 0, histImagerows, NORM_MINMAX, -1, Mat() );
normalize(b_hist, b_hist, 0, histImagerows, NORM_MINMAX, -1, Mat() );

/// 在直方图画布上画出直方图
for( int i = 1; i < histSize; i++ )
{
line( histImage, Point( bin_w(i-1), hist_h - cvRound(r_histat<float>(i-1)) ) ,
Point( bin_w(i), hist_h - cvRound(r_histat<float>(i)) ),
Scalar( 0, 0, 255), 2, 8, 0 );
line( histImage, Point( bin_w(i-1), hist_h - cvRound(g_histat<float>(i-1)) ) ,
Point( bin_w(i), hist_h - cvRound(g_histat<float>(i)) ),
Scalar( 0, 255, 0), 2, 8, 0 );
line( histImage, Point( bin_w(i-1), hist_h - cvRound(b_histat<float>(i-1)) ) ,
Point( bin_w(i), hist_h - cvRound(b_histat<float>(i)) ),
Scalar( 255, 0, 0), 2, 8, 0 );
}

/// 显示直方图
namedWindow("calcHist Demo", CV_WINDOW_AUTOSIZE );
imshow("calcHist Demo", histImage );

waitKey(0);

return 0;

}

假设有这样一组样本数据,存放于A列,首先我们计算出样本的中心值(均值)和标准差。

如下图,按图写公式计算。为了方便对照着写公式,我在显示“计算结果”旁边一列列出了使用的公式。

公式直接引用A列计算,这样可以保证不管A列有多少数据,全部可以参与计算。因为是做模板,所以这样就不会因为每次样本数据量变化而计算错误。

Excel在2007版本以后标准差函数有STDEVS和STDEVP。STDEVS是样本标准偏差,STDEVP是基于样本的总体标准偏差。如果你的Excel里没有STDEVS函数,请使用STDEV函数。

2

正态分布直方图需要确定分组数,组距坐标上下限等。如下图写公式计算。

分组数先使用25,上下限与中心值距离(多少个sigma)先使用4。因为使用公式引用完成计算,所以这两个值是可以任意更改的。这里暂时先这样放

3

计算组坐标。“组”中填充1-100的序列。此处列了100个计算值。原因后面再解释。

在G2,G3分别填入1,2。选中G2,G3单元格,将鼠标放在右下角选中框的小黑方块上。当鼠标变成黑色十字时,下拉。直至数值增加至100。如下两图

4

如下图,H2输入公式=D9,H3单元格输入公式=H2+D$7。为了使公式中一直引用D7单元格,此处公式中使用了行绝对引用。

5

选中H3单元格,将鼠标放在右下角选中框的小黑方块上。当鼠标变成黑色十字时双击,填充H列余下单元格。

6

计算频数。如图所示,在I2,I3分别填写公式计算频数。同样,选中I3单元格,将鼠标放在右下角选中框的小黑方块上。当鼠标变成黑色十字时双击,填充I列余下单元格。

7

计算正态曲线函数值。如图在J2列输入公式。同样,选中J2单元格,将鼠标放在右下角选中框的小黑方块上。当鼠标变成黑色十字时双击,填充J列余下单元格。

END

建立名称,供正态图引用

1

建立名称。[公式] 选项卡中点击 [名称管理器] ,打开 [名称管理器] 对话框,点击 [新建] 打开 [新建名称] 对话框。 [名称] 里输入“频数”,[引用位置] 里输入公式“=OFFSET(正态分布!$I$1,1,,正态分布!$D$6)”。然后点击 [确定] 。

注意,我的数据所在sheet的名称是“正态分布”。你的可能是“Sheet1”,“Sheet2”之类的名称。为了保证公式一致,建议双击工作表名称,然后修改成和我的一样的“正态分布”

2

同样建立名称“正态曲线”,[引用位置] 里输入公式“=OFFSET(正态分布!$J$1,1,,正态分布!$D$6)”;建立名称“坐标”, [引用位置] 里输入公式“=OFFSET(正态分布!$H$1,1,,正态分布!$D$6)”

END

画正态图

插入柱形图

选中刚插入的空白图形,在 [图表工具] 选项组中切换到 [设计],点击 [选择数据] ,打开 [选择数据源] 对话框。

点击 [添加],打开 [编辑数据系列] 对话框,如图设置 [系列名称] 和 [系列值] 来添加“频数”系列。同样如图设置添加“正态曲线系列”

编辑坐标轴引用。 [选择数据源] 对话框中点击编辑打开 [轴标签] 对话框。如图设置引用。点击 [确定] 返回 [选择数据源] 对话框,点击 [确定] 。

确保柱形图处于选中状态,点击 [图表工具]-[布局]。点击左上角 [图表区] 下拉列表,选择“系列“正态曲线””,然后点击 [设置所选内容格式],打开 [设置数据系列格式] 对话框。选择 [次坐标轴]。

[图表工具] 选项组切换到 [设计] 选项卡。点击 [更改图表类型],打开 [更改图表类型] 对话框。如图选择拆线图

柱形图中选中正态曲线,然后在 [图表工具] 选项组切换到 [布局] 选项卡。点击 [设置所选内容格式],打开 [设置数据系列格式] 对话框。切换到 [线型] ,选择 [平滑线]。

至此,图形已经画完。如果只需要柱形分布图,不需要正态曲线,在柱形图中选中正态曲线,按键盘上的Delete键删除就行了。

有的专业作图软件中,柱形分布图中柱子是紧挨在一起的。要这样设置的话请在柱形图中选中柱子,然后 [图表工具] 选项组切换到 [布局] 选项卡。点击 [设置所选内容格式],打开 [设置数据系列格式] 对话框。分类间距设为0%。切换到 [边框颜色] ,然后选择 [实线] ,颜色随便选一个,只要和柱子不是一个颜色就可以了。这里选择了黑色。

最后,试着修改下“组”和上下限与中心值距离的值,图表会自动更新。在第3步中,我们计算了100组的值,所以,只要此处的组不超过100,均可得到正确的图表。一般分组到100的情况极少,所以,第3步预留了100组的数据,以便在更改组时,总能等到正确的图表。当然,如果你原意,计算1000组也无所谓了。反正你已经学会方法了。

以后如果样本数据变更了,直接将A列数据换成新的样本数据,设置下需要的分组和上下限与中心值距离的值,正态分布图分分钟钟就出来啦。至于美化嘛,只要更改相关设置就可以了,比如开篇那张,当然,你可以把图表美化的更加漂亮,尽情发挥想象力吧。

喜欢就点赞或点击投票吧,点击关注波波411,我会不定期更新新经验哦。如果有需求,也可以给我留言。:-)

质量特性的分布居中且便捷与质量标准的上下界限有较大距离,说明其质量能力偏大,不经济。

将直方图用于质量管理中,可以按照数据图形的分布将其分为多种。在正常生产条件下,如果所得到的直方图不是标准形状,或者虽是标准形状。

但其分布范围不合理,就要分析其原因,采取相应措施。所以我们在用软件绘出直方图后要进一步对它进行观察和分析。

一建工程管理复习技巧:

公共课相对简单一点,听课件跟着过二遍精讲课程,在大致了解全书内容的情况下,试着做以下往年真题,看看自己能掌握多少,出错的地方补强。

公共课题型基本上为选择题,做选择题有其一定的技巧和方法的,单选题不会也要蒙一个,多选题自己没把握的话就蒙上1-2个,不要选3个以上,少选有分,错选1个就一分都没有了。

以下是Excel在2007版本以后标准差函数有STDEVS和STDEVP的 *** 作:
假设有这样一组样本数据,存放于A列,首先我们计算出样本的中心值(均值)和标准差。为了方便对照着写公式,我在显示“计算结果”旁边一列列出了使用的公式。
公式直接引用A列计算,这样可以保证不管A列有多少数据,全部可以参与计算。因为是做模板,所以这样就不会因为每次样本数据量变化而计算错误。Excel在2007版本以后标准差函数有STDEVS和STDEVP。STDEVS是样本标准偏差,STDEVP是基于样本的总体标准偏差。如果你的Excel里没有STDEVS函数,请使用STDEV函数。2正态分布直方图需要确定分组数,组距坐标上下限等。如下图写公式计算。分组数先使用25,上下限与中心值距离(多少个sigma)先使用4。因为使用公式引用完成计算,所以这两个值是可以任意更改的。这里暂时先这样放。3计算组坐标。“组”中填充1-100的序列。此处列了100个计算值。原因后面再解释。在G2,G3分别填入1,2。选中G2,G3单元格,将鼠标放在右下角选中框的小黑方块上。当鼠标变成黑色十字时,下拉。直至数值增加至100。4H2输入公式=D9,H3单元格输入公式=H2+D$7。为了使公式中一直引用D7单元格,此处公式中使用了行绝对引用。5选中H3单元格,将鼠标放在右下角选中框的小黑方块上。当鼠标变成黑色十字时双击,填充H列余下单元格。6计算频数。如图所示,在I2,I3分别填写公式计算频数。同样,选中I3单元格,将鼠标放在右下角选中框的小黑方块上。当鼠标变成黑色十字时双击,填充I列余下单元格。7计算正态曲线函数值。如图在J2列输入公式。同样,选中J2单元格,将鼠标放在右下角选中框的小黑方块上。当鼠标变成黑色十字时双击,填充J列余下单元格。

它能反映一组数据的大众表现。
众数算出来是销售最常用的,代表最多的
众数
概念
一般来说,一组数据中,出现次数最多的数就叫这组数据的众数。
例如:1,2,3,3,4的众数是3。
但是,如果有两个或两个以上个数出现次数都是最多的,那么这几个数都是这组数据的众数。
例如:1,2,2,3,3,4的众数是2和3。
还有,如果所有数据出现的次数都一样,那么这组数据没有众数。
例如:1,2,3,4,5没有众数。
在高斯分布中,众数位于峰值。
众数的计算方法:
(一)、根据单项数列求众数,不需要任何计算,可以直接从分配数列中找出出现次数或频率最大的一组标志值,就是所求的众数。
(二)、对组距数列求众数。对众数的计算有两种公式:
1、上限公式:
2、下限公式:

其中:f表示众数所在组次数;
f-1表示众数所在组前一组的次数;
f+1表示众数所在组后一组的次数;
L表示众数所在组组距的下限;
U表示众数所在组组距的上限;
i表示组距;


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13007975.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-29
下一篇 2023-05-29

发表评论

登录后才能评论

评论列表(0条)

保存