搜档网
当前位置:搜档网 › OPENCV统计应用 直方图等化

OPENCV统计应用 直方图等化

OPENCV统计应用 直方图等化
OPENCV统计应用 直方图等化

OpenCV统计应用-直方图等化

直方图等化(Histogram Equalization)为一种使用统计方法的影像处理程序设计,它的功能为将统计直方图的色彩分布平均的打散在直方图里,也就是说,让一张图的直方图分布均匀化,同样的也是使用到LUT(Look-up Table)的方法

而在设计直方图等化不可或缺的就是需要先知道统计学的机率密度函数(Probability Density Function,PDF)以及累积分配函数(Cumlative Distribution Function,CDF)相关的基本概念,在这边会简单的说明机率密度函数及累积分配函数的概念还有直方图等化的程序设计实作,而OpenCV也提供了直接使用直方图等化的函式,cvEqualizeHist(),下面就简单的制作直方图等化的程序设计

RGB结构直方图等化

#include

#include

#include

int main()

{

IplImage*Image1;

IplImage*Image2;

IplImage*RedImage;

IplImage*GreenImage;

IplImage*BlueImage;

Image1=cvLoadImage("DarkClouds.jpg",1);

Image2=cvCreateImage(cvGetSize(Image1),IPL_DEPTH_8U,3);

RedImage=cvCreateImage(cvGetSize(Image1),IPL_DEPTH_8U,1);

GreenImage=cvCreateImage(cvGetSize(Image1),IPL_DEPTH_8U,1);

BlueImage=cvCreateImage(cvGetSize(Image1),IPL_DEPTH_8U,1);

cvSplit(Image1,BlueImage,GreenImage,RedImage,0);

cvEqualizeHist(BlueImage,BlueImage);

cvEqualizeHist(GreenImage,GreenImage);

cvEqualizeHist(RedImage,RedImage);

cvMerge(BlueImage,GreenImage,RedImage,0,Image2);

cvNamedWindow("DarkClouds",1);

cvShowImage("DarkClouds",Image1);

cvNamedWindow("Equalize DarkClouds",1);

cvShowImage("Equalize DarkClouds",Image2);

cvWaitKey(0);

}

原始图片:

执行结果:

当然,使用了函式之后就完全不用知道直方图等化在跑什么啦,cvEqualizeHist()只支持单信道uchar型别的图片数据结构,因此,就需要用cvSplit()分割,而这里所做的是将RGB三原色直接做直方图等化,这个直方图等化的结果是彩色的,将个别的RGB直分割后再用cvMerge()合并,通道分割与合并的部份就要参考"数据结构操作与运算-信道的分割,合并与混合"这个地方了.

再来就是比较复杂的直方图等化算法,要知道直方图等化如何计算就要知道以下的步骤

1.数据结构初始化

2.机率密度函数(PDF)的计算

3.累积分配函数(CDF)的计算

4.LUT对应

在机率密度函数的部分,在统计直方图来讲,它的X轴范围会落在0~255,而它的Y轴范围代表着机率,由0~255对应的数据代表着它发生的机率,也就是说,这代表着0到255数值出现的机率分布,0~255代表着所有的机率的范围,那从0加到255的总和会为1!它所代表的公式如下

PDF机率分布

而累积分配函数就更简单了,它只是将机率密度函数做累积的计算,也就是说,当数值为255的时候它的机率会为1,而且曲线会是由下往上的成长,表达的方式就是将机率密度函数做累加,它的公式如下

CDF机率分布

再来是LUT的部份了,它只是开一个0~255的数组做对应,将累积分配函数的数值乘以255,将它存放在0~255的数组里,这样会出现许多重复的部份,因此,将Look-up table对应原来的图形的灰阶值,就可以将原本的统计直方图分布打散掉了,而且直方图等化的结果也会发现很多地方数值是空心的,也是因为如此,直方图的分布就会向外推挤了

累积分配直方图乘255存在LUT数组的情况

再来,就是直方图等化的程序了

灰阶直方图等化

#include

#include

#include

int HistogramBins=256;

float HistogramRange1[2]={0,255};

float*HistogramRange[1]={&HistogramRange1[0]};

float CumulativeNumber;

float CDFArray[256];

uchar LookupTableData[256];

void DrawHistogramImage(CvHistogram*Histogram,IplImage*HistogramImage,int HistogramBins);

int main()

