刀刀网
您的当前位置:首页天津科技大学---数字图像处理实验报告分析解析

天津科技大学---数字图像处理实验报告分析解析

来源:刀刀网


·

数字图像处理实验报告

专 业:计算机科学技术 学 号:******** * ***** 提交日期:2014.6.5

实验一 数字图像的读入与显示

一.实验目的:

1.熟悉opencv的开发环境设置

2.读取一幅图像,并显示,掌握Imread, imwrite,imshow的使用 3.掌握opencv中图像的表示,及其属性的含义。 二.实验内容: 配置好visualstudio2010下opnecv开发环境

使用opencv的函数读入一幅图像,并在窗口中显示出来。 三.实验步骤: #include \"stdafx.h\"

#include using namespace cv; using namespace std; void test1() { Mat inputImage=imread(\"..\\\\image\\\\book\\\\beach.jpg\ if(!inputImage.empty()) { cvNamedWindow(\"test\"); imshow(\"test\ waitKey(); } else { cout<<\"file open error!\"; getchar(); } }

int _tmain(int argc, _TCHAR* argv[]) { test1(); return 0; }

四.实验心得:通过上课实验理解了opencv的配置过程。通过程序实现了图片的成象处理。

实验二 数字图像像素的访问

一.实验目的: 掌握opencv开发环境中对灰度图像及彩色图像中的像素的访问方法

理解mat数据结构

掌握opencv中对图像进行处理的基本过程。 二.实验内容: (1)打开一幅灰度图像,对其进行线性灰度变换(直线方程的参数为k, b),

并显示变换前、后的图像。;调整K值,分别取>1, <1, =1, 以及-1,比较不同K值时的图像增强效果。

(2)打开一幅彩色图像,对每个像素进行访问,分别令R、G、B的值为0,查看处理后的图像,并比较原图像的差异。

重点和难点: 掌握灰度图像和彩色图像的像素的值的访问方法。 三.实验步骤: 1r)实验代码

