文档库 最新最全的文档下载
当前位置:文档库 › 颜色直方图的计算、显示、处理、对比及反向投影

颜色直方图的计算、显示、处理、对比及反向投影

颜色直方图的计算、显示、处理、对比及反向投影
颜色直方图的计算、显示、处理、对比及反向投影

颜色直方图的计算、显示、处理、对比及反向投影(How to Use Histogram? Calculate, Show, Process, Compare and BackProject)

作者:王先荣

前言

颜色直方图直观的显示了图像在色彩空间的分布状况,本文将讨论在EmguCv及OpenCv中跟直方图相关的一些基本操作,包括:计算、显示、处理、对比及反向投影,并谈谈在实践过程中得到的一些经验。如无特别说明,下文所提的直方图均指颜色直方图。

直方图的计算

EmguCv将OpenCv的一系列直方图函数封装到了类DenseHistogram里面,可以用方法Calculate方便的计算图像的直方图。不过值得注意的是,该方法接受的第一个参

数是“单通道”图像数组;而一般情况下的图像都是3通道的,在计算之前我们需要用Image.Split方法将其分解成单通道图像,然后选择需要参与直方图计算的通道。下面有几段计算直方图的代码,分别计算单通道(红色)直方图、色调和饱和度直方图。

计算直方图

///

///计算直方图(红色)

///

private void CalcHistRed()

{

//计算

int rBins = 256;

RangeF rRange = new RangeF(0f, 255f);

Image imageSource = new Image((Bitmap)pbSource.Image);

Image imageRed = imageSource.Split() [2];

DenseHistogram hist = new DenseHistogram(rBins, rRange);

hist.Calculate(new IImage[] { imageRed }, false, null);

//显示

pbHistogram.Image = GenerateHistImage(hist).Bitm ap;

//释放资源

imageSource.Dispose();

imageRed.Dispose();

hist.Dispose();

}

///

///计算直方图(色调和饱和度)

///

private void CalcHistHs()

{

//计算

int hBins = 180;

RangeF hRange = new RangeF(0f, 179f); //色调的范围在0~180之间

int sBins = 256;

RangeF sRange = new RangeF(0f, 255f);

Image imageSource = new Image((Bitmap)pbSource.Image);

Image imageHsv = imageSource.Convert< Hsv, Byte>(); //将色彩空间从BGR转换到HSV

Image[] imagesHsv = imageSource.Spli t(); //分解成H、S、V三部分

DenseHistogram hist = new DenseHistogram(new int [] { hBins, sBins }, new RangeF[] { hRange, sRange });

hist.Calculate(new IImage[] { imagesHsv[0], imag esHsv[1] }, false, null);

//显示

pbHistogram.Image = GenerateHistImage(hist).Bitm ap;

//释放资源

imageSource.Dispose();

imageHsv.Dispose();

foreach (Image image in imagesHsv)

image.Dispose();

hist.Dispose();

}

直方图的显示

我们可以用以下方式来查看直方图:(1)使用HistogramViewer窗体显示直方图;(2)使用HistogramBox控件显示直方图;(3)用自己写的方法将直方图转换成图像,然后显示出来。这3个方式依次从易到难,不过对直方图的显示控制程度却依次提高。1.HistogramViewer窗体

HistogramViewer窗体的3个静态方法可以很方便的显示直方图,它们的定义如下:Show(IImage) 显示指定图像的直方图:它会自动为图像的每个通道生成直方图,然后显示一个或者多个一维直方图;

Show(IImage, Int32) 显示指定图像的直方图:除了可以自己指定直方图的区间数目之外,跟前一个方法一样;

Show(DenseHistogram, String) 显示指定的一维直方图:可以在图上显示一个标题,注意这个方法只能显示一维直方图。

HistogramViewer窗体还有一个名为HistogramCtrl的属性,它用来获取窗体内的HistogramBox控件。

下面的代码演示了HistogramViewer的用法:

用HistogramViewer显示直方图

///

///计算直方图(RGB)

///

private void CalcHistRgb()

{

//在HistogramViewer中显示直方图

Image imageSource = new Image((Bitmap)pbSource.Image);

//直接用HistogranViewer的静态函数Show来查看直方图,不过不能控制行为

HistogramViewer.Show(imageSource, 256);

//可以用HistogramViewer对象来显示直方图,有较多的控制 HistogramViewer hv = new HistogramViewer();

hv.Text = "RGB直方图";

hv.ShowInTaskbar = false;

hv.HistogramCtrl.GenerateHistograms(imageSource, 256);

hv.WindowState = FormWindowState.Maximized;

hv.Show(this);

//释放资源

imageSource.Dispose();

}

2.HistogramBox控件

HistogramBox控件有4个方法跟直方图有关:

AddHistogram(String, Color, DenseHistogram) 向控件添加一块一维直方图:可以指定标题及绘制的颜色;

ClearHistogram() 移除控件中的所有直方图;

GenerateHistograms(IImage, Int32) 为指定图像的每个通道生成直方图:可以指定直方图的区间数目;

Refresh() 绘制直方图:对控件的直方图进行任何改动之后,都要调用Refresh来重新绘制才行。

用HistogramBox显示直方图

///

///计算直方图(色调)

///

private void CalcHistHue()

{

//计算

int hBins = 180;

RangeF hRange = new RangeF(0f, 179f); //色调的范围在0~180之间

Image imageSource = new Image((Bitmap)pbSource.Image);

Image imageHsv = imageSource.Convert< Hsv, Byte>(); //将色彩空间从BGR转换到HSV

Image imageHue = imageSource.Split() [0]; //分解Hue部分

DenseHistogram hist = new DenseHistogram(hBins, hRange);

hist.Calculate(new IImage[] { imageHue }, false, null);

//显示(注意:这里的变量histBox是一个HistogramBox控件的对象)

histBox.AddHistogram("色调直方图", Color.FromArgb (255, 0, 0), hist);

histBox.Refresh();

//释放资源

imageSource.Dispose();

imageHsv.Dispose();

imageHue.Dispose();

hist.Dispose();

}