{

IplImage*Image1;

IplImage*Image2;

CvHistogram*Histogram1;

CvHistogram*Histogram2;

CvMat*LookupTableMatrix;

IplImage*GrayHistogramImage;

IplImage*EqualizeHistogramImage;

Image1=cvLoadImage("DarkClouds.jpg",0);

Image2=cvCreateImage(cvGetSize(Image1),IPL_DEPTH_8U,1);

Histogram1=cvCreateHist(1,&HistogramBins,CV_HIST_ARRAY,HistogramRange);

Histogram2=cvCreateHist(1,&HistogramBins,CV_HIST_ARRAY,HistogramRange);

LookupTableMatrix=cvCreateMat(1,256,CV_8UC1);

GrayHistogramImage=cvCreateImage(cvSize(256,250),IPL_DEPTH_8U,3);

EqualizeHistogramImage=cvCreateImage(cvSize(256,250),IPL_DEPTH_8U,3);

GrayHistogramImage->origin=1;

EqualizeHistogramImage->origin=1;

cvCalcHist(&Image1,Histogram1);

DrawHistogramImage(Histogram1,GrayHistogramImage,HistogramBins);

//Probability Density Function(PDF)

cvNormalizeHist(Histogram1,1);

//End

//Cumulative Distribution Function(CDF)

CumulativeNumber=0;

for(int i=0;i

{

CumulativeNumber=CumulativeNumber+cvQueryHistValue_1D(Histogram1,i);

CDFArray[i]=CumulativeNumber;

}

//End

//Make Look-up Table

printf("Look-up Table Number:\n");

for(int i=0;i

{

LookupTableData[i]=(uchar)(255*CDFArray[i]);

printf("%f\n",(255*CDFArray[i]));

}

//End

cvSetData(LookupTableMatrix,LookupTableData,CV_AUTOSTEP);

cvLUT(Image1,Image2,LookupTableMatrix);

cvCalcHist(&Image2,Histogram2);

DrawHistogramImage(Histogram2,EqualizeHistogramImage,HistogramBins);

cvNamedWindow("DarkClouds",1);

cvNamedWindow("Equalize DarkClouds",1);

cvNamedWindow("Gray Histogram",1);

cvNamedWindow("Equalize Histogram",1);

cvShowImage("DarkClouds",Image1);

cvShowImage("Equalize DarkClouds",Image2);

cvShowImage("Gray Histogram",GrayHistogramImage);

cvShowImage("Equalize Histogram",EqualizeHistogramImage);

cvWaitKey(0);

}

void DrawHistogramImage(CvHistogram*Histogram,IplImage*HistogramImage,int HistogramBins) {

CvPoint Point1;

CvPoint Point2;

for(int i=0;i

{

Point1=cvPoint(i,(int)(cvQueryHistValue_1D(Histogram,i)/20));

Point2=cvPoint(i,0);

cvLine(HistogramImage,Point1,Point2,CV_RGB(127,127,127));

}

}

执行结果:

前面数据结构初始化的部份,分别制造了两个IplImage图形数据结构,两个CvHistogram直方图数据结构,一个Look-up table对应矩阵结构,两个直方图图形输出的数据结构,并且将它做基本的设定,在用cvCalcHist()放入图形的数据,绘制出灰阶直方图的图形,再来,利用cvNormalizeHist()计算器率密度函数(PDF),机率密度函数有一条规则,所有机率的总和为1,因此,利用cvNormalizeHist()很快的就可以把机率密度函数算出,而在做累积分配直方图,则是用for循环慢慢的累加,制造Look-up Table的时候,则是让它乘以255并且给它用uchar型别转换,将转换后的结果存到CvMatrix数据结构里,在用cvLUT()函式做对应,因此均化的灰阶图片就这样被制造出来啦.

cvEqualizeHist()

将单信道8bits uchar型别的图片做直方图等化的算法,输入为单信道uchar型别的IplImage数据结构,输出为直方图等化后单信道uchar型别IplImage数据结构

cvEqualizeHist(输入单信道uchar型别IplImage数据结构,输出单信道uchar型别数据结构)

高中数学频率分布直方图

频率分布直方图 作频率分布直方图的方法为:(1)把横轴分成若干段,每一线段对应一 个组的组距;(2)以此线段为底作矩形,它的高等于该组的组距 频率 ,这 样得出一系列的矩形;(3)每个矩形的面积恰好是该组上的频率. 频率折线图:如果将频率分布直方图中各相邻的矩形的上底边的中点顺次连接起,就得到一条折线,称这条折线为本组数据的频率折线图. 作茎叶图的方法是:将所有两位数的十位数字作为“茎”,个位数字作为“叶”,茎相同者共用一个茎,茎按从小到大的顺序从上向下列出,共茎的叶一般按从大到小(或从小到大)的顺序同行列出. 知识点1:利用频率分布直方图分析总体分布 例题1: 2000辆汽车通过某一段公路时的时速的频率分布直方图如右图所示,时速在[50,60)的汽车大约有 A .30辆 B .60辆 C .300辆 D .600辆 变式:某工厂对一批产品进行了抽样 检测.右图是根据抽样检测后的产品 净重(单位:克)数据绘制的频率分布直方图,其中产品净重的范围是 [96,106],样本数据分组为[96,98), [98,100),[100,102),[102,104),[104,106],已知样本中产品净重小于100克的个数是36,则样本中净重大于或等于98克并且小于104克的产品的个数是 A.90 B.75 C. 60 D.45 变式:某初一年级有500名同学,将他们的 身高(单位:cm )数据绘制成频率分布直方图(如图),若要从身高在 [)120,130,[)130,140,[]140,150三 组内的学生中,用分层抽样的方法选取 30人参加一项活动,则从身高在 [)130,140内的学生中选取的人数 为 . 知识点2:用样本分估计总体 例题2某市2010年4月1日—4月30日对空气污染指数的监测数据如下(主要污染物为可吸入颗粒物): 61,76,70,56,81,91,92,91,75,81,88,67,101,103,95,91,77,86,81,83,82,82,64,79,86,85,75,7 1,49,45, 96 98 100 102 104 106 0.150 0.125 0.100 0.075 0.050 克 频率/组距 100 110 120 130 140 150 身高 频率|组距 0.005 0.010 0.020 a 0.035

数字图像处理实验报告

实验一灰度图像直方图统计 一、实验目的 掌握灰度图像直方图的概念和计算方法,了解直方图的作用和用途。提高学生编程能力,巩固所学知识。 二、实验内容和要求 (1)用Photoshop显示、了解图像平均明暗度和对比度等信息; (2)用MatLab读取和显示一幅灰度图像; (3)用MatLab编写直方图统计的程序。 三、实验步骤 1. 使用Photoshop显示直方图: 1)点击文件→打开,打开一幅图像; 2)对图像做增强处理,例如选择图像→调整→自动对比度对图像进行灰度拉伸,观察图像进行对比度增强前后的视觉变化。 3)利用统计灰度图像直方图的程序分别针对灰度拉伸前后的灰度图像绘制其灰度直方图,观察其前后的直方图变化。 2.用MatLab读取和显示一幅灰度图像; 3. 绘制图像的灰度直方图; function Display_Histogram()

