数字图像处理实验教程 V3.1
IplImage* MedianFilter_5_5(IplImage* src){ IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels); cvSmooth(src,dst,CV_MEDIAN,5); return dst;
} 对比其处理效果。
1. int sum(int val[N]) 2. {
3. int i,j;// 循环变量 4. char bTemp; 5.
6. // 用冒泡法对数组进行排序 7. for (j = 0; j < N- 1; j ++) 8. {
9. for (i = 0; i < N - j - 1; i ++) 10. {
11. if (val[i] > val[i + 1]) 12. {
13. // 互换
14. bTemp = val[i];
15. val [i] = val [i + 1]; 16. val [i + 1] = bTemp; 17. } 18. } 19. } 20.
21. // 计算中值 22. if ((N & 1) > 0) 23. {
24. // 数组有奇数个元素,返回中间一个元素 25. bTemp = val[(N + 1) / 2]; 26. } 27. else 28. {
29. // 数组有偶数个元素,返回中间两个元素平均值 30. bTemp = ( val [N / 2] + val [N / 2 + 1]) / 2; 31. } 32.
33. return bTemp; 34. }
【高层进阶】
请编写程序,实现用户可选多种滤波器的功能,将不同类型的滤波器分别用函数实现,在主程序中增加用户交互,如用户可选用某种滤波器、可选择滤波器
36
数字图像处理实验教程 V3.1
不同尺寸等。此题目旨在训练代码模块化及集成开发能力。 5. 实验报告要求
实验报告要求写明以下7方面内容: (1) 写明实验目的。
(2) 写明实验内容和步骤。
(3) 写出图像处理函数代码,并对算法程序部分加详细的注释。 (4) 描绘并解释实验结果,并对实验结果进行分析。 (5) 写明实验中存在的不足,以及改进的方法。 (6) 回答实验中涉及到的问题。 (7) 写出本次实验的体会。 6. 预习内容
(1) 自己查阅资料,学习图像分割的概念,了解图像边界、区域检测的原理并
预习图像边缘提取的基本算法。
(2) 请预习图像颜色空间的分类和特点以及颜色空间的转换方法。 7. 参考程序代码 /* 程序名:filter1.c
功 能:编程实现均值滤波器,对图像进行滤波 */
#include
#include
#define FILENAME \
#define N 9//滤波器的阶数(模板尺寸,N=9时表示模板大小为 3*3)
int sum(int val[N])//求平均值 {
int s=0,i;
for (i=0;i int main( int argc, char** argv ) { IplImage *src = 0, *dst = 0; int x,y,val[N],value; src = cvLoadImage(FILENAME, 0);// 0:强制转化为灰度图再处理,否则下面的滤波无效 dst = cvCloneImage( src ); cvNamedWindow(\ cvShowImage(\ for (y=1;y 37 数字图像处理实验教程 V3.1 { val[0]=(uchar)src->imageData[src->widthStep * (y-2) + (x-2)]; val[1]=(uchar)src->imageData[src->widthStep * (y-2) + (x -1) ]; val[2]=(uchar)src->imageData[src->widthStep * (y-2) + x]; val[3]=(uchar)src->imageData[src->widthStep * (y-2) + (x +1) ]; val[4]=(uchar)src->imageData[src->widthStep * (y-1) + (x+2)]; val[5]=(uchar)src->imageData[src->widthStep * (y-1) + (x-2)]; val[6]=(uchar)src->imageData[src->widthStep * (y-1) + ( x -1 ) ]; val[7]=(uchar)src->imageData[src->widthStep * (y-1) + x]; val[8]=(uchar)src->imageData[src->widthStep * (y-1) + (x +1) ]; val[9]=(uchar)src->imageData[src->widthStep * (y-1) + (x +2) ]; val[10]=(uchar)src->imageData[src->widthStep * y + (x-2)]; val[11]=(uchar)src->imageData[src->widthStep * y + (x -1) ]; val[12]=(uchar)src->imageData[src->widthStep * y + x]; val[13]=(uchar)src->imageData[src->widthStep * y + (x +1) ]; val[14]=(uchar)src->imageData[src->widthStep * y + (x+2)]; val[15]=(uchar)src->imageData[src->widthStep * (y+1) + (x-2)]; val[16]=(uchar)src->imageData[src->widthStep * (y+1) + (x -1) ]; val[17]=(uchar)src->imageData[src->widthStep * (y+1) + x]; val[18]=(uchar)src->imageData[src->widthStep * (y+1) +( x+1)]; val[19]=(uchar)src->imageData[src->widthStep * (y+1) + (x +2) ]; val[20]=(uchar)src->imageData[src->widthStep * (y+2) + (x-2)]; val[21]=(uchar)src->imageData[src->widthStep * (y+2) + (x -1) ]; val[22]=(uchar)src->imageData[src->widthStep * (y+2) + x]; val[23]=(uchar)src->imageData[src->widthStep * (y+2) +( x+1)]; val[24]=(uchar)src->imageData[src->widthStep * (y+2) + (x +2) ]; value = sum(val); dst->imageData[dst->widthStep * y +x]=value;//给目标图像中对应像素赋灰度值 } cvNamedWindow(\ cvShowImage(\ cvSaveImage(\保存图像 cvWaitKey(0); cvReleaseImage( &src ); cvReleaseImage( &dst ); return 0; } /* 程序名:filter2.c 功 能:使用不同的模板(滤波器)对图像进行滤波 */ #include #include 38 数字图像处理实验教程 V3.1 #include #define FILENAME \ int main( int argc, char** argv ) { IplImage *src = 0, *dst = 0, *dst2 = 0; float k[9] = { 1, 1, 1, 0, 0, 0, -1,-1,-1}; /* float g[9] = { 1, 0, -1, 1, 0, -1, 1, 0, -1}; */ CvMat Km; Km = cvMat( 3, 3, CV_32F, k ); src = cvLoadImage(FILENAME, 0);// 0: force to gray image dst = cvCloneImage( src ); cvNamedWindow(\ cvShowImage(\ cvNamedWindow(\ cvFilter2D( src, dst, &Km, cvPoint(-1,-1));//使用模板Km对图像进行二维滤波 cvShowImage(\cvSaveImage(“filter2.jpg”, dst); cvWaitKey(0); cvReleaseImage( &src ); cvReleaseImage( &dst ); return 0; } 8. OpenCV函数解释 cvInitMatHeader初始化矩阵头函数 cvMat给矩阵赋值函数。 cvFilter2D对图像做卷积运算 语法:void cvFilter2D( const CvArr *src, CvArr *dst, const CvMat *kernel, CvPoint anchor=cvPoint(-1,-1)); 参数:src 输入图像。 dst 输出图像。 kernel 卷积核(即滤波器的模板),单通道浮点矩阵。 anchor:核的锚点,表示一个被滤波的点在核内的位置。默认为(-1,-1)表示锚点在核中心。 cvSmooth 低通滤波(去噪声) 39 数字图像处理实验教程 V3.1 语法:CVAPI(void) cvSmooth( const CvArr* src, CvArr* dst, int smoothtype CV_DEFAULT(CV_GAUSSIAN), int param1 CV_DEFAULT(3), int param2 CV_DEFAULT(0), double param3 CV_DEFAULT(0), double param4 CV_DEFAULT(0)); cvLaplace计算图像的 Laplacian 变换(拉普拉斯锐化) 语法:void cvLaplace( const CvArr* src, CvArr* dst, int aperture_size=3 ); 参数: src 输入图像. dst 输出图像. aperture_size 核大小 (与 cvSobel 中定义一样). 功能:函数 cvLaplace 计算输入图像的 Laplacian变换,方法是先用 sobel 算子计算二阶 x- 和 y- 差分,再求和: 对 aperture_size=1 则给出最快计算结果,相当于对图像采用如下内核做卷积: 类似于 cvSobel 函数,该函数也不作图像的尺度变换,所支持的输入、输出图像类型的组合和cvSobel一致。 40 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库数字图像处理实验教程-V3.1-zsj(8)在线全文阅读。
相关推荐: