看到一篇文章寫得通俗易懂,記錄下來。
在對數字影象進行處理時,我們一般都會在空間域(spatial domain)或者頻域(frequency domain)中進行。所謂「空間域」,實際上指的是影象本身,在空間域上的操作常常是改變畫素點的值,也就是經過乙個對映(我們所做的變換,如濾波等),將原來的f(x,y)變換為新的g(x,y)。而「頻域」,它的數學基礎是法國學者傅利葉提出的傅利葉級數和隨後發展起來的傅利葉變換。在這其中起到重要作用的,就是電子計算機的不斷完善和快速傅利葉變換(fft)演算法的提出。這些使得傅利葉變換成為了一中有力的分析和變換工具。就像一列波,我們在時間上觀察,每個時刻的幅值是乙個時間的函式。而當我們變換角度,從頻率域上去看,又會發現它是一系列正弦波的疊加,而這些正弦波的頻率都會是某個基波頻率的整數倍。可謂「橫看成嶺側成峰」!
在空間域的操作主要可以分為兩類:第一類是所謂的「影象強度變換」(intensity transform),另一類是所謂的「空間域影象濾波」(spatial filtering)。這兩者的區別主要是處理方法的不同。前者對單個畫素點進行操作,例如通過閾值函式實現圖形的二值化,實現灰度平均等。而後者建立在鄰域(neighborhood)的概念上,講究的是利用乙個矩陣核(kernel)對乙個小區域進行操作。今天這篇文章主要介紹的是後者,以及如何用opencv中的函式去實現。
我們先來看下面的這個公式,以及它的矩陣表示形式:
這個公式到它的矩陣表示形式的轉換相信並不複雜,稍有線性代數知識就可以看懂。而這種操作可以用來進行影象增強。那麼我們如何來使用opencv中的函式進行操作呢?我們要用到filter2d這個函式。可以在幫助文件中查到,filter2d函式的功能是:convolves an image with the kernel,即如何實現影象的卷積運算。其函式原型如下:
void filter2d(inputarray src, outputarray dst, int ddepth, inputarray kernel, point anchor=point(-1,-1), double delta=0, int bordertype=border_default ),可以用下面這個公式來說明:
讓我們用**來說明:
比較上面這兩幅,是否感覺處理後的影象對比度更加強烈了呢?
filter2D函式的使用
1 opencv中常用filter2d來自定義卷積核,以實現卷積操作 其定義如下 cv exports w voidfilter2d inputarray src,輸入影象 outputarray dst,輸出影象,尺寸 通道數均與原圖相等 intddepth,m目標影象的深度,如果沒有定義則保持與...
opencv卷積運算函式filter2D
函式介紹 saturate cast 處理數值的溢位問題 引數 要處理的資料型別 cv saturate cast這裡將資料處理成uchar型別 小於0返回0 大於255返回255 0 引數 255返回引數 include cmainwindow.h include include include ...
OpenCV2 矩陣的掩膜操作
二 矩陣的掩膜操作 提高影象的對比度 1 獲取影象畫素指標 mat.ptr int i 0 ptr為指標,uchar為指標型別獲取畫素矩陣的指標,索引i代表第幾行,從0開始計算行數。const uchar current mat.ptr row 獲取當前行指標 p row,col current c...