重庆师范大学数字图像处理期末作业.docx

上传人:scccc 文档编号:11231264 上传时间:2021-07-16 格式:DOCX 页数:13 大小:1.77MB
返回 下载 相关 举报
重庆师范大学数字图像处理期末作业.docx_第1页
第1页 / 共13页
重庆师范大学数字图像处理期末作业.docx_第2页
第2页 / 共13页
重庆师范大学数字图像处理期末作业.docx_第3页
第3页 / 共13页
重庆师范大学数字图像处理期末作业.docx_第4页
第4页 / 共13页
重庆师范大学数字图像处理期末作业.docx_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《重庆师范大学数字图像处理期末作业.docx》由会员分享,可在线阅读,更多相关《重庆师范大学数字图像处理期末作业.docx(13页珍藏版)》请在三一文库上搜索。

1、1. 绘图函数绘制图案金字塔夜程序:#include #include #include #include using namespace std;using namespace cv;int main() Mat img(300,300,CV_8UC3,Scalar:all(200); line(img,Point(200,0),Point(50,50),Scalar(255,20,30);/蓝色流星尾迹 ellipse(img,Point(50,50),Size(5,2),-15,0,360,Scalar(255,20,30),3,8,0);/流星头部 rectangle(img,Poin

2、t(0,270),Point(300,300),Scalar(50,220,200),30);/黄色沙漠 Point vert13=Point(180,80),Point(60,280),Point(190,295);/金字塔左部端点 Point vert23=Point(180,80),Point(250,260),Point(190,295);/金字塔右部端点 const Point *pts12=vert1; int npts=3; int ncontour=1; fillPoly(img,pts1,npts,ncontour,Scalar(10,100,120);/金字塔左部上色 co

3、nst Point *pts22=vert2; fillPoly(img,pts2,npts,ncontour,Scalar(0,180,180);/金字塔右部上色 circle(img,Point(250,40),5,Scalar(150,100,80),26);/圆形月球 circle(img,Point(240,40),5,Scalar(200,200,200),26);/月缺 imshow(Egypt,img); waitKey(0); return 0;2. 根据ptr()遍历图像的方法绘制图案日出水面#include #include #include using namespac

4、e std; using namespace cv;int main() Mat img(300,300,CV_8UC3,Scalar:all(255); int nrow=img.rows; int ncol=img.cols; for(int i=0;inrow;i+)/此遍历循环是画太阳光线 Vec3b* data=img.ptr(i); for(int j=0;jncol;j+) if(i-40)-1*(j-230)-4) |(i-40)-2*(j-230)-5) |(i-40)-0.5*(j-230)-3) |(i-40)+0.5*(j-230)-3) |(i-40)+1*(j-23

5、0)-4) |(i-40)+2*(j-230)-5) |(i37)|(j227) dataj0=0;dataj1=255;dataj2=255; for(int i=0;inrow;i+)/此遍历循环是画水波浪 Vec3b* data=img.ptr(i); for(int j=0;j3*sin(0.3*j)+230) dataj0=230; dataj1=120; dataj2=5; for(int i=0;inrow;i+)/此遍历循环是画太阳 Vec3b* data=img.ptr(i); for(int j=0;jncol;j+) if(i-40)*(i-40)+(j-230)*(j-

6、230)=300) dataj0=40; dataj1=120; dataj2=255; imshow(img,img);waitKey(0);return 0;3. 用直方图均衡化方法处理图片 亮环境处理前 亮环境处理后 暗环境处理前 暗环境处理后我们可以看到这两幅图像的对比度都明显变强,层次分明。因为如果一副图像的像素占有很多的灰度级而且分布均匀,那么这样的图像往往有高对比度和多变的灰度色调。直方图均衡化就是一种能仅靠输入图像直方图信息自动达到这种效果的变换函数。它的基本思想是对图像中像素个数多的灰度级进行展宽,而对图像中像素个数少的灰度进行压缩,从而扩展像原取值的动态范围,提高了对比度和

7、灰度色调的变化,使图像更加清晰。直方图均衡化后面潜在的数学原理是一个分布被映射到另一个分布,映射函数是一个累积分布函数。对于连续分布,结果将是准确的均衡化。在EqualizeHist中,原始图像及目标图像必须是单通道,大小相同的8位图像,对于彩色图像,必须先将每个通道分开,再分别进行直方图均衡化处理,然后将通道合并形成新的图像。程序1:#include #include #include #include using namespace std;using namespace cv;int main() Mat src=imread(C:/Users/kodi/Desktop/QT/draw2

8、/1.jpg,2); Mat dst; equalizeHist(src,dst); imshow(before,src); imshow(after,dst); waitKey(0);return 0;绘制直方图:图一图二程序2:#include #include #include #include using namespace std; using namespace cv;void drawHist(Mat& histImage,Mat& hist,int histSize,Scalar color) int hist_w=histImage.cols; int hist_h=hist