3.自己写方法将直方图转换成图像

HistogramViewer和HistogramBox很方便,但是它们只能显示一维的直方图,如果

要显示二维甚至三维的直方图,那么只有自己写方法了。

自己写代码显示直方图

//生成直方图图示

private Image GenerateHistImage(DenseHist ogram hist)

{

Image imageHist = null;

float minValue, maxValue;

int[] minLocations, maxLocations;

hist.MinMax(out minValue, out maxValue, out minL ocations, out maxLocations);

if (hist.Dimension == 1)

{

int bins = hist.BinDimension[0].Size;

int width = bins;

int height = 300;

imageHist = new Image(width, heigh t, new Bgr(255d, 255d, 255d));

double heightPerTick = 1d * height / maxValue; Bgr color=new Bgr(0d,0d,255d);

//遍历每个bin对应的值,并画一条线

for (int i = 0; i < bins; i++)

{

LineSegment2D line = new LineSegment2D(ne

w Point(i, height), new Point(i, (int)(height - heightPerT

ick * hist[i])));

imageHist.Draw(line, color, 1);

}

}

else if (hist.Dimension == 2)

{

int scale = 2;

int width = hist.BinDimension[0].Size * scale;

int height = hist.BinDimension[1].Size * scal e;

imageHist = new Image(width, heigh t, new Bgr(255d, 255d, 255d));

//遍历每个bin对应的值,并画一个矩形

for (int i = 0; i < width / scale; i++)

{

for (int j = 0; j < height / scale; j++)

{

double binValue = hist[i, j];

double intensity = 1d * binValue * 255

/ maxValue;

Rectangle rect = new Rectangle(i * sca le, j * scale, 1, 1);

Bgr color = new Bgr(intensity, intensi ty, intensity);

imageHist.Draw(rect, color, 1);

}

}

}

return imageHist;

}

注意上面的方法只生成一维和二维直方图的图像,因为我很笨-_- 。我相信聪明的你,一定能搞定三维的显示~~。

直方图的处理

在计算出直方图之后,我们经常需要对其进行一些处理才能使用,下面介绍最常用的几个:

MinMax(Single, Single, array[], array[]) 查找最小及最大的直

方图区间及其位置;

Normalize(Double) 归一化直方图;

Threshold(Double) 为直方图设置一个阀值,小于阀值的区间将被置零。

下面的代码演示了直方图的处理:

直方图的处理

//计算直方图

DenseHistogram hist = new DenseHistogram(bins [i], ranges[i]);

hist.Calculate(new IImage[] { images[i] }, fa lse, null);

//阀值

if (cbThreshold.Checked && thresholdValue > 0) hist.Threshold(thresholdValue);

//归一化

if (cbNormalize.Checked)

hist.Normalize(normalizeFactor);

//显示

histBox1.AddHistogram(captions[i], colors[i],

hist);

//释放

hist.Dispose();

images[i].Dispose();

直方图的对比

OpenCv提供了5种对比直方图的方式:CORREL(相关)、CHISQR(卡方)、INTERSECT(相交)、BHATTACHARYYA、EMD(最小工作距离),其中CHISQR速

度最快,EMD速度最慢且有诸多限制,但是EMD的效果最好。世界总是充满了矛盾,而

我们的工作就是化解矛盾,把每种方式都测试一下,找到正好能解决问题并且速度最优的方法。

下面是直方图对比的示例代码:

对比直方图

//对比直方图

private void btnCompare_Click(object sender, EventA rgs e)

{

Stopwatch sw = new Stopwatch();

sw.Start();

//计算直方图

DenseHistogram hist1 = CalcHist(pbSource1.Image); DenseHistogram hist2 = CalcHist(pbSource2.Image);

//对比并显示对比结果

HISTOGRAM_COMP_METHOD compareMethod = HISTOGRAM_ COMP_METHOD.CV_COMP_CORREL;

double compareResult = 0d;

if (rbCompareEmd.Checked)

{

//EMD(陆地移动距离)需要用特殊的方法计算

//将直方图转换成矩阵

Matrix matrix1 = ConvertDenseHistogr amToMatrix(hist1);

Matrix matrix2 = ConvertDenseHistogr amToMatrix(hist2);

compareResult = CvInvoke.cvCalcEMD2(matrix1. Ptr, matrix2.Ptr, DIST_TYPE.CV_DIST_L2, null, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);

matrix1.Dispose();

matrix2.Dispose();

}

else

{

if (rbCompareCorrel.Checked)

compareMethod = HISTOGRAM_COMP_METHOD.CV_ COMP_CORREL;

else if (rbCompareChisqr.Checked)

compareMethod = HISTOGRAM_COMP_METHOD.CV_ COMP_CHISQR;

else if (rbCompareIntersect.Checked)

compareMethod = HISTOGRAM_COMP_METHOD.CV_ COMP_INTERSECT;

else if (rbCompareBhattacharyya.Checked)

compareMethod = HISTOGRAM_COMP_METHOD.CV_ COMP_BHATTACHARYYA;

else

throw new Exception("不存在的直方图对比方式。");

compareResult = CvInvoke.cvCompareHist(hist1. Ptr, hist2.Ptr, compareMethod);

}

sw.Stop();

txtResult.Text += string.Format("对比直方图用时:{0: F05}毫秒,对比方式:{1},对比结果:{2:F05},条件({3})\r\n",

sw.Elapsed.TotalMilliseconds, rbCompareEmd.C hecked ? "EMD" : compareMethod.ToString("G"), compareResul t, GetOptions());

//释放资源

hist1.Dispose();

hist2.Dispose();

}

需要注意的是:EMD方式要求先将直方图转换成矩阵:

将直方图转换成矩阵

///

///将直方图转换成矩阵;

///注意:只支持1、2、3维直方图

