数字图像处理实验教程-V3.1-zsj(7)

2019-04-15 13:51

数字图像处理实验教程 V3.1

方图

histimg = cvCreateImage( cvSize(320,200), 8, 3 ); cvZero( histimg );

cvCalcHist( &src, hist, 0, 0 ); // 计算直方图

cvGetMinMaxHistValue( hist, 0, &max_val, 0, 0 ); // 只找最大值

cvConvertScale( hist->bins, hist->bins, max_val ? 255. / max_val : 0., 0 ); // 缩放 bin 到区间 [0,255] cvZero( histimg );

bin_w = histimg->width / hdims; // hdims: 条的个数,则 bin_w 为条的宽度

// 画直方图

for( i = 0; i < hdims; i++ ) {

double val = ( cvGetReal1D(hist->bins,i)*histimg->height/255 ); CvScalar color = CV_RGB(255,255,0); //(hsv2rgb(i*180.f/hdims); cvRectangle( histimg, cvPoint(i*bin_w,histimg->height),

cvPoint((i+1)*bin_w,(int)(histimg->height - val)), color, 1, 8, 0 ); }

cvShowImage( \

cvShowImage( \ cvWaitKey(0);

cvDestroyWindow(\

cvDestroyWindow(\ cvReleaseImage( &src ); cvReleaseImage( &histimg ); cvReleaseHist ( &hist );

return 0; }

8. OpenCV函数解释 数据结构:

CvHistogram 定义多维直方图,其结构如下: Typedef struct CvHistogram {

int type;

CvArr* bins; //存储计算的结果

float thresh[CV_MAX_IDM][2];//对于归一化的直方图 float** thresh2; //对于未归一化的直方图 CvMatND mat; } CvHistogram;

CvHistogram使用Look-up table(LUT)的方式,也就是查表法,开一个256大小

31

数字图像处理实验教程 V3.1

空间的数组,利用比例的缩放,缩放的数据存入Look-up table里面,再利用索引的方式对应。

函数:

cvCreateHist 创建直方图函数

功能:创建一个指定尺寸的直方图,并返回创建的直方图指针。

格式:CvHistgram *cvCreatHist(int dims, int *sizes, int type, float **ranges=NULL, int uniform=1);

参数:dims 直方图维数

sizes 直方图维数尺寸的数组

type 直方图的表示格式,为下列值之一:

——CV_HIST_ARRAY 直方图数据表示为多维密集数组CvMatND ——CV_HIST_TREE 直方图数据表示为多维稀疏数组CvSparseMat ranges 和 uniform一般取默认值。

cvCalcHist计算图像直方图函数

格式:void cvCalcHist( IplImage **image, CvHistGram *hist, int accumulate=0, const CvArr *mask=NULL);

参数:image:输入图像(也可使用结构CvMat**)。

hist 直方图指针。

accumulate:累计标志,默认为0。 mask:操作掩码,默认为0(NULL)。

cvLUT使用查表的值填充输出数组。

格式:void cvLUT(const CvArr *src, CvArr *dst, const CvArr *lut); 参数:src:元素为8位的输入数组。

dst:输出数组。

lut:有256个元素的查找表。

查找表的索引来自于输入数组,即函数按如下方式计算每个元素:

dst[i] = lut[src(i) + DELTA]

这里,当src的深度是CV_8U时,DELTA=0;当src的深度是CV_8S时,DELTA=128。

cvGetReal1D返回单通道数组的指定元素

格式:double cvGetReal1D(const CvArr* arr, int index); 参数:arr 输入数组,必须是单通道。 index 数组下标,从0开始

cvCreateMatHeader创建数组矩阵头部函数。 功能:分配新的矩阵头并返回指向它的指针

格式:CvMat* cvCreateMatHeader(int rows, int cols, int type); 参数:rows 矩阵行数;cols 矩阵列数;type矩阵元素类型。

矩阵头创建之后,矩阵的数据可以使用函数cvCreateData被进一步分配,或利用函数cvSetData由用户明确指定。

32

数字图像处理实验教程 V3.1

故:cvCreateMatHeader与cvSetData这两个函数经常连用创建数组。

cvSetData分配数据给数组

格式:void cvSetData(CvArr* arr, void* data, int step); 参数:arr 数组头;data 用户数据;step 整行字节长。 说明:在调用此函数时,数组头arr应该已经使用函数cvCreateMatHeader或cvMat(对于矩阵)初始化。

cvEqualizeHist直方图均衡化函数

格式:void cvEqualizeHist( const CvArr* src, CvArr* dst); 参数:src 输入的8位单通道图像;

dst 输出的均衡化之后的图像,与输入图像的数据类型和大小一致。 说明:函数cvEqualizeHist对输入图像进行直方图均衡化,采用如下算法: (1) 计算输入图像src的直方图H。

(2) 归一化直方图,使直方图之和为256。 (3) 计算累计直方图,即H/(i)?0?j?i?H(j)。

(4) 用H’作为索引表,对输入图像进行灰度变换,得到输出图像dst,即

dst(x,y)?H'[src(x,y)]。

直方图均衡化算法可以归一化图像的亮度,增强图像的对比度。

cvZero清零数组函数。

cvSize产生尺寸函数。

cvGetMinMaxHistValue返回最大最小值方块函数以及他们的位置。

cvConvertScale使用线性变换转换数组

参数:src 输入数组。Dst:输出数组。Scale:比例因子。Shift 将输入数组元素案比例缩放后添加的值。Dst=src*scale+shift。

cvRectangle矩形填充图像函数

参数:image:图像。Pt1:矩形的第一个顶点。Pt2:矩形的对角线顶点。Color:线条颜色。Thickness:线条的粗细程度。Line_type:线条类型。Shift:坐标小数点后位数。

cvReleaseHist注销直方图指针。

33

数字图像处理实验教程 V3.1

实验6 滤波器设计(综合性,3.4节)

1. 实验目的

(1) 掌握空域滤波器的种类和特点。

(2) 掌握均值滤波器、中值滤波器的设计方法。 (3) 提高解决实际问题的能力。 2. 实验内容和步骤

(1) 思考如何根据实验4(图像灰度变换),自己编写均值滤波器?试着去写

代码。

(2) 对照给出的第一个例程filter1.c,检查自己编程结果与问题所在。 (3) 调试运行第二个例程filter2.c,观察实验结果。

(4) 对比两个例程,总结并掌握自己从底层编写滤波器及调用OpenCV现有

函数实现滤波器的方法与不同。

(5) 思考并设计中值滤波器的实现方法。 3. 实验回答问题

简述空域滤波器的分类及各种滤波器的算法原理。

⑴ 从数学形态上可以把空域滤波器分为线性滤波器和非线性滤波器:线性滤波器又分为高通,低通和带通滤波器,非线性滤波器又可分为中值滤波,最大值,最小值滤波器。

⑵ 从处理效果上可以把空域滤波器分为平滑空间滤波器和锐化空间滤波器 平滑空间滤波器又可分为线性平滑滤波器即均值滤波器,非线性平滑滤波器包括中值滤波器,最大值滤波器,最小值滤波器。

? 低通滤波器原理算法--边缘的计算

1)相邻近似计算法 2)不完整模板近似法

中值滤波器的原理

? 用模板区域内象素的中值,作为结果值

R = mid {zk | k = 1,2,…,9}

– 中值滤波算法的实现

? 将模板区域内的象素排序,求出中值。

例如:3x3的模板,第5大的是中值, 5x5的模板,第13大的是中值, 7x7的模板,第25大的是中值, 9x9的模板,第41大的是中值。

? 对于同值象素,连续排列。

如(10,15,20,20,20,20,20,25,100

高频补偿过滤的原理

? 弥补高通滤波的缺陷,在增强边和细节的同时,不丢失原图

像的低频成分。

高通滤波可看作为: 高通 = 原图 – 低通 在上式原图上乘一个扩大因子A, 有高频补偿过滤: 高频补偿 = A原图 – 低通

34

数字图像处理实验教程 V3.1

= (A – 1)原图 + (原图 – 低通) = (A – 1)原图 + 高通

? 当A = 1时,高频补偿就是高通过滤, ? 当A >1 时,原图像的一部分被加到高通中

4. 练习

【基础练习】

(1) 使用滤波器时,对于图像的边界,一般有两种处理方法:边界扩展和不处

理。例程1采用的是边界不处理,请修改此例程,实现边界扩展的均值滤波器。

(2) 对例程2进行修改,使程序能够实现各种不同的线性滤波算法。包括:均

值滤波器、加权均值滤波器、锐化滤波器(Prewitt算子、Sobel算子、Laplace算子)等。

(3) #include \ (4) #include \ (5) #include \ (6) #include \ (7) #include \

(8) int main(int argc, char ** argv) (9) {

(10) IplImage * src, *dst ; (11)

(12) src = cvLoadImage(\Panda1.bmp\);

(13) dst = cvCreateImage(cvGetSize(src),IPL_DEPTH_16S,3) ; (14) cvNamedWindow(\,0) ; (15) cvShowImage(\,src); (16) cvNamedWindow(\,0) ; (17)

(18) cvSobel(src,dst,0,1,5); (19) cvShowImage(\,dst); (20) cvWaitKey(0) ;

(21) cvReleaseImage(&src) ; (22) cvReleaseImage(&dst); (23) return 0; (24) }

(25) 已知OpenCV函数cvSmooth(src, dst, CV_GAUSSIAN, 3,0,0,0); 可直接实

现高斯低通滤波,请用此函数改写例程,实现不同尺寸的高斯滤波功能。 【扩展练习】

中值滤波是一种非线性平滑法,它对一个滑动窗口内的像素灰度值排序,并用其中值代替窗口中心像素的灰度值。请自己动手编写阶数为n的方形中值滤波器及十字叉中值滤波器,

35


数字图像处理实验教程-V3.1-zsj(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2014年宜春国编教师招聘面试说课中应注意的几个问题[宜春华图]

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: