Opencv學習筆記——自建濾波器cvFilter2D

利用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;
}

實驗結果如下:


發佈了45 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章