///

///直方图

///返回矩阵

private Matrix ConvertDenseHistogramToMatri x(DenseHistogram hist)

{

Matrix matrix = null;

if (hist != null)

{

int cols = hist.Dimension + 1; //矩阵的列数为

直方图维数加1

int rows = 1; //矩阵的行数为直方

图所有bin的乘积

foreach (MCvMatND.Dimension bin in hist.BinDi mension)

rows *= bin.Size;

//初始化矩阵

matrix = new Matrix(rows, cols);

//填充矩阵

if (hist.Dimension == 1)

{

// 1维直方图

for (int idx0 = 0; idx0 < hist.BinDimensio

n[0].Size; idx0++)

{

float binValue = (float)hist[idx0];

matrix[idx0, 0] = binValue;

matrix[idx0, 1] = idx0;

}

}

else if (hist.Dimension == 2)

{

// 2维直方图

int bins0 = hist.BinDimension[0].Size;

int bins1 = hist.BinDimension[1].Size;

for (int idx0 = 0; idx0 < bins0; idx0++)

{

for (int idx1 = 0; idx1 < bins1; idx1++) {

float binValue = (float)hist[idx0,

idx1];

int row = idx0 * bins1 + idx1;

matrix[row, 0] = binValue;

matrix[row, 1] = idx0;

matrix[row, 2] = idx1;

}

}

}

else if (hist.Dimension == 3)

{

// 3维直方图

int bins0 = hist.BinDimension[0].Size;

int bins1 = hist.BinDimension[1].Size;

int bins2 = hist.BinDimension[2].Size;

for (int idx0 = 0; idx0 < bins0; idx0++)

{

for (int idx1 = 0; idx1 < bins1; idx1++) {

for (int idx2 = 0; idx2 < bins2; id

x2++)

{

float binValue = (float)hist[id

x0, idx1, idx2];

int row = idx0 * bins1 * bins2 +

idx1 * bins2 + idx2;

matrix[row, 0] = binValue;

matrix[row, 1] = idx0;

matrix[row, 2] = idx1;

matrix[row, 3] = idx2;

}

}

}

}

else

{

throw new ArgumentException("直方图维数超出范围,只支持1、2、3维直方图。", "DenseHistogram hist");

}

}

return matrix;

}

EMD方法会占用很很很大量的内存,在使用前请注意直方图的维数及区间数目,不然会出现内存不足的异常。关于这点,请参看我的另一篇文章《关于使用cvCalcEMD2计算两个直方图间最小工作距离的限制(Why cvCalcEMD2 Throw Insufficient Memory Exception)》。还有一点值得注意的是,不同的对比方式对待结果的方式很不一样,结果越大不一定说明匹配度更高,具体请参看《学习OpenCv》这本书的相关章节。

对于直方图的相关和相交对比,结果值越大(即亮度较高)的地方表示匹配程度越高;

对于直方图的卡方、Bhattacharyya、EMD对比,结果值越小(即越黑暗)的地方表示匹配程度越高。

右图是左图用ACDSEE的去除杂点功能处理之后的结果

直方图的反向投影

现在说说直方图的反向投影,我觉得这是直方图中最难的部分,我看了跟cvCalcBackProjectPatch相关的读书章节、中文参考及英文帮助,还是不明白......而网上居然没有使用cvCalcBackProjectPatch的例程(当然本文写成之后就有例程了)。前天晚上在半梦半醒之间进入了冥想状态,突然开窍了,然而在试验的时候还是遇到了不少问题。

1.反向投影的作用是什么?

反向投影用于在输入图像(通常较大)中查找特定图像(通常较小或者仅1个像素,以下将其称为模板图像)最匹配的点或者区域,也就是定位模板图像出现在输入图像的位置。

2.反向投影如何查找(工作)?

查找的方式就是不断的在输入图像中切割跟模板图像大小一致的图像块,并用直方图对比的方式与模板图像进行比较。

假设我们有一张100x100的输入图像,有一张10x10的模板图像,查找的过程是这样的:(1)从输入图像的左上角(0,0)开始,切割一块(0,0)至(10,10)的临时图像;

(2)生成临时图像的直方图;

(3)用临时图像的直方图和模板图像的直方图对比,对比结果记为c;

(4)直方图对比结果c,就是结果图像(0,0)处的像素值;

(5)切割输入图像从(0,1)至(10,11)的临时图像,对比直方图,并记录到结果图像;

(6)重复(1)~(5)步直到输入图像的右下角。