Input=imread('timg.jpg'); figure(100); imshow(uint8(Input)); title('原始图像'); Input_Image=rgb2gray(Input); figure(200); imshow(uint8(Input_Image)); title('灰度图像'); sum=0; His_Image=zeros(1,256); [m,n]=size(Input_Image); for k=0:255 for I=1:m for j=1:n if Input_Image(I,j)==k His_Image(k+1)=His_Image(k+1)+1; end end end end figure(300); plot(His_Image); title('图像的灰度直方图'); 4.显示图像的灰度直方图。

OpenCV成长之路(8)直线、轮廓的提取与描述

OpenCV成长之路(8):直线、轮廓的提取与描述 分类:OpenCV成长之路2014-01-04 18:35 689人阅读评论(0) 收藏举报 直线、轮廓的提取与描述基于内容的图像分析的重点是提取出图像中具有代表性的特征,而线条、轮廓、块往往是最能体现特征的几个元素,这篇文章就针对于这几个重要的图像特征,研究它们在OpenCV中的用法,以及做一些简单的基础应用。 一、Canny检测轮廓 在上一篇文章中有提到sobel边缘检测,并重写了soble的C++代码让其与matlab中算法效果一致,而soble边缘检测是基于单一阈值的,我们不能兼顾到低阈值的丰富边缘和高阈值时的边缘缺失这两个问题。而canny算子则很好的弥补了这一不足,从目前看来,canny边缘检测在做图像轮廓提取方面是最优秀的边缘检测算法。 canny边缘检测采用双阈值值法,高阈值用来检测图像中重要的、显著的线条、轮廓等,而低阈值用来保证不丢失细节部分,低阈值检测出来的边缘更丰富,但是很多边缘并不是我们关心的。最后采用一种查找算法,将低阈值中与高阈值的边缘有重叠的线条保留,其他的线条都删除。 本篇文章中不对canny的算法原理作进一步说明,稍后会在图像处理算法相关的文章中详细介绍。 下面我们用OpenCV中的Canny函数来检测图像边缘 1.int main() 2.{ 3. Mat I=imread("../cat.png"); 4. cvtColor(I,I,CV_BGR2GRAY); 5. 6. Mat contours; 7. Canny(I,contours,125,350); 8. threshold(contours,contours,128,255,THRESH_BINARY); 9. 10. namedWindow("Canny"); 11. imshow("Canny",contours);

matlab图像处理图像灰度变换直方图变换

附录1 课程实验报告格式 每个实验项目包括:1)设计思路,2)程序代码,3)实验结果,4)实验中出现的问题及解决方法。 实验一:直方图灰度变换 A:读入灰度图像‘debye1.tif’,采用交互式操作,用improfile绘制一条线段的灰度值。 imread('rice.tif'); imshow('rice.tif'),title('rice.tif'); improfile,title('主对角线上灰度值')

B:读入RGB图像‘flowers.tif’,显示所选线段上红、绿、蓝颜色分量的分布imread('flowers.tif'); imshow('flowers.tif'),title('flowers.tif'); improfile,title('主对角线红绿蓝分量') C:图像灰度变化 f=imread('rice.png'); imhist(f,256); %显示其直方图 g1=imadjust(f,[0 1],[1 0]); %灰度转换,实现明暗转换(负片图像) figure,imshow(g1)%将0.5到0.75的灰度级扩展到范围[0 1] g2=imadjust(f,[0.5 0.75],[0 1]); figure,imshow(g2) 图像灰度变换处理实例: g=imread('me.jpg'); imshow(g),title('原始图片'); h=log(1+double(g)); %对输入图像对数映射变换 h=mat2gray(h); %将矩阵h转换为灰度图片

h=im2uint8(h); %将灰度图转换为8位图 imshow(h),title('转换后的8位图'); 运行后的结果: 实验二:直方图变换 A:直方图显示 I=imread('cameraman.tif'); %读取图像 subplot(1,2,1),imshow(I) %输出图像 title('原始图像') %在原始图像中加标题 subplot(1,2,2),imhist(I) %输出原图直方图 title('原始图像直方图') %在原图直方图上加标题运行结果如下:

opencv 椭圆检测识别并画出轮廓

*#include "stdafx.h" #include "cv.h" #include "highgui.h" using namespace cv; using namespace std; //标示符的可见范围 CvPoint2D32f GetCPoint(IplImage* imageFg,int maxX); void FitEllipseBlob(IplImage* imageFg); int main( int argc, char** argv ) { IplImage* pImg; //声明IplImage指针 //载入图像 pImg = cvLoadImage( "C:\\Users\\BB\Desktop\\bec\\OPENCV椭圆拟合定位椭圆中心点以及重心法定位程序\\OPENCV椭圆拟合定位椭圆中心点以及重心法定位程序\\特征中心点提取误差分析\\image.bmp", 1);//[[此处的argc==2是否需要改成argc==1?我改了之后才能运行成功。求大牛解惑]] // wmzzzz : 在"属性"|"debug"|里的command arguments 里加入参数(一个路径:要打开的文件路径) 这时argc==2 就合理了...可以试试多加几个 int pointX = 0; for (int i=0;i<19;i++) { pointX=60*i+30; cvEllipse(pImg,cvPoint(pointX,80),cvSize(19,20),-200,0,360,CV_RGB(255,255,255),-1,CV _AA,0); } IplImage* m_imageGray = cvCreateImage(cvSize(pImg->width,pImg->height),IPL_DEPTH_8U,1); IplImage* m_imageBw = cvCreateImage(cvSize(pImg->width,pImg->height),IPL_DEPTH_8U,1); cvCvtColor(pImg,m_imageGray,CV_RGB2GRAY); cvThreshold(m_imageGray,m_imageBw,128,255,CV_THRESH_BINARY); CvPoint2D32f pointXX; float XXX,YYY; for (int i = 0;i<19;i++) {

灰度图像直方图统计

1.灰度图像直方图统计实习报告 一、实习目的 在学习灰度图像直方图的概念、计算方法、性质和相关应用的基础上,应用Photoshop软件和编写灰度直方图统计程序,能初步掌握图像文件格式读写与图像数据处理,提高学生兴趣和编程能力,巩固所学知识。 二、实习内容 1.实习数据 E:\ 数字图像处理\实习一\Lena.raw 2.利用Photoshop显示图像的灰度直方图,从直方图上了解图像平均明暗度和对比度等信息。 3.要求利用C或C++语言编写灰度图像直方图统计的程序。 三、实习步骤 1.使用Photoshop显示直方图。 (1)点击“文件”-->“打开”,打开一幅图像,此处选取“lena.raw”; (2)点击“图像”-->“直方图”,显示图像的直方图;

(3)对图像做增强处理,例如选择“图像”-->“调整”-->“自动对比度”对图像进行灰度拉伸,然后再显示直方图,观察它的变化。 2.用C或C++编写显示直方图的程序。 具体代码如下: #include "stdio.h" #include "windows.h" void main() { FILE *fp; //文件类指针

fp=fopen("lena.raw","rb"); //打开二进制文件 if (fp==NULL) { printf("文件已损坏,请重新打开。 \n"); } else printf("文件已打开,已经生成.txt文档,请查看。\n"); BYTE PIXEL[512*512]; fread(PIXEL,1,512*512,fp);//二进制文件读取 fclose(fp);//关闭文件 int HistogramStat[256]; for(int i=0;i<256;i++) HistogramStat[i]=0;//赋初值 for (i=0;i<512*512;i++) { int a=PIXEL[i]; HistogramStat[a]++; } //统计像素个数 fp=fopen("灰度直方图.txt","rb"); fprintf(fp,"图像灰度,像素个数\n"); for (i=0;i<256;i++) { if (HistogramStat[i]!=0) fprintf(fp,"%5d,%5d\n",i,HistogramStat[i]); } fprintf(fp,"像素个数为0的已被省略。");//输出内容 } 四、思考题 1灰度直方图可以反映出一幅图像的哪些特性? 答:(1)表征了图像的一维信息。只反映图像中像素不同灰度出现的次数,而未反映像素所在的位置。即丢失了像素的位置信息。 (2)与图像之间的关系式多对一的映射关系。一幅图像唯一确定出与之对应的直方图,但不同的图像可能有相同的直方图。 (3)一幅图像可分为多个子区域,子图直方图之和为整图的直方图。 2灰度直方图有何用途?编程实现一种灰度直方图应用的程序。 答:(1)用于判断图像量化是否恰当。 (2)用于确定图像的二值化阈值。 (3)计算图像中物体的面积。 (4)计算图像信息量H(熵)。 3在本次实习的基础上,试编写直方图均衡的程序。 五、实习心得体会

OPENCV实现的轮廓检测与处理

// // The full "Square Detector" program. // It loads several images subsequentally and tries to find squares in // each image // #ifdef _CH_ #pragma package #endif #ifndef _EiC #include "cv.h" #include "highgui.h" #include #include #include #endif int thresh = 50; IplImage* img = 0; IplImage* img0 = 0; CvMemStorage* storage = 0; CvPoint pt[4]; const char* wndname = "Square Detection Demo"; // helper function: // finds a cosine of angle between vectors // from pt0->pt1 and from pt0->pt2 double angle( CvPoint* pt1, CvPoint* pt2, CvPoint* pt0 ) { double dx1 = pt1->x - pt0->x; double dy1 = pt1->y - pt0->y; double dx2 = pt2->x - pt0->x; double dy2 = pt2->y - pt0->y; return (dx1*dx2 + dy1*dy2)/sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10); } // returns sequence of squares detected on the image. // the sequence is stored in the specified memory storage CvSeq* findSquares4( IplImage* img, CvMemStorage* storage ) { CvSeq* contours; int i, c, l, N = 11; CvSize sz = cvSize( img->width & -2, img->height & -2 ); IplImage* timg = cvCloneImage( img ); // make a copy of input image

频率分布直方图

2.2.2频率分布直方图与折线图 【教学内容】 频率分布直方图的定义及绘制,折线图的绘制 【教学要求】 1.使学生了解频率分布直方图的定义及组成 2.掌握画频率法直方图的步骤,能正确画出频率直方图与折线图 【教学重点】 绘制频率直方图、条形图、折线图 【教学难点】 会根据样本频率分布或频率直方图去估计总体分布 【教法】 启发法,讲练结合,讨论式 【教学过程】 一.复习引入 (学生活动) 前面我们已经学过频率分布表,请同学们回答下列问题: 1.总体分布的频率、频数的概念 2.列频率分布表的一般步骤是什么? (引入)我们还学过一种更为直观地体现数据分布规律的方法—绘制频数条形图或频率直方图等。 二.讲授新课 (一)频数条形图 例1.下表是某校一个星期中收来的失物件数,请将5天中 收交来的失物数用条形图来表示。 解: (二)频率直观图 一般地绘制频率直观图的方法 1.把横轴分成若干段,每一线段对应一个组的组距; 2.然后以此线段为底作一矩形,它的高等于该组的频率/组距; 3.这样得出一系列的矩形,每个矩形的面积恰好是该组上的频率,这些矩形就构成了频率分布直方图。 例2. 我国是世界上严重缺水的国家之一,城市缺水问题较为突出。某市政府为了节约生活用水,计划在本市试行居民生活用水定额管理,即确定一个居民月用水量标准a ,用水量不超过a 的部分按平价收费,超出a 的部分按议价收费。如果希望大部分居民的日常生活不受影响,那么a 定为多少比较合理? 分析:先绘制频率分布表,在进行频率直方图的绘制 解:假设通过抽样,我们获得了100位居民的月均用水量(单位:t ) 星期 一 二 三 四 五 件数 6 2 3 5 1 累计 6 8 11 16 17