9、Image.rows; int bin_w=cvRound(double)hist_w/histSize); normalize(hist,hist,0,histImage.rows,NORM_MINMAX,-1,Mat(); for(int i=0;ihistSize;i+) Point2i startPoint=Point(bin_w*(i-1),hist_h-cvRound(hist.at(i-1); Point2i endPoint=Point(bin_w*(i),hist_h-cvRound(hist.at(i); line(histImage,startPoint,endPoint

10、,color,2,8,0);void myCalcHist(Mat& src,Mat* hist) vector bgr_planes; if(src.channels()=3) split(src, bgr_planes); else bgr_planes.push_back(src);/创建bins个数int histSize=256; float range=0,256;const float* histRange=range;bool uniform=true; bool accumulate=true; for(int i=0;isrc.channels();i+) calcHist

11、( &bgr_planesi,1,0,Mat(),histi,1, &histSize, &histRange,uniform,accumulate);int main() Mat src=imread(C:/Users/kodi/Desktop/QT/draw2/2.jpg);/加载图像 int hist_w=800; int hist_h=400; int histSize=256;/计算直方图 Mat histImage(hist_h,hist_w,CV_8UC3,Scalar(255,255,255); Mat histsrc.channels(); myCalcHist(src,hi

12、st); int B,G,R; for(int i=0;isrc.channels();i+) B=i=0?255:0; G=i=1?255:0; R=i=2?255:0; drawHist(histImage,histi,histSize,Scalar(B,G,R);imshow(HistImage,histImage); waitKey(0); return 0;4. 实现频域低通、高通滤波操作 原图像 傅里叶变换后的图像低通滤波操作程序:#include #include using namespace cv;using namespace std;void myMagnitude(Ma

13、t & complexImg,Mat & ml) Mat planes2; split(complexImg,planes); magnitude(planes0,planes1,ml);void dftshift(Mat & ds)int cx=ds.cols/2; int cy=ds.rows/2;Mat q0=ds(Rect(0,0,cx,cy); Mat q1=ds(Rect(cx,0,cx,cy);Mat q2=ds(Rect(0,cy,cx,cy); Mat q3=ds(Rect(cx,cy,cx,cy); Mat tmp;q0.copyTo(tmp); q3.copyTo(q0)

14、; tmp.copyTo(q3);q1.copyTo(tmp); q2.copyTo(q1); tmp.copyTo(q2);void displayDftSpectrum(Mat&dftDst,string winName,bool inverseSpectrum) Mat magl; myMagnitude(dftDst,magl); if(!inverseSpectrum) magl+=Scalar:all(1); log(magl,magl); normalize(magl,magl,0,1,NORM_MINMAX); imshow(winName,magl);void makeFil

15、ter(Mat&filter,int R,int n) int cx=filter.cols/2,cy=filter.rows/2; for(int i=0;ifilter.rows;i+) Vec2d* pf=filter.ptr(i); for(int j=1;jfilter.cols;j+) float x=i-cx,y=j-cy; float Duv=x*x+y*y; float Rs=R*R; pfj0=exp(-Duv*Duv/2/Rs/Rs); pfj1=exp(-Duv*Duv/2/Rs/Rs); int main() Mat src=imread(C:/Users/kodi/

16、Desktop/QT/draw4/4.jpg,0); int ny=src.rows,nx=src.cols; cv:copyMakeBorder(src,src,0,ny,0,nx,BORDER_CONSTANT); imshow(original image,src); /接下来是傅里叶变换 src.convertTo(src,CV_64FC1); Mat dftDst(src.size(),CV_64FC2); dft(src,dftDst,DFT_COMPLEX_OUTPUT,0); dftshift(dftDst); displayDftSpectrum(dftDst,disSpec

17、trum display,false); /频域滤波 Mat filter(src.size(),CV_64FC2,Scalar:all(0); makeFilter(filter,80,2); Mat fftTemp=dftDst.mul(filter); Mat srcFiltered; dft(fftTemp,srcFiltered,DFT_INVERSE); displayDftSpectrum(srcFiltered,filtered image,true); waitKey(); return 0;如果想要实现高通滤波只要把自定义函数void makeFilter(Mat&filt

18、er,int R,int n)中设置成为:pfj0=1-exp(-Duv*Duv/Rs/Rs/n); pfj1=1-exp(-Duv*Duv/Rs/Rs/n);就可以实现高通滤波。 低通滤波图像 高通滤波图像5.根据ptr遍历图像的方法实现伽马曲线灰度变换 变换前 变换后程序:#include #include #include #include using namespace std; using namespace cv;int main() Mat img=imread(C:/Users/kodi/Desktop/QT/draw2/1.jpg); int nrow=img.rows; i

19、nt ncol=img.cols; for(int i=0;inrow;i+) Vec3b* data=img.ptr(i); Vec3b* data_out=img.ptr(i); for(int j=0;jncol;j+) data_outj0=4*pow(dataj0,0.6); data_outj1=4*pow(dataj1,0.6); data_outj2=4*pow(dataj2,0.6); imshow(img,img); waitKey(0);return 0;6. 根据ptr遍历图像的方法以8邻域为判断条件,前景图像的边界 原图像 边界图像程序:#include #inclu

20、de #include #include using namespace std;using namespace cv;int main() Mat src=imread(C:/Users/kodi/Desktop/QT/draw6/6.jpg,2); Mat dst; Mat kernel=(Mat_(3,3)0,-2,0,-2,8,-2,0,-2,0); filter2D(src,dst,CV_8U,kernel,Point(-1,-1),0,BORDER_DEFAULT); int nrow=dst.rows; int ncol=dst.cols; for(int i=0;inrow;i+)/将图像反转以便于观察 uchar* data=dst.ptr(i); uchar* data_out=dst.ptr(i); for(int j=0;jncol;j+) data_outj=255-dataj; imshow(edge,dst); waitKey(0); return 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1