(本图片引用自https://www.wendangku.net/doc/6f6301752.html,)

3.反向投影的结果是什么?

反向投影的结果包含了:以每个输入图像像素点为起点的直方图对比结果。可以把它看成是一个二维的浮点型数组,二维矩阵,或者单通道的浮点型图像。

4.特殊情况怎么样?

如果输入图像和模板图像一样大,那么反向投影相当于直方图对比。如果输入图像比模

板图像还小,直接罢工~~。

5.使用时有什么要注意的地方?

需要注意的地方比较多,我们对照反向投影函数来说:

void cvCalcBackProjectPatch(

IplImage** image, /*输入图像:是一个单通道图像数组,而非实际图像*/

CvArr* dst, /*输出结果:是一个单通道32位浮点图像,它的宽度为

W-w+1,高度为H-h+1,这里的W和H是输入图像的宽度和高度,w和h是模板图像的宽度和高度*/

CvSize patch_size, /*模板图像的大小:宽度和高度*/

CvHistogram* hist, /*模板图像的直方图:直方图的维数和输入图像的个数相同,并且次序要一致;例如:输入图像包含色调和饱和度,那么直方图的第0维是色调,第1维是饱和度*/

int method, /*对比方式:跟直方图对比中的方式类似,可以是:CORREL (相关)、CHISQR(卡方)、INTERSECT(相交)、BHATTACHARYYA*/ float factor /*归一化因子,一般都设置成1,否则很可能会出错;中文、英文以及各路转载的文档都错了,这个参数的实际类型是double,而非float,我看了源代码才搞定这个地方*/

);

还有最需要注意的地方:这个函数的执行效率非常的低,在使用之前尤其需要注意图像的大小,直方图的维数,对比方式。如果说对比单个直方图对现在的电脑来说是清风拂面,那么反向投影是狂风海啸。对于1010x1010的RGB输入图像,10x10的模板图像,需要生成1百万次3维直方图,对比1百万次3维直方图。

直方图反向投影的示例如下:

计算直方图的反向投影

//计算反向投影

private void btnCalcBackProjectPatch_Click(object s ender, EventArgs e)

{

Stopwatch sw = new Stopwatch();

sw.Start();

//定义变量

Image imageSource = new Image((Bitmap)pbSource.Image);

double scale = GetScale(); //用一个缩放因子减小源图像的大小,可以极大的提高处理速度

Image imageSource2 = imageSource.Resi ze(scale, INTER.CV_INTER_LINEAR);

Image imageTarget = new Image((Bitmap)pbTarget.Image);

Image imageTarget2 = imageTarget.Resi ze(scale, INTER.CV_INTER_LINEAR);

Image imageDest = null;

Size patchSize = imageTarget2.Size;

string colorSpace = (string)cmbColorSpace.Select edItem; //色彩空间的选择对处理速度也有很大的影响,更少的色彩空间数目能极大的提高处理速度

double normalizeFactor = 1d; //归一化因子,一般设置为1,且必须为double类型

Image[] imagesSource;

int[] bins;

RangeF[] ranges;

string[] captions;

Color[] colors;

//得到源图像需要参与反向投影的各色彩图像集合

FormProcessHist.GetImagesBinsAndRanges(imageSou rce2, colorSpace, out imagesSource, out bins, out ranges, o ut captions, out colors);

//计算目标图像的直方图

DenseHistogram histTarget = CalcHist(imageTarget 2.Bitmap);

//反向投影

HISTOGRAM_COMP_METHOD compareMethod = GetHistogr amCompareMethod();

try

{

imageDest = BackProjectPatch(imagesSou rce, patchSize, histTarget, compareMethod, (float)normaliz eFactor); //DenseHistogram类的方法BackProjectPath不能用,这里自己实现了一个类似的方法

}

catch(Exception ex)

{

txtResult.Text += string.Format("在执行反向投影时发生错误,错误描述:{0},错误源:{1}\r\n", ex.Message, ex.Sou rce);

}

//显示结果

if (imageDest != null)

pbResult.Image = imageDest.Bitmap;

sw.Stop();

txtResult.Text += string.Format("直方图反向投影用时:{0:F05}毫秒,对比方式:{1:G},({2})\r\n", sw.Elapsed.Tota lMilliseconds, compareMethod, GetOptions());

//释放资源

imageSource.Dispose();

imageSource2.Dispose();

imageTarget.Dispose();

imageTarget2.Dispose();

if (imageDest != null)

imageDest.Dispose();

foreach (Image image in imagesSource) image.Dispose();

histTarget.Dispose();

}

在左图(输入图像)中查找特定人脸(模板图像),结果如右图,中间亮白色的区域为最匹

配区域

如果您跟我一样在.net下使用EmguCv,那么恭喜你,还有需要解决的问题。EmguCv

的直方图反向投影部分有几处错误,不能直接使用。错误列表如下:

实验1斜井水平投影图的编制及井轨迹确定

实验1 斜井水平投影图的编制及井轨迹确定 一、实验目的 斜井和定向井 井位确定的需要 为合理开发油田,对井身质量提出严格要求。但是某些井或一口井的部分井段,由于地层倾斜、岩性变化及钻井技术措施不当等原因使井发生偏斜;另外由于地质或钻井工程上的需要,要求钻一些定向井。为准确了解地下井位,有必要计算斜井的井轨迹并编制井斜水平投影图。 通过本次井轨迹计算,主要了解与掌握以下三点内容: 1、了解井斜测量数据的基本构成及其空间意义; 2、掌握斜井井轨迹的计算方法; 3、掌握井斜水平投影图编制方法及用途。 二、依据标准 1行业标准(内部标准) 2行业标准(内部标准) 三、基础资料 1、A井井斜测量数据; 四、实验原理 1、井斜测量数据构成 a 井斜角;b方位角;c 全变化角(狗腿角) 井眼轨迹 狗腿角

图1 井斜角、方位角概念、全变化角空间示意图 2、井斜水平投影图编制 井斜水平投影图就是把某斜井的各个斜井段投影到某一水平面上所得到的图件,反映实际井底偏离井口的水平位移和方位,及钻遇目的层的垂直井深,是油气勘探、开发的基础图件之一。 图2 某斜井井轨迹平面投影图 根据(图2)三角形AOB的关系,可知: H = L·cosα S = L·sinα O′A′=OA=L·sinα即为斜井段L在水平面上的投影。 同理,如果一口斜井由多个斜井段组成,则在水平面上可得到相应的水平投影,从而构成一口斜井的水平投影图。 五、实验内容及步骤 1、A井的井斜水平投影图; 1)计算各测点间斜井段的水平位移 Si=Li×sinαi(i=1,2,3,...n) 2)计算各测点间水平位移的直角坐标值 Xi=Si×sinβi ,Yi=Si×cosβi (i=1,2,3,...n)3)在方格纸上选适当位置为坐标原点(即井口)。画出十字的井口坐标。 4)分别绘出各测点的方位及水平位移(βi,Si),依次连成点线,点的位置代表测点,测点间用直线相连,即为该井的井斜水平投影图。 5)从井口与井的最后一测点连线,得出总的水平位移和总的井斜方位角(S总、β总)。 6)图件整洁完整 2、计算A井水平距、垂直距及累计垂直距; 六、实验仪器 1 直尺 2 量角器

图像的直方图是图像的重要统计特征