基于灰度直方图的图像分割阈值自适应选取方法

中北大学 毕业设计(论文)任务书 学院、系: 专业: 学生姓名:车永健学号: 设计(论文)题目:基于灰度直方图的图像分割阈值自适应选取方法 起迄日期: 2015年3月9日~2015年6月20日设计(论文)地点: 指导教师:郭晨霞 系主任: 发任务书日期:2015年 2 月25 日

任务书填写要求 1.毕业设计(论文)任务书由指导教师根据各课题的具体情况填写,经学生所在系的负责人审查、系领导签字后生效。此任务书应在毕业设计(论文)开始前一周内填好并发给学生; 2.任务书内容必须用黑墨水笔工整书写或按教务处统一设计的电子文档标准格式(可从教务处网页上下载)打印,不得随便涂改或潦草书写,禁止打印在其它纸上后剪贴; 3.任务书内填写的内容,必须和学生毕业设计(论文)完成的情况相一致,若有变更,应当经过所在专业及系主管领导审批后方可重新填写; 4.任务书内有关“学院、系”、“专业”等名称的填写,应写中文全称,不能写数字代码。学生的“学号”要写全号(如020*******,为10位数),不能只写最后2位或1位数字; 5.有关年月日等日期的填写,应当按照国标GB/T 7408—94《数据元和交换格式、信息交换、日期和时间表示法》规定的要求,一律用阿拉伯数字书写。如“2004年3月15日”或“2004-03-15”。

毕业设计(论文)任务书

毕业设计(论文)任务书 3.对毕业设计(论文)课题成果的要求〔包括毕业设计(论文)、图纸、实物样品等): 1、论文一份; 2、程序代码及图像结果; 3、英文翻译一份。 4.毕业设计(论文)课题工作进度计划: 起迄日期工作内容 2015年 3月 9 日~ 3 月20日 4 月 1 日~ 4月 20 日 4 月 21 日~ 5月 10 日 5 月 11 日~ 6月 15 日 6 月 16 日~ 6月 19 日查找资料,完成开题报告; 学习有关知识,方案确定,完成中期报告;完善算法并仿真验证; 撰写、修改、评阅毕业论文; 论文答辩 学生所在系审查意见: 系主任: 年月日

基于OpenCV的边缘检测算法在车身尺寸检测中的应用

万方数据

万方数据

万方数据

