练习题第一题

这道题是载入一幅带有有趣纹理的图像并用不同的模板(窗口,核)大小做高斯模糊(高斯平滑),然后比较用5*5大小的窗口平滑图像两次和用11*11大小的窗口平滑图像一次是否接近相同。
先说下我的做法,a部分我将每个不同的窗口大小模糊化后的图像生成后,还计算了每个模糊化后的图像与原始图像间的MSE值与PSNR值。(参见:)
b部分我计算了两次5*5窗口大小的高斯模糊后的图像与一次11*11窗口大小的高斯模糊图像之间的MSE与PSNR。
1 #include &opencv/highgui.h&
2 #include &opencv/cv.h&
3 #include &opencv_libs.h&
4 #include &math.h&
*《学习OpenCV》第五章第一题
* 完成时间:18:37 10/13 星期日 2013
* function: calculate MSE & PSNR of two GrayScale(8-bit depth & one channel) images.
* param: img1 -- the first image.
* param: img2 -- the second image.
* param: dMSE -- the MSE of two images(output)
* param: dPSNR -- the PSNR of two images(output)
* return: 0 --
others -- failed.
20 int calculateGrayImgsPSNR(IplImage* img1, IplImage* img2, double& dMSE, double& dPSNR)
if( !img1 || !img2 ||
img1-&nChannels != 1 ||
img2-&nChannels != 1 ||
img1-&depth != img2-&depth ||
img1-&width != img2-&width ||
img1-&height != img2-&height )
return -1;
int width = img1-&
int height = img1-&
// calculate MSE of the two images
double dSumOfSquares = 0;
for(int i = 0; i & i++)
char* pdata1 = img1-&imageData + i * img1-&widthS
char* pdata2 = img2-&imageData + i *img2-&widthS
for(int j = 0; j & j++ )
uchar value1 = *(pdata1 + j);
uchar value2 = *(pdata2 + j);
double square = pow( (double)(value1 - value2), 2 );
dSumOfSquares +=
dMSE = dSumOfSquares / (width * height);
// this is means the two images are strictly same.
if(dMSE == 0)
dPSNR = -1;
int iDepth = img1-&
int iMAX = pow( 2., iDepth) - 1;
dPSNR = 20 * log10(iMAX / (sqrt(dMSE)));
66 int main()
const char * FILE_PATH = "Fig0333(a)(test_pattern_blurring_orig).tif";
IplImage* src = cvLoadImage(FILE_PATH, CV_LOAD_IMAGE_UNCHANGED);
printf("Load image error.\n");
return -1;
// Get the source image's size
CvSize srcSize = cvGetSize(src);
IplImage* dst_three_gaussian = cvCreateImage(srcSize, src-&depth, src-&nChannels);
IplImage* dst_five_gaussian = cvCreateImage(srcSize, src-&depth, src-&nChannels);
IplImage* dst_nine_gaussian = cvCreateImage(srcSize, src-&depth, src-&nChannels);
// 11 * 11
IplImage* dst_eleven_gaussian = cvCreateImage(srcSize, src-&depth, src-&nChannels);
// twice 5 * 5
IplImage* dst_twice_five_gaussian = cvCreateImage( srcSize, src-&depth, src-&nChannels );
if( !dst_three_gaussian || !dst_five_gaussian ||
!dst_nine_gaussian || !dst_eleven_gaussian ||
!dst_twice_five_gaussian )
printf("Create image error.\n");
return -1;
cvSmooth(src, dst_three_gaussian, CV_GAUSSIAN, 3, 3);
cvSmooth(src, dst_five_gaussian, CV_GAUSSIAN, 5, 5);
cvSmooth(src, dst_nine_gaussian, CV_GAUSSIAN, 9, 9);
cvSmooth(src, dst_eleven_gaussian, CV_GAUSSIAN, 11, 11);
cvSmooth( dst_five_gaussian, dst_twice_five_gaussian, CV_GAUSSIAN, 5, 5 );
cvShowImage("src", src);
cvShowImage("src - GAUSSIAN 3*3", dst_three_gaussian);
cvShowImage("src - GAUSSIAN 5*5", dst_five_gaussian);
cvShowImage("src - GAUSSIAN 9*9", dst_nine_gaussian);
cvShowImage("src - GAUSSIAN 11*11", dst_eleven_gaussian);
cvShowImage("src - GAUSSIAN 5*5 Twice", dst_twice_five_gaussian );
// calculate the MSE and PSNR of the two images.
double dMSE, dPSNR;
// part a:
calculateGrayImgsPSNR(src, dst_three_gaussian, dMSE, dPSNR);
printf("source image & 3*3 GAUSSIAN: MSE: %f\tPSNR: %f\n", dMSE, dPSNR);
calculateGrayImgsPSNR(src, dst_five_gaussian, dMSE, dPSNR);
printf("source image & 5*5 GAUSSIAN: MSE: %f\tPSNR: %f\n", dMSE, dPSNR);
calculateGrayImgsPSNR(src, dst_nine_gaussian, dMSE, dPSNR);
printf("source image & 9*9 GAUSSIAN: MSE: %f\tPSNR: %f\n", dMSE, dPSNR);
calculateGrayImgsPSNR(src, dst_eleven_gaussian, dMSE, dPSNR);
printf("source image & 11*11 GAUSSIAN: MSE: %f\tPSNR: %f\n", dMSE, dPSNR);
puts("---------------------------\n");
calculateGrayImgsPSNR(src, dst_eleven_gaussian, dMSE, dPSNR);
printf("source image & eleven: MSE: %f\tPSNR: %f\n", dMSE, dPSNR);
calculateGrayImgsPSNR(src, dst_twice_five_gaussian, dMSE, dPSNR);
printf("source image & twice five: MSE: %f\tPSNR: %f\n", dMSE, dPSNR);
calculateGrayImgsPSNR(dst_eleven_gaussian, dst_twice_five_gaussian, dMSE, dPSNR);
printf("eleven & twice five: MSE: %f\tPSNR: %f\n", dMSE, dPSNR);
cvWaitKey(0);
cvReleaseImage(&src);
cvReleaseImage(&dst_three_gaussian);
cvReleaseImage(&dst_five_gaussian);
cvReleaseImage(&dst_nine_gaussian);
cvReleaseImage(&dst_eleven_gaussian);
cvReleaseImage(&dst_twice_five_gaussian);
cvDestroyAllWindows();
运行结果:
同时各个不同的窗口大小模糊化后的图像与原始图像之间的MSE与PSNR:
从图中可以看出,当窗口大小越大时,MSE增大,PSNR减小。
两幅图像的PSNR与MSE:
众所周知的是在图像压缩中典型的PSNR比值在30-40dB之间,而我们这两幅平滑之后的图像PSNR为31.976534,所以这两幅图像是比较接近的。
阅读(...) 评论()习题练习题第一章_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
习题练习题第一章
上传于||暂无简介
阅读已结束,如果下载本文需要使用2下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢第一题不会……_幽默笑话_来福岛爆笑娱乐网
  物理。几个学渣让学霸传答案。出考场后,众人纷纷问学霸:“为啥少一个,最后一题你是不是不会?”学霸淡定的回答了句:“第一题不会……”
扫描到手机:
键盘快捷键:
← 上一篇文章
→ 下一篇文章

我要回帖

 

随机推荐