图像的直方图是图像的重要统计特征,它可以认为是图像灰度密度函数的近似。直方图虽然不能直接反映出图像内容,但对它进行分析可以得出图像的一些有用特征,这些特征能反映出图像的特点。当图像对比度较小时,它的灰度直方图只在灰度轴上较小的一段区间上非零,较暗的图像由于较多的像素灰度值低,因此它的直方图的主体出现在低值灰度区间上,其在高值灰度区间上的幅度较小或为零,而较亮的图像情况正好相反。通常一幅均匀量化的自然图像的灰度直方图在低值灰度区间上频率较大,这样的图像较暗区域中的细节常常看不清楚。为使图像变清晰,可以通过变换使图像的灰度动态范围变大,并且让灰度频率较小的灰度级经变换后,其频率变得大一些,使变换后的图像灰度直方图在较大的动态范围内趋于均化。事实证明,通过图像直方图修改进行图像增强是一种有效的方法。 均匀量化的自然图像的灰度直方图通常在低值灰度区间上频率较大,使得图像中较暗区域中的细节常常看不清楚。为了使图像清晰,可将图像的灰度范围拉开,并且让灰度频率较小的灰度级变大,即让灰度直方图在较大的动态范围内趋于一致。 前面介绍的直方图均衡化处理方法从实验效果看还是很不错的,从实现算法上也可以看出其优点主要在于能自动整幅图像的对比度,但具体的增强效果也因此不易控制,只能得到全局均衡化处理的直方图。在科研和工程应用中往往要根据不同的要求得到特定形状的直方图分布以有选择的对某灰度范围进行局部的对比度增强,此时可以采用对直方图的规定化处理,通过选择合适的规定化函数取得期望的效果。 a=imread('花.jpg'); subplot(2,2,1); imshow(a); title('原始图像'); subplot(2,2,2); a=rgb2gray(a); imhist(a); title('原始图像直方图'); subplot(2,2,3);

10.2 直方图(理解频数分布直方图的特点及与其他描述方法的关系)

10.2直方图 一、教学目标 (一)教学知识点 1.了解认识频数分布直方图及相关概念. 2.解读频数分布直方图. 3.理解频数分布直方图的特点及与其他描述方法的关系.毛 (二)能力训练要求 1.通过观察、思考等数学活动,提高合理思维、推理能力. 2.通过比较、概括,提高归纳总结能力. (三)情感与价值观要求 1.积极参与各项活动,提高学习数学的兴趣. 2.养成独立思考的习惯及培养实事求是的态度. 二、教学重点 1.认识频数分布直方图及相关概念. 2.掌握几种统计图形的特点. 三、教学难点 区分直方图与条形图. 四、教学方法 自主合作─探究归纳. 五、教学过程 Ⅰ.提出问题,创设情境 为了研究800米赛跑后学生心率的分布情况,?体育老师统计了全班同学一分钟时间脉搏的次数. 可是如何处理这些数据?用什么样的方法描述才能更好地显示学生心率分布情况呢? Ⅱ.导入新课 我们先看体育老师是怎么做的. 他把全班学生的脉搏次数按范围分成8组,每组的两个端点的差都是5,这样就得出这样一个表格: 脉搏次数x(次/分)频数(学生人数) 130≤x<135 1 135≤x<140 2 140≤x<145 4 145≤x<150 6 150≤x<155 9 155≤x<160 14 160≤x<165 11 165≤x<170 2 从表上可以清楚地看出脉搏次数在不同范围的学生人数. 为了直观地描述表中的数据,体育老师用坐标系横轴表示脉搏次数,标出每组的两个端点,纵轴表示频数(学生人数),每个矩形的高表示对应组的频数.如图:

我们从体育老师描述这组数据的过程可以看出,他首先把全班学生的脉搏次数按范围分成8组,每组的两个端点的差都是5,这是为什么呢?不这样做行吗? [生]因为对这组数据的统计是为了研究800米赛跑后学生心率的分布情况,?要想知道学生脉搏次数在各个范围的分布状况,我们可以按实际需要分成若干组,但每组的两个端点差都应该一样,这样才能用落在各组中的学生人数即频数来准确描述数据的分布情况. 如果想用矩形的高表示频数,就必须这样做,否则是不能反映数据分布情况的. [师]好!这个同学分析得有道理. 我们在统计学中把分成的组的个数称为组数,每组两个端点的差称为组矩,如上表称为频数分布表.像上图那样用矩形高代表对应组频数的统计图称为频数分布直方图. 再思考一个问题:直方图中各个矩形之间为什么没有空隙呢? [生]因为在分组时,各组之间范围的端点数是连续的,而矩形的宽表示的就是组距,所以直方图各矩形之间没有空隙. [师]说得不错,这说明大家都动了脑筋了.在学习过程中就要不断地发现为什么,解决为什么? 其实直方图实际上是用矩形面积表示频数的.当矩形的宽相等时,可以用矩形的高表示频数. 这又出现了新问题,如果用矩形的面积表示频数的话,那么矩形的高又表示什么呢? [生]这个很简单呀!既然面积表示频数,宽表示组距,那么根据矩形面积公式,面积=高×宽,所以高则表示面积与宽的比值,即频数与组距的比值. [师]正确!有关这些知识我们将在以后的统计学中逐步学到.现在请同学们认真观察上面体育老师画的直方图,回答下列问题: 1.脉搏次数x在_________范围的学生最多,有________个. 2.脉搏次数x在135≤x<140范围的学生有________个. 3.脉搏次数x在150≤x<155范围的学生比在160≤x<165?范围的学生多还是少? 4.全班一共有________学生. [生]根据表与图可以看出: 1.脉搏次数x在155≤x<160范围的学生最多,有14个. 2.脉搏次数x在135≤x<140范围的学生有2个. 3.脉搏次数x在150≤x<155范围的学生比在160≤x<165范围的学生少.4.全班一共有1+2+4+6+9+14+11+2=49个学生.

