利用Opencv自帶的cvFilter2D來對圖像進行卷積計算,具體代碼如下:
#include "stdio.h"
#include "cv.h"
#include "highgui.h"
int main(int argc, char* argv[])
{
IplImage *img=cvLoadImage("Lena.png");
IplImage *p=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);
/*IplImage* cvCreateImage( CvSize size, int depth, int channels );
參數說明:
size 圖像寬、高.
depth 圖像元素的位深度,可以是下面的其中之一:
IPL_DEPTH_8U - 無符號8位整型
IPL_DEPTH_8S - 有符號8位整型
IPL_DEPTH_16U - 無符號16位整型
IPL_DEPTH_16S - 有符號16位整型
IPL_DEPTH_32S - 有符號32位整型
IPL_DEPTH_32F - 單精度浮點數
IPL_DEPTH_64F - 雙精度浮點數
channels:
每個元素(像素)通道號.可以是 1, 2, 3 或 4.通道是交叉存取的,例如通常的彩色圖像數據排列是:
b0 g0 r0 b1 g1 r1 ... 雖然通常 IPL 圖象格式可以存貯非交叉存取的圖像,並且一些OpenCV 也能處理他,
但是這個函數只能創建交叉存取圖像*/
float k[9]={1,-2,1,2,-4,2,1,-2,1};
CvMat km=cvMat(3,3,CV_32FC1,k);
/*初始化矩陣的方法
double a[] = { 1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12 };
CvMat Ma=cvMat(3, 4, CV_64FC1, a);
另一種方法:
CvMat Ma;
cvInitMatHeader(&Ma, 3, 4, CV_64FC1, a);
*/
cvFilter2D(img,p,&km,cvPoint(-1,-1));
/*
void cvFilter2D( const CvArr* src, CvArr* dst, const CvMat* kernel, CvPoint anchor=cvPoint(-1,-1)); #define cvConvolve2D cvFilter2D
src
輸入圖像.
dst
輸出圖像.
kernel
卷積核, 單通道浮點矩陣. 如果想要應用不同的核於不同的通道,先用 cvSplit 函數分解圖像到單個色彩通道上,然後單獨處理。
anchor
核的錨點表示一個被濾波的點在覈內的位置。 錨點應該處於核內部。缺省值 (-1,-1) 表示錨點在覈中心。
函數 cvFilter2D 對圖像進行線性濾波,支持 In-place 操作。當核運算部分超出輸入圖像時,函數從最近鄰的圖像內部象素差值得到邊界外面的象素值。
*/
cvNamedWindow("ImageShow",CV_WINDOW_AUTOSIZE);
cvShowImage("ImageShow",p);
cvWaitKey(0);
printf("Hello World!\n");
return 0;
}
實驗結果如下: