#include "cv.h"
#include "highgui.h"
int main()
{
float a_kernel[] = { 1.0/16, 2.0/16, 1.0/16,
2.0/16, 4.0/16, 2.0/16,
1.0/16, 2.0/16, 1.0/16 }; //创建问题a中核的元素
float b_kernel_1[] = { 1.0/4, 2.0/4, 1.0/4,
0, 0, 0,
0, 0, 0 }; //创建问题b中第一个核的元素
float b_kernel_2[] = { 1.0/4, 0, 0,
2.0/4, 0, 0,
1.0/4, 0, 0 }; //创建问题b中第二个核的元素
CvMat a_matkernal; //为每个核创建矩阵格式
CvMat b_matkernal_1;
CvMat b_matkernal_2;
a_matkernal = cvMat( 3, 3, CV_32F, a_kernel ); //根据数组内容创建3*3矩阵,数据类型跟数组一样是float
b_matkernal_1= cvMat( 3, 3, CV_32F, b_kernel_1 );
b_matkernal_2= cvMat( 3, 3, CV_32F, b_kernel_2 );
/*选择路径,载入源图像,并以源图像的尺寸大小、数据深度、通道数建立三幅图像,分别对应问题a与问题b*/
const char* image = "E:\\...\\picture_1.jpg";
IplImage* img_sorce = cvLoadImage( image );
IplImage* img_a = cvCreateImage( cvGetSize(img_sorce), img_sorce->depth, img_sorce->nChannels );
IplImage* img_b = cvCreateImage( cvGetSize(img_sorce), img_sorce->depth, img_sorce->nChannels );
if( !img_sorce )
{
return -1;
}
cvFilter2D( img_sorce, img_a, &a_matkernal ); //用高斯核a对源图像作一次高斯卷积,输出a
cvFilter2D( img_sorce, img_b, &b_matkernal_1 ); //用高斯核b1和b2对源图像作两次高斯卷积,输出b
cvFilter2D( img_b, img_b, &b_matkernal_2 );
/*创建窗口*/
cvNamedWindow( "img_sorce", CV_WINDOW_AUTOSIZE );
cvNamedWindow( "img_a", CV_WINDOW_AUTOSIZE );
cvNamedWindow( "img_b", CV_WINDOW_AUTOSIZE );
/*显示图像*/
cvShowImage( "img_sorce", img_sorce );
cvShowImage( "img_a", img_a );
cvShowImage( "img_b", img_b );
/*释放内存,销毁窗口*/
cvWaitKey(0);
cvReleaseImage( &img_sorce );
cvReleaseImage( &img_a );
cvReleaseImage( &img_b );
cvDestroyAllWindows();
return 0;
}