颜色直方图

颜色直方图, HSV直方图, histogram bins 颜色特征是在图像检索中应用最为广泛的视觉特征,主要原因在于颜色往往和图像中所包含的物体或场景十分相关。此外,与其他的视觉特征相比,颜色特征对图像本身的尺寸、方向、视角的依赖性较小,从而具有较高的鲁棒性。 面向图像检索的颜色特征的表达涉及到若干问题。首先,我们需要选择合适的颜色空间来描述颜色特征;其次,我们要采用一定的量化方法将颜色特征表达为向量的形式;最后,还要定义一种相似度(距离)标准用来衡量图像之间在颜色上的相似性。在本节中,我们将主要讨论前两个问题,并介绍颜色直方图、颜色矩、颜色集、颜色聚合向量以及颜色相关图等颜色特征的表示方法。 1 颜色直方图 颜色直方图是在许多图像检索系统中被广泛采用的颜色特征。它所描述的是不同色彩在整幅图像中所占的比例,而并不关心每种色彩所处的空间位置,即无法描述图像中的对象或物体。颜色直方图特别适于描述那些难以进行自动分割的图像。 当然,颜色直方图可以是基于不同的颜色空间和坐标系。最常用的颜色空间是RGB颜色空间,原因在于大部分的数字图像都是用这种颜色空间表达的。然而,RGB空间结构并不符合人们对颜色相似性的主观判断。因此,有人提出了基于HSV空间、Luv空间和Lab空间的颜色直方图,因为它们更接近于人们对颜色的主观认识。其中HSV空间是直方图最常用的颜色空间。它的三个分量分别代表色彩(Hue)、饱和度(Saturation)和值(Value)。 计算颜色直方图需要将颜色空间划分成若干个小的颜色区间,每个小区间成为直方图的一个bin。这个过程称为颜色量化(color quantization)。然后,通过计算颜色落在每个小区间内的像素数量可以得到颜色直方图。颜色量化有许多方法,例如向量量化、聚类方法或者神经网络方法。最为常用的做法是将颜色空间的各个分量(维度)均匀地进行划分。相比之下,聚类算法则会考虑到图像颜色特征在整个空间中的分布情况,从而避免出现某些bin中的像素数量非常稀疏的情况,使量化更为有效。另外,如果图像是RGB 格式而直方图是HSV空间中的,我们可以预先建立从量化的RGB空间到量化的HSV空间之间的查找表(look-up table),从而加快直方图的计算过程。 上述的颜色量化方法会产生一定的问题。设想两幅图像的颜色直方图几乎相同,只是互相错开了一个bin,这时如果我们采用L1距离或者欧拉距离(见3.1.1节)计算两者的相似度,会得到很小的相似度值。为了克服这个缺陷,需要考虑到相似但不相同的颜色之间的相似度。一种方法是采用二次式距离[4](见3.1.3节)。另一种方法是对颜色直方图事先进行平滑过滤,即每个bin中的像素对于相邻的几个bin也有贡献。这样,相似但不相同颜色之间的相似度对直方图的相似度也有所贡献。 选择合适的颜色小区间(即直方图的bin)数目和颜色量化方法与具体应用的性能和效率要求有关。一般来说,颜色小区间的数目越多,直方图对颜色的分辨能力就越强。然而,bin的数目很大的颜色直方图不但会增加计算负担,也不利于在大型图像库中建立索引。而且对于某些应用来说,使用非常精细的颜色空间划分方法不一定能够提高检索效果,特别是对于不能容忍对相关图像错漏的那些应用。另一种有效减少直方图bin的数目的办法是只选用那些数值最大(即像素数目最多)的bin来构造图像特征,因为这些表示主要颜色的bin能够表达图像中大部分像素的颜色。实验证明这种方法并不会降低颜色直方图的检索效果。事实上,由于忽略了那些数值较小的bin,颜色直方图对噪声的敏感程度降低了,有时会使检索效果更好。两种采用主要颜色构造直方图的方法可以在文献[5,6]中找到。

一种基于直方图统计特征的直方图匹配算法的研究_朱磊

收稿日期:2004-01-21 作者简介:朱磊(1973— ),男,江苏南京人,工学博士,讲师,研究方向:多媒体信息处理与通信网络管理。文章编号:1003-6199(2004)02-0048-04 一种基于直方图统计特征的直方图匹配算法的研究 朱 磊 (解放军理工大学通信工程学院,江苏南京 210007) 摘 要:本文提出并验证了基于直方图统计特征的直方图匹配算法。直方图作为对图像 颜色或灰度分布的一种基本描述量,利用其统计特征进行直方图之间的相似性度量。实验结果表明,在获得相同查准率的情况下,利用直方图统计特征量测算的算法比经典的欧氏距离测算算法具有更高的查全率。 关键词:直方图;匹配算法;统计特征中图分类号:TP391 文献标识码:A The Application of Digital Library T echnology in the Integrated Management Platform for Military Information ZHU Lei (Institute of Communication Engineering ,PLAUST ,Nanjing ,210007,China ) Abstract :In this paper ,the histogram ’s matching that based on the histogram ’s statistical characteriza 2tion was put forward and implemented.As a basic descriptor of the distribution of color or gray ,histogram ’s statistical characterization was used to compute the similarity between each other.The experimental result in 2dicates that when compared with the classical Euclidean distance measure method ,the new matching algo 2rithm can achieve a higher recall and the same precision. K ey w ords :histogram ;matching algorithm ;statistical characterization 1 引言 在对图像颜色特征的描述上,直方图(his 2togram )是一个非常有效的工具。直方图描述了图像颜色的统计分布特征,且具有平移、尺度和旋转的不变性,因此在颜色检索中被广泛采用。经典的直方图匹配算法是计算直方图之间的欧氏距离,在这种计算方法中,对直方图之间的相似度测量是按照矢量距离测量的思路进行的。本文采用随机变量的数字特征分析方法,利用直方图的统计特征进行直方图之间的相似性度量,将直方图随机变量的均值、方差和K olmogorov -Smirnov 检测量结合起 来,利用三者的加权和来代替欧氏距离判决公式, 对两幅图像的直方图之间的相似性进行度量。本文对这部分的工作进行了实验比较,实验结果表明,在获得相同查准率的情况下,利用直方图统计特征量测算的算法比经典的欧氏距离测算算法具有更高的查全率。 2 基于随机变量统计特征的直方图匹配算法 灰度直方图是灰度级的函数,它表示图像中具有每种灰度级的像素的个数,反映图像中每种灰度出现的频率。如图1所示,灰度直方图的横坐标是灰度级,纵坐标是该灰度级出现的频率,是图像最 第23卷第2期2004年6月 计 算 技 术 与 自 动 化Computing Technology and Automation Vol 123,No 12 J un 12004