2010年6月中同制造、Ip信息化第39卷第11期 图2汽车车身部分原始图像1图4基于本文算法的处理结果1 图3汽车车身部分原始图像2图5基于本文算法的处理结果2 方便,具有广阔的应用前景。本文针对灰度分布不 均匀的图像,首先,通过对图像开窗后进行局部灰参考文献: 碱∞∞Pan肌AnalysisandM8ch妇1n‘e11igence,1986,度变换来改进边缘检测的效果,对窗口交界处再开hiCannyJA.Ccmaputationalapproachtoedgedetection[J].IEEE 设几个很小的窗口实现拼接来去除窗口交界处的 皇假边缘;其次,詈用自适璺阈值的改进型Canny[2]8章(6毓)晋:67.图9-像69处8理.与分析[M】.|匕京:清华大学出版社,1999:算法动态地随图像梯度幅值变化而变化。通过试懈一枷 验证明,本文的方法对于不同噪声干扰和光照背景[3]杨枝灵,王开.WLsualc++数字图像获取、处理及实践应下的图像,能够获得较好的处理效果,其抗噪性能用[M].北京:人民邮电出版社,2003:553—572. 好,定位精度高。利用该算法对汽车图像进行边缘[4]刑果?戚文芽,李萍,等?灰度图像的自适应边缘检测 [J].计算机工程与应用,2007,43(5):63—66? 检测,检测出的汽车边缘连续、清晰。 ApplicationofOpenCV——basedEdgeDetectionAgorithm intheVehicle——bodyDimensionDetection CHENWei—li,TANG/-Ion,GENGYah—biao (NorthwesternPolytechnicalUniversity,ShaanxiXi’aJl,710072,China) Abstract:Itmainlyintroducesthesolutiontoimprovetheefficiencyoftheedgedetection,whichcombinesthe detectionalgorithmofthestatisticalimagewindowcalculationwiththeenhancedCannyedgedetectionalgo—rithm.ItusesOpenCVdatabase雒basicfunctionlibraryandappliesthisagorithmtothevehicle—bodydi—mensiondetection.Thetestresultsshowthattheprocessingofedgedetectionismoreeffectiveandquicker.Keywords:Edge——detection;ImageProcess;Vehicle——bodyDimension 万方数据

频率分布直方图题型归纳-邓永海

频率分布直方图题型归纳- 邓永海 -标准化文件发布号:(9556-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII

频率分布直方图题型归纳 1.频率、频数、样本容量三个量产生的知二求一 2.补全频率分布表 3.做频率分布直方图 4.性质“面积和为1”的应用,补全直方图 5.与分层抽样、数列等知识综合 6.估计总体的频率分布,区间内的频数问题 【例1】14.I2[2012·山东卷] 如图1-4是根据部分城市某年6月份的平均气温(单位:℃)数据得到的样本频率分布直方图,其中平均气温的范围是[20.5,26.5],样本数据的分组为[20.5,21.5),[21.5,22.5),[22.5,23.5),[23.5,24.5),[24.5,25.5),[25.5,26.5].已知样本中平均气温低于22.5℃的城市个数为11,则样本中平均气温不低于25.5℃的城市个数为________. 14.9[解析] 本题考查频率分布直方图及样本估计总体的知识,考查数据处理能力, 容易题. 样本容量= 11 1×(0.10+0.12) =50,样本中平均气温不低于25.5℃的城市个数为 50×1×0.18=9. 【例2】18.I2[2012·安徽卷] 若某产品的直径长与标准值的差的绝对值不超过 ...1 mm 时,则视为合格品,否则视为不合格品,在近期一次产品抽样检查中,从某厂生产的此种产品中,随机抽取5 000件进行检测,结果发现有50件不合格品.计算这50件不合格品的直径长与标准值的差(单位:mm),将所得数据分组,得到如下频率分布表:

(1)将上面表格中缺少的数据填在答题卡... 的相应位置. (2)估计该厂生产的此种产品中,不合格品的直径长与标准值的差落在区间(1,3]内的概率; (3)现对该厂这种产品的某个批次进行检查,结果发现有20件不合格品,据此估算这批产品中的合格品的件数. 18.解:(1)频率分布表 (2)由频率分布表知,该厂生产的此种产品中,不合格品的直径长与标准值的差落在区间(1,3]内的概率约为0.50+0.20=0.70; (3)设这批产品中的合格品数为x 件, 依题意有505000=20x +20 , 解得x =5000×2050 -20=1 980. 所以该批产品的合格品件数估计是1 980件. 【例3】18.I2[2014·全国新课标卷Ⅰ] 从某企业生产的某种产品中抽取100件,测量这些产品的一项质量指标值,由测量结果得如下频数分布表: (1)在答题卡上作出这些数据的频率分布直方图; (2)估计这种产品质量指标值的平均值及方差(同一组中的数据用该组区间的中点值作代表); (3)根据以上抽样调查数据,能否认为该企业生产的这种产品符合“质量指标值不低于95的产品至少要占全部产品80%”的规定?

绘制数字图像灰度直方图实验报告MATLAB实现

数字图像处理 实验报告 实验一绘制直方图 学号 姓名 日期

实验一绘制直方图 一、实验内容 1、编程绘制数字图像的直方图。 2、直方图均衡处理。 二、实验步骤 1、设计思想或者流程图。 灰度直方图是将数字图像的所有像素,按照灰度值的大小,统计其所出现的频度。通常,灰度直方图的横坐标表示灰度值,纵坐标为半个像素个数,也可以采用某一灰度值的像素数占全图像素数的百分比作为纵坐标。 直方图均衡方法的基本原理是:对在图像中像素个数多的灰度值(即对画面起主要作用的灰度值)进行展宽,而对像素个数少的灰度值(即对画面不起主要作用的灰度值)进行归并。从而达到清晰图像的目的。 2、源程序并附上注释。 clear all %一,图像的预处理,读入彩色图像将其灰度化 PS=imread('1.jpg');%读入JPG彩色图像文件 imshow(PS)%显示出来 title('输入的彩色JPG图像') imwrite(rgb2gray(PS),'PicSampleGray.bmp');%将彩色图片灰度化并保存 PS=rgb2gray(PS);%灰度化后的数据存入数组 %二,绘制直方图 [m,n]=size(PS);%测量图像尺寸参数 GP=zeros(1,256);%预创建存放灰度出现概率的向量for k=0:255 GP(k+1)=length(find(PS==k))/(m*n);%计算每级灰度出现的概率,将其存入GP中相应位置 end figure,bar(0:255,GP,'g')%绘制直方图 title('原图像直方图') xlabel('灰度值') ylabel('出现概率') %三,直方图均衡化 S1=zeros(1,256); for i=1:256 for j=1:i S1(i)=GP(j)+S1(i);%计算Sk end end S2=round((S1*256)+0.5);%将Sk归到相近级的灰度for i=1:256 GPeq(i)=sum(GP(find(S2==i)));%计算现有每个灰度级出现的概率

最新Canny边缘检测与轮廓提取汇总

C a n n y边缘检测与轮 廓提取

摘要................................................................................................................................................... Abstract.......................................................................................................................................... I 1 绪论 0 2 设计内容与OpenCV简介 (1) 2.1 设计任务内容 (1) 2.2 OpenCV简介 (1) 3 理论分析 (2) 3.1 边缘检测 (2) 3.1.1 图像的边缘 (2) 3.1.2 边缘检测的基本步骤 (2) 3.2 轮廓提取 (3) 4 边缘检测的算法比较 (4) 4.1 Reborts算子 (4) 4.2 Sobel算子 (5) 4.3 Prewitt 算子 (5) 4.4 Kirsch 算子 (7) 4.5 LOG算子 (7) 4.6 Canny算子 (8) 5 实验仿真 (10) 5.1算法设计 (10) 5.2 实验结果 (11) 6 分析与总结 (12) 参考文献 (13) 附录 (14)

边缘检测是图像处理和计算机视觉中的基本问题,它的目的是标识出数字图像中亮度变化明显的点。图像经过边沿检测处理之后,不仅大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。 事实上,边缘存在于图像的不规则结构和不平稳现象中,也即存在于信号的突变点处,这些点给出了图像轮廓的位置。这些轮廓常常是我们在图像边缘检测时,所需要的非常重要的一些特征条件,这就需要我们对一幅图像检测并提取出它的边缘。 可用于图像边缘检测和轮廓提取的方法有很多,其中包括有常见的Robert边缘算子、Prewitt 边缘算子、Sobel边缘算子等等。本文首先将会从数字图像处理的角度,对几种边缘检测算法进行详细的分析,然后会并选择其中一种边缘检测算法进行实验。考虑到以后进一步的学习,本文将会使用openCV对算法进行实现。最后,本文将会把实验获得的实际效果,与理论分析的结果进行比对,并以此对本次实验进行总结。 关键字:边缘检测轮廓提取图像处理openCV

直方图 知识讲解

直方图知识讲解 责编:康红梅 【学习目标】 1. 会制作频数分布表,理解频数分布表的意义和作用; 2. 会画频数分布直方图,理解频数分布直方图的意义和作用. 【要点梳理】 要点一、组距、频数与频数分布表的概念 1.组距:每个小组的两个端点之间的距离(组内数据的取值范围). 2.频数:落在各小组内数据的个数. 3.频数分布表:把各个类别及其对应的频数用表格的形式表示出来,所得表格就是频数分布表.要点诠释: (1)求频数分布表的一般步骤:①计算最大值与最小值的差;②决定组距和组数; ③确定分点;④列频数分布表; (2)频数之和等于样本容量. (3)频数分布表能清楚、确切地反映一组数据的大小分布情况,将一批数据分组,一般数据越多,分的组也越多,当数据在100个以内时,按数据的多少,常分成5~12组,在分组时,要灵活确定 组距,使所分组数合适,一般组数为最大值-最小值 组距 的整数部分+1. 要点二、频数分布直方图 1.频数分布直方图:是以小长方形的面积来反映数据落在各个小组内的频数的大小,直方图由横轴、纵轴、条形图三部分组成. (1)横轴:直方图的横轴表示分组的情况(数据分组); (2)纵轴:直方图的纵轴表示频数; (3)条形图:直方图的主体部分是条形图,每一条是立于横轴之上的一个长方形、底边长是这个组的组距,高为频数. 2.作直方图的步骤: (1)计算最大值与最小值的差; (2)决定组距与组数; (3)列频数分布表; (4)画频数分布直方图. 要点诠释:(1)频数分布直方图简称直方图,它是条形统计图的一种. (2)频数分布直方图用小长方形的面积来表示各组的频数分布,对于等距分组的数据,可以用小长方形的高直接表示频数的分布. 【高清课堂:数据的描述 369923 直方图和条形图的联系与区别:】 3.直方图和条形图的联系与区别: (1)联系:它们都是用矩形来表示数据分布情况的;当矩形的宽度相等时,都是用矩形的高来表示数据分布情况的; (2)区别:由于分组数据具有连续性,直方图中各矩形之间通常是连续排列,中间没有空隙,而条形图中各矩形是分开排列,中间有一定的间隔;直方图是用面积表示各组频数的多少,而条形图是用矩形的高表示频数. 要点三、频数分布折线图 频数分布折线图的制作一般都是在频数分布直方图的基础上得到的,具体步骤是:首先取直方图中每一个长方形上边的中点;然后再在横轴上取两个频数为0的点(直方图最左及最右两边各取一个,它们分别与直方图左右相距半个组距);最后再将这些点用线段依次连接起来,就得到了频

四、灰度直方图是数字图像处理的重要工作。请简述灰度直方图规定化

四、灰度直方图是数字图像处理的重要工作。请简述灰度直方图规定化、均衡化的基本原理。并以分辨率为5*4,图像的深度6bit 的图像为例,自举例说明直方图均衡化的计算过程。 解答: 数字图像的直方图是作为图像每一个灰度级的统计概率分布"它提供了图像灰度分布的概貌,直方图增强技术正是利用修改给定图像直方图的方法来增强图像的,最后得到的图像增强程度取决于我们所采用的直方图。令变量r 和s 分别代表图像增强前后的像素灰度级,相应灰度级分布的概率密度分别为()r P r 和()s P s 。 为讨论方便,假设像素灰度值已经归一化在区间[0,1],在灰度级坐标中r=0表示黑,r=1表示白。对区间[0,1]内任一个r 值按变换函数: s = T(r) (1) 进行变换,T (r )满足两个条件:(1)单值单调递增函数;(2) 0≤T (r )≤1。 条件(1)使灰度级保持从黑到白的次序,条件(2)保证映射变换后像素灰度值在允许的范围内。从s 到r 的反变换为:1()r T s -=,0≤s ≤1。 (2) 同样,规定变量s 也满足条件(1)和(2)。由概率理论知,若()r P r 和变换函数s = T(r) 已知,1()r T s -=是单值单调增加函数,则有: 1() ()[P () ]s r r T s dr P s r ds -== (3) 直方图增强技术就是通过变换函数T (r )控制图像灰度级的概率密度函数而改变图像的外貌。 对于连续图像,变换函数为: ()(),01r r s T r P r dr r ==≤≤? (4) 此式右边为累积分布函数(CDF ),由该式对r 求导有: ()r ds P r dr = (5) 代入(3)得到: 1()1 ()[() ]1,01() r r T s r P s P r s P r -===≤≤ (6) 这说明,在变换后变量s 在定义域内, ()s P s 是均匀概率密度。在图像增强意义上,这 相当于像素的动态范围增加。 对于离散图像,灰度级k r 的概率值为: (),01,0,1,2, (1) r k k n P r r k L n = ≤≤=- (7) 其中,n 表示图像中像素的总数,k n 是在图像中出现这种灰度级的次数,L 表示灰度级

图像处理经典算法及OpenCV程序

基于opencv的use摄像头视频采集程序 (1) 基于opencv的两个摄像头数据采集 (3) 能激发你用代码做视频的冲动程序 (6) 图像反转(就是把黑的变白,白的变黑) (11) 图像格式的转换 (12) 从摄像头或者A VI文件中得到视频流,对视频流进行边缘检测 (13) 采用Canny算子进行边缘检测 (15) 角点检测 (18) 图像的旋转加缩放(效果很拽,用地球做就像谷歌地球似的) (21) Log-Polar极坐标变换 (22) 对图像进行形态学操作(图像的开闭,腐蚀和膨胀运算) (24) 用不同的核进行图像的二维滤波 (27) 图像域的填充 (30) 寻找轮廓实现视频流的运动目标检测(超推荐一下) (35) 采用金字塔方法进行图像分割 (40) 图像的亮度变换 (43) 单通道图像的直方图 (46) 计算和显示彩色图像的二维色调-饱和度图像 (48) 图像的直方图均匀化 (50) 用Hongh变换检测线段 (52) 利用Hough变换检测圆(是圆不是椭圆) (57) 距离变换 (59) 椭圆曲线拟合 (64) 由点集序列或数组创建凸外形 (68) Delaunay三角形和V oronoi划分的迭代式构造 (71) 利用背景建模检测运动物体(推荐) (78) 运动模板检测(摄像头) (81) 显示如何利用Camshift算法进行彩色目标的跟踪 (86) 基于opencv的use摄像头视频采集程序 准备工作:你得把opencv库装到电脑上,并把各种头文件,源文件,lib库都连到vc上,然后设置一下系统环境变量,这里这方面就不说了,好像我前面的文章有说过,不懂也可百度一下。 建立一个基于WIN32控制台的工程CameraUSB,在新建一个c++元文件,写代码: #include "cxcore.h" #include "cvcam.h" #include "windows.h" #include "highgui.h"

实验-数字图像的直方图统计

实验二数字图像的直方图统计 一、实验目的 1.了解对灰度图像进行直方图统计的基本原理; 2.掌握用VC编程实现直方图统计的方法; 3.在微机上调试程序; 5. 分析数字图像直方图的特点。 二、实验原理 图像的直方图 图像的(灰度统计)直方图是一个一维的离散函数。它的定义为: 设s k为图像f(x,y)的第k级灰度值,n k是f(x,y)中具有灰度值s k的象素的个数,n是图像象素总数,则: p s(s k)= n k/n k=0,1, ,L-1 称为图像f(x,y)的直方图。 这里p s(s k)代表原始图中第k个灰度级的出现概率。以n k为自变量,以p s(s k)为函数,得到的曲线就是图像的直方图,在实际中常常直接将对第k个灰度级的统计值n k作为图像的直方图。 它提供了原图灰度值的分布情况,也可以说给出了一幅图所有灰度值的整体描述。 对灰度图像进行直方图统计的程序流程图如图2-1所示。 图2-1 灰度图像直方图统计流程 三、实验前准备 1.预习本实验中关于数字图像直方图统计的有关内容; 2. 预习VC中添加对话框的步骤和方法; 3.了解本实验的目的和实验内容。 四、实验内容 1.在实验一的基础上读入并显示一幅数字图像; 2.编写对灰度图像进行直方图统计的程序,并将结果显示在屏幕上。 五、实验报告要求 1.总结对灰度图像进行直方图统计的过程,比较不同的图像其直方图特性;

2.对实验结果进行分析。 六、参考步骤和程序 在实验一的基础上,进行如下操作: 1、点击ResourceView,右键点击Dialog,选Insert Dialog 在属性对话框中将ID改为 ID_HIST,对话框名称改为“直方图” 2、在工具栏中点“插入”-“新建类”,输入类名,并选Base Class为CDialog,Dialog ID为 ID_HIST。这样就将对话框和类联系起来了,在该对话框中拖入一Edit控件,将其ID 设为IDC_HISTSHOW; 3、快捷键“Ctrl+W”,出现MFC ClassWizard对话框,在Messages栏中分别选 WM_INITDIALOG和WM_Paint,再点击“Add Function”,即将对话框初始化和画图函数加入对话框类之中。 4、在Hist.h文件“public:”下面输入如下变量定义: LONG m_lCount[256]; char* m_lpDIBBits; LONG m_lWidth; LONG m_lHeight; int m_iIsDraging; CDlgIntensity(CWnd* pParent = NULL); 5、打开Hist.cpp程序,在CHist::OnInitDialog()函数中“// TODO: Add extra initialization here” 前将如下代码拷贝进去: unsigned char* lpSrc; LONG i; LONG j; 6、在“// TODO: Add extra initialization here”后将如下代码拷贝进去: CWnd* pWnd=GetDlgItem(IDC_HISTSHOW); pWnd->GetClientRect(m_MouseRect); pWnd->ClientToScreen(&m_MouseRect); CRect rect; GetClientRect(rect); ClientToScreen(&rect); m_MouseRect.top-=rect.top; m_MouseRect.left-=rect.left; m_MouseRect.top+=25; m_MouseRect.left+=10; m_MouseRect.bottom=m_MouseRect.top+255; m_MouseRect.right=m_MouseRect.left+256; for(i=0;i<256;i++) { m_lCount[i]=0;

OpenCV Haar人脸检测的代码分析

OpenCV Haar人脸检测的代码分析 /* cascade or tree of stage classifiers */ int flags; /* signature */ int count; /* number of stages */ CvSize orig_window_size; /* original object size (the cascade is trained for) */ /* these two parameters are set by cvSetImagesForHaarClassifierCascade */ CvSize real_window_size; /* current object size */ double scale; /* current scale */ CvHaarStageClassifier* stage_classifier; /* array of stage classifiers */ CvHidHaarClassifierCascade* hid_cascade; /* hidden optimized representation of the cascade, created by cvSetImagesForHaarClassifierCascade */ 所有的结构都代表一个级联boosted Haar分类器。级联有下面的等级结构: Cascade: Stage1: Classifier11: Feature11 Classifier12:

Feature12 ... Stage2: Classifier21: Feature21 ... ... 全部等级可以手农构修,也可以应用函数cvLoadHaarClassifierCascade从已有的磁盘文件或嵌进式基中导进。特征检测用到的函数: cvLoadHaarClassifierCascade 从文件中装载练习佳的级联分类器或者从OpenCV中嵌入的分类器数据库中导入 CvHaarClassifierCascade* cvLoadHaarClassifierCascade( const char* directory, CvSize orig_window_size ); directory :练习的级联分类器的门路 orig_window_size:级联分类器训练中采取的检测目标的尺寸。由于这个信息没有在级联分类器中存储,所有要共同指出。 函数cvLoadHaarClassifierCascade 用于从文件中装载训练赖的利用海尔特点的级联分类器,或者从OpenCV中嵌入的分类器数据库中导入。分类器的训练可以利用函数haartraining(具体观察

相关主题