void image1Pixel() { double durationa,durationb,durationc; double cacStart,cacEnd; Mat image=imread(\"..\\\\image\\\\book\\\\beach.jpg\ Mat gray(image.size().height,image.size().width,CV_8UC1,Scalar(0)); //gray=0.299R+0.587G+0.114b uchar r,g,b; float fgray; cacStart = static_cast(getTickCount()); for(int m=0;m<100;m++) for(int i=0;i(i,j)[0]; g=image.at(i,j)[1]; r=image.at(i,j)[2]; fgray=0.299*r+0.587*g+0.114*b; gray.at(i,j)=saturate_cast(fgray); } imshow(\"\

cacEnd = static_cast(getTickCount()); durationa=(cacEnd-cacStart)/cv::getTickFrequency(); // the elapsed time in ms waitKey(); }

2)实验代码

#include \"stdafx.h\"

#include using namespace cv; using namespace std;

void image1Pixel()

{ {

Mat inputImage=imread(\"..\\\\image\\\\book\\\\beach.jpg\",1); if(!inputImage.empty()) {

double durationa,durationb,durationc; double cacStart,cacEnd;

Mat image=imread(\"..\\\\image\\\\book\\\\beach.jpg\",1);

Mat gray(image.size().height,image.size().width,CV_8UC1,Scalar(0)); Mat grayGB(image.size().height,image.size().width,CV_8UC3,Scalar(0)); Mat grayRB(image.size().height,image.size().width,CV_8UC3,Scalar(0)); Mat grayRG(image.size().height,image.size().width,CV_8UC3,Scalar(0)); uchar r,g,b; float fgray;

cacStart = static_cast(getTickCount()); for(int m=0;m<100;m++)

for(int i=0;ifor(int j=0;jimshow(\"org\cvNamedWindow(\"gray\"); imshow(\"gray\waitKey();

b=image.at(i,j)[0];

g=image.at(i,j)[1]; r=image.at(i,j)[2]; //////////////////////////// grayGB.at(i,j)[0] = b; grayGB.at(i,j)[1] = g; grayGB.at(i,j)[2] = 0; //R grayRB.at(i,j)[0] = b; grayRB.at(i,j)[1] = 0;// G grayRB.at(i,j)[2] = r; grayRG.at(i,j)[0] = 0; //B grayRG.at(i,j)[1] = g; grayRG.at(i,j)[2] = r; //////////////////////////// fgray=0.299*r+0.587*g+0.114*b;

gray.at(i,j)=saturate_cast(fgray);

cvNamedWindow(\"org\");

cacEnd = static_cast(getTickCount());

durationa=(cacEnd-cacStart)/cv::getTickFrequency(); }

void test1()

}

}

cvNamedWindow(\"test\"); imshow(\"test\",inputImage); waitKey();

else { }

cout<<\"file open error!\"; getchar();

int _tmain(int argc, _TCHAR* argv[]) { }

image1Pixel(); test1(); return 0;

心得体会:通过本次试验,我了解并大致掌握灰度图像和彩色图像的像素的值的访问方法。

由于之前很少练习这方面的内容,试验过程中遇到了一些问题,好在在别人的帮助下和向别人咨询终于了解了这方面知识的大致框架和原理。由此更坚定了我学习下去的信心和动力!

实验三 图像的平滑

一.实验目的: 掌握opencv开发环境中对灰度图像及彩色图像中的像素的访问方法 掌握opencv中对图像进行处理的基本过程。 掌握均值平滑和中值滤波的基本原理

二.实验内容: (1)打开一幅灰度图像,对图像进行3*3(包括中心点)的邻域平均处理。

(2)对原图进行3*3(包括中心点)的中值滤波处理。

(3)比较原图像与邻域平均的图像、中值滤波后的图像的差异

三.实验步骤: 1)中值滤波处理 for(int i=1;iimshow(\"中值滤波\

cacEnd = static_cast(getTickCount()); durationa=(cacEnd-cacStart)/cv::getTickFrequency(); waitKey(); }

int GetMidNum(int n[]) { for (int i=0;i<9;i++) for(int j = 0 ;j<8;j++) { if (n[j]>n[j+1]) { int temp ; temp = n[j+1]; n[j+1] = n[j]; n[j]= temp; } } return n[4]; }

void test4_4() { int count[256];//存放各个像素值对应的个数 float hist[256],sumHist[256]; uchar grayHist[256]; for (int i=0;i<256;i++) { count[i]=0; hist[i]=0;

a[9]={gray.at(i-1,j),gray.at(i,j),gray.at(i+1,j),

gray.at(i-1,j-j),gray.at(i,j-1),gray.at(i+1,j-1)

+gray.at(i-1,j+1),gray.at(i,j+1),gray.at(i+1,j+1)}; gray.at(i,j)=GetMidNum(a); } }

}

int _tmain(int argc, _TCHAR* argv[]) { image1Pixel(); //Test3(); //test4_4(); return 0; }

2)邻域平均

void image1Pixel()

sumHist[i]=0; grayHist[i]=0; }

Mat image=imread(\"..\\\\image\\\\book\\\\beach.jpg\for(int i=0;iuchar* data=image.ptr(i); for(int j=0;jfor(int i=0;i<256;i++)

hist[i]=((float)count[i])/(image.size().height*image.size().width); sumHist[0]=hist[0]; for(int i=1;i<256;i++)

sumHist[i]=sumHist[i-1]+hist[i]; for(int i=0;i<256;i++) grayHist[i]=saturate_cast(sumHist[i]*255);

Mat gray(image.size().height,image.size().width,CV_8UC1,Scalar(0)); for(int i=0;iuchar* data=image.ptr(i); uchar* grayData=gray.ptr(i); for(int j=0;jcvNamedWindow(\"tset\"); imshow(\"org\ cvNamedWindow(\"hist\"); imshow(\"hist\ waitKey();

{ double durationa,durationb,durationc; double cacStart,cacEnd; Mat image=imread(\"..\\\\image\\\\book\\\\beach.jpg\ Mat gray(image.size().height,image.size().width,CV_8UC1,Scalar(0)); //gray=0.299R+0.587G+0.114b uchar r,g,b; float fgray; cacStart = static_cast(getTickCount()); for(int m=0;m<100;m++) for(int i=0;i(i,j)[0]; g=image.at(i,j)[1]; r=image.at(i,j)[2]; fgray=0.299*r+0.587*g+0.114*b; gray.at(i,j)=saturate_cast(fgray); } imshow(\"\

cacEnd = static_cast(getTickCount()); durationa=(cacEnd-cacStart)/cv::getTickFrequency(); // the elapsed time in ms waitKey(); } void Test3() { int GetMidNum(int n[]); double durationa,durationb,durationc; double cacStart,cacEnd; Mat image=imread(\"..\\\\image\\\\book\\\\beach.jpg\ Mat gray(image.size().height,image.size().width,CV_8UC1,Scalar(0)); Mat grayGB(image.size().height,image.size().width,CV_8UC3,Scalar(0)); Mat grayRB(image.size().height,image.size().width,CV_8UC3,Scalar(0)); Mat grayRG(image.size().height,image.size().width,CV_8UC3,Scalar(0)); //gray=0.299R+0.587G+0.114b uchar r,g,b; float fgray; cacStart = static_cast(getTickCount()); for(int m=0;m<100;m++)

for(int i=0;i(i,j)[0]; g=image.at(i,j)[1]; r=image.at(i,j)[2];

}

实验心得:通过这次试验,我明白了,平滑技术用于平滑图像的噪声,平滑噪声可以在空间域中进行,基本方法是求像素灰度的平均值或中值。但是这些很容易引起边缘的模糊,常用的有均值滤波、中值滤波,在使用时,针对不同的噪声,也需要不同的滤波法,没有哪种方法是绝对好,必须具体情况具体分析。 最后比较三种平滑效果,八点平滑最好,说明对高斯噪声平滑滤波效果较好。中值滤波基本把椒盐噪声都滤去了,说明中值滤波对椒盐噪声平滑效果比高斯噪声好。

fgray=0.299*r+0.587*g+0.114*b; gray.at(i,j)=saturate_cast(fgray); } imshow(\"原图\

for(int i=1;i(i,j)=

(gray.at(i-1,j)+gray.at(i,j)+gray.at(i+1,j)+

gray.at(i-1,j-j)+gray.at(i,j-1)+gray.at(i+1,j-1)

+gray.at(i-1,j+1)+gray.at(i,j+1)+gray.at(i+1,j+1))/9; } imshow(\"邻域平均\

实验四 图像的直方图均衡化

一.实验目的: 掌握直方图均衡化的基本步骤及实现方法

掌握opencv中对图像进行处理的基本过程。

二.实验内容: (1)打开一幅灰度图像,对图像进行直方图均衡化处理。

(2)比较原图像与均衡化的图像的差异。

(3)要求自己按照课本介绍的均衡化的步骤在opencv下实现直方图均衡化处理。

三.实验步骤:void test1() { Mat inputImage=imread(\"..\\\\image\\\\book\\\\beach.jpg\ if(!inputImage.empty()) { cvNamedWindow(\"test\"); imshow(\"test\ waitKey(); } else { cout<<\"file open error!\"; getchar(); } }

void test4() { int count[256]; float hist[256],sumHist[256]; uchar grayHist[256]; for (int i=0;i<256;i++) { count[i]=0; hist[i]=0; sumHist[i]=0; grayHist[i]=0; } Mat image=imread(\"..\\\\image\\\\book\\\\beach.jpg\ for(int i=0;i(i); for(int j=0;jfor(int i=1;i<256;i++) sumHist[i]=sumHist[i-1]+hist[i]; for(int i=0;i<256;i++) grayHist[i]=saturate_cast(sumHist[i]*255); Mat gray(image.size().height,image.size().width,CV_8UC1,Scalar(0)); for(int i=0;i(i); uchar* grayData=gray.ptr(i); for(int j=0;jint _tmain(int argc, _TCHAR* argv[]) { //test1(); test4(); return 0; }

四.实验心得:通过这次的实验,我明白了直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。

因篇幅问题不能全部显示,请点此查看更多更全内容