矿体投影图

矿体投影图 一般用正投影方法,将矿体边界线及其它有关内容,投影到某一理想平面上而构成的一类综合图件,称为矿体投影图。 按投影面的空间位置,常采用矿体纵投影图和水平投影图两种基本图件。较少采用将矿体边界线正投影到矿体平均倾斜平面上的投影方法编制的矿体倾斜平面投影图。 一般情况下,当矿床具有两个或多个矿体,为醒目起见常需按单个矿体分别编制矿体投影图。其作用和用途是表示矿体的整体分布轮廓和侧状方向,可看出对矿体的研究与控制程度,表明不同类别储量及不同类型或不同品级矿石的大致分布范围;开发勘探阶段还常用来表示采掘进度,是矿体勘探与开采工程布置的总体性图件;并常是开采块段法、地质块段法储量计算的基本图件。 采用何种投影方式编制图件,主要取决于矿体产状的陡缓。当矿体总体倾角较陡,大于45°时,一般常采用垂直投影面,作矿体纵投影图;当矿体倾角较缓小于45°,尤其是极缓倾斜、近于水平的矿体,则多作矿体水平投影图。其比例尺视矿体规模和要求而定,一般为1∶500~1∶1000。 图上应表示的内容有 (1)坐标网(水平投影图)或坐标线与标高水平线(垂直投影图)。 (2)勘探线。探矿工程、样线及其编号[其中钻孔可表示出见矿深度或矿层底板标高或所截矿体(层)中点深度或标高]。 (3)矿体(层)厚度、平均品位、矿心采取率。

(4)火成岩体与围岩界限,破坏矿体(层)的主要构造线(带)。 (5)生产坑道(井)的位置及其采掘边界,废坑道(井)的位置和采空区(或可能的采空区)。 (6)储量计算边界线及与确定边界线有关的因素(如河流、铁路、大的厂房建筑区等)。 (7)不同矿石类型、品级与储量级别和矿体(层)氧化带、混合带、原生带的界线。 (8)矿段的界线及各块段的平均厚度、平均品位(包括主要元素与伴生元素)、面积(据储量计算方法而定)、体积、储量数字,以上内容可采用图示或列表。(9)在水平投影图上一般要画出矿层底板等高线。 (10)储量计算成果汇总表。 2.2 作图方法 矿体(层)垂直纵投影图的投影面是矿体(层)平均走向,即平行勘探基线方向的垂直理想面,如果矿体(层)延伸很长,勘探基线转折,应作分段展开投影,并标出转折点与分段基线方位。水平投影图是矿体(层)在理想水平面上的投影。当矿体(层)形态及产状发生很大变化时,应将矿体(层)在平面上的重叠或缺失部分用特殊的线条标出。比例尺原则上与勘探线剖面图或地质图一致。 当矿区具有两个以上矿体(层)或不同的矿体(层)时,应分别编制投影图。 矿体纵投影图与矿体水平投影图的作图方法基本相似:前者是先将勘探工程与揭露矿体的中心线交切点投影到一个平行矿体总体走向的沿垂平面上,再圈定矿体

颜色特征提取

颜色特征提取 颜色特征是在图像检索中应用最为广泛的视觉特征,主要原因在于颜色往往和图像中所包含的物体或场景十分相关。此外,与其他的视觉特征相比,颜色特征对图像本身的尺寸、方向、视角的依赖性较小,从而具有较高的鲁棒性。 面向图像检索的颜色特征的表达涉及到若干问题。首先,我们需要选择合适的颜色空间来描述颜色特征;其次,我们要采用一定的量化方法将颜色特征表达为向量的形式;最后,还要定义一种相似度(距离)标准用来衡量图像之间在颜色上的相似性。在本节中,我们将主要讨论前两个问题,并介绍颜色直方图、颜色矩、颜色集、颜色聚合向量以及颜色相关图等颜色特征的表示方法。 1 颜色直方图 颜色直方图是在许多图像检索系统中被广泛采用的颜色特征。它所描述的是不同色彩在整幅图像中所占的比例,而并不关心每种色彩所处的空间位置,即无法描述图像中的对象或物体。颜色直方图特别适于描述那些难以进行自动分割的图像。 当然,颜色直方图可以是基于不同的颜色空间和坐标系。最常用的颜色空间是RGB颜色空间,原因在于大部分的数字图像都是用这种颜色空间表达的。然而,RGB空间结构并不符合人们对颜色相似性的主观判断。因此,有人提出了基于HSV 空间、Luv空间和Lab空间的颜色直方图,因为它们更接近于人们对颜色的主观认识。其中HSV空间是直方图最常用的颜色空间。它的三个分量分别代表色彩(Hue)、饱和度(Saturation)和值(Value)。 计算颜色直方图需要将颜色空间划分成若干个小的颜色区间,每个小区间成为直方图的一个bin。这个过程称为颜色量化(color quantization)。然后,通过计算颜色落在每个小区间内的像素数量可以得到颜色直方图。颜色量化有许多方法,例如向量量化、聚类方法或者神经网络方法。最为常用的做法是将颜色空间的各个分量(维度)均匀地进行划分。相比之下,聚类算法则会考虑到图像颜色特征在整个空间中的分布情况,从而避免出现某些bin中的像素数量非常稀疏的情况,使量化更为有效。另外,如果图像是RGB格式而直方图是HSV空间中的,我们可以预先建立从量化的RGB空间到量化的HSV空间之间的查找表(look-up table),从而加快直方图的计算过程。 上述的颜色量化方法会产生一定的问题。设想两幅图像的颜色直方图几乎相同,只是互相错开了一个bin,这时如果我们采用L1距离或者欧拉距离(见3.1.1节)计算两者的相似度,会得到很小的相似度值。为了克服这个缺陷,需要考虑到相似但不相同的颜色之间的相似度。一种方法是采用二次式距离[4](见3.1.3节)。另一种方法是对颜色直方图事先进行平滑过滤,即每个bin中的像素对于相邻的几个bin 也有贡献。这样,相似但不相同颜色之间的相似度对直方图的相似度也有所贡献。 选择合适的颜色小区间(即直方图的bin)数目和颜色量化方法与具体应用的性能和效率要求有关。一般来说,颜色小区间的数目越多,直方图对颜色的分辨能力就越强。然而,bin的数目很大的颜色直方图不但会增加计算负担,也不利于在大型图像库中建立索引。而且对于某些应用来说,使用非常精细的颜色空间划分方法不一定能够提高检索效果,特别是对于不能容忍对相关图像错漏的那些应用。另一

直方图使用中的常见问题

直方图使用中的常见问题 直方图是用来整理计量值的观测数据,分析其分布状态的统计方法,用于对总体的分布特征进行推断。直方图的作用如下: (1)检验数据分布的类型,分析数据是否服从正态分布,判断数据有无异常; (2)与产品规格界限做比较,可直观地判断分布中心是否偏离规格中心,以确定是否需要调整并求出其调整量;还可判断数据分布的散差(分布范围)是否满足规格范围的要求,以确定是否采取缩小散差的技术性措施; (3)用于进行过程能力调查和不合格品率估计; (4)客观地反映操作者的技术水平和主观努力程度。 直方图在过程能力调查中应用十分广泛;但在应用中也常常出现许多问题。 1.对直方图的作用理解不够 当在过程能力调查过程中,我们常常利用直方图整理讲理值的观测数据,用以分析其分布状态,但有时根据观测数据绘制的直方图呈非正态的异常分布。这说明数据已出现了异常。如果在这种状态下,仍旧要继续计算样本平均值、样本标准偏差和过程能力指数,则说明他们对直方图检验数据是否服从正态分布的作用理解不够。这种现象时有发生,应予纠正。 我们知道,只要有足够的数据,即使不画直方图也能计算过程能力指数,但如果不画直方图就无法判断数据分布的正态性,而过程能力指数计算的基础条件是数据必须服从正态分布;如果通过画直方图判断分布不属正态分布,就不能再继续进行相应计算。而应先分析数据异常的原因,予以排除后,再重新收集数据,经画直方图确认属正态分布后,才能计算过程能力指数。 2.样本容量太小 在绘制直方图前抽取的样本容量要适当,但在现场有时可以看到:抽取的样本仅有10-40个数据,就根据这少量观测值绘制直方图,用以分析,其结果误差很大,不宜提倡。 直方图在理论上属于大样本的分析方法,其样本容量要求n<50(一般经常采用n=50-100)。对于抽取数据比较容易的,最好多抽取些数据。

垂直投影图(纵投影图)的编绘方法

垂直投影图(纵投影图)的编绘方法 垂直投影图(纵投影图)的编绘方法 1.投影面方位,一般与矿体的平均走向线平行,即应垂直于矿体的勘探线。两者不 一致时,以后者为主。 2.投影图的基本线条为标高线与勘探线,标高线应与勘探线剖面图上的标高线一致。 当投影图方位与勘探线方向正交时,勘探线在图上为铅垂线,其在图上的间距,即为勘探 线的实际间距。当勘探线方向不与投影图正交时,应根据不同情况,分别按下述方法处理: (1)当一组正交于投影图方位的勘探线中夹有一条斜交于投影图方位的勘探线时,该勘 探线与矿体投影基准面的交切线在投影图上的迹线,是一条斜线,甚至斜曲线(当矿体投影 基准面的倾斜自地表至深部有变化时,为斜曲线)。矿体倾斜愈缓,该斜线的斜度愈大。一 般可以用下列方法之一得出: ①依下列公式计算出偏斜勘探线在垂直投影图上的倾伏角(即在投影图上,偏斜勘探线 与水平标高线之间的夹角)x : tgθ 式中: β——偏斜勘探线与垂直于投影面之勘探线之间的夹角; θ——矿脉垂直于投影面的平均倾角。 根据 X ,在投影图上,通过偏斜勘探线与矿体投影基准面的地表交点,画成斜线。 ②用作图法:即在地表及不同水平剖面上,求得矿体投影基准面与该偏斜勘探线及其 相邻勘探线的交点,如图Ⅶ一 25.图中Ⅱ、Ⅳ为正交于投影面的勘探线,Ⅲ为偏斜勘探线, A 、C 、B 为在 2500 米水平上矿体投影基准面分别与Ⅱ,Ⅲ,Ⅳ勘探线的交点,A ′CB ′ 为平行矿体平均走向方向线,CA ′为 C 点至Ⅱ勘探线的垂直距离,自水平剖面上求得 C 点,依 CA ′落 C 点于垂直投影图的 2500 米水平,其他水平类推,即得Ⅲ勘探线的投影迹 线。一般情形下,只按矿体平均倾斜作一个水平剖面图,取得该水平面上的交点 C ,连结 地表及该交点而取一直线,不必联成折线或曲线。 应注意几个问题: tgβ X=90°- ar ctg (7-16)

相关文档