OpenCV筆記(三) 線性濾波

2022-08-26 01:27:06 字數 1503 閱讀 4508

對畫素(i, j)做線性濾波的方法:

1. 做乙個3x3的矩陣,分別賦予(i, j)和它的4鄰域和d鄰域相應的權值。

2. 計算。

示例**如下:

1

void sharpen(const mat& myimage,mat&result)221

}2223 result.row(0).setto(scalar(0

));24 result.row(result.rows-1).setto(scalar(0

));25 result.col(0).setto(scalar(0

));26 result.col(result.cols-1).setto(scalar(0

));27 }

第18行就是對當前畫素進行濾波操作。濾波的矩陣為(0, -1, 0,

-1,  5, -1,

0,  -1, 0)

函式當中使用ptr方法,返回指向某行的指標,用來遍歷當前行的每個位元組,而非畫素。

另外,第18行中使用了saturate_cast這個模板函式,它重新包裝了c++當中的型別轉換,當左邊的值的範圍不足以接收右邊的值的範圍的時候,這個轉換並非簡單地截斷位數,而是選擇最接近的合法值。

第23行,row(0)和col(0)分別返回第0行和第0列的所有元素構成的mat。

setto(scalar(0))方法呼叫,將呼叫它的mat所有元素設為scalar(0)。

opencv實現了線性濾波的方法:filter2d。

1     mat kern = (mat_(3,3) <<  0, -1,  0

,2 -1, 5, -1,3

0, -1, 0

);4 t = (double

)gettickcount();

5 filter2d(i, k, i.depth(), kern ); /* 其中i是輸入的mat,k是輸出的mat*/

filter2d的宣告為

c++:void filter2d

(inputarraysrc, outputarraydst, intddepth, inputarraykernel, pointanchor=point(-1,-1), doubledelta=0, intbordertype=border_default )

前面四個引數都很清楚了。

第五個引數anchor是中心點在kernel矩陣中的相對位置。可能有點抽象,看下面這個式子,就清楚anchor了:

第六個引數delta,是在將結果儲存至dst之前,加上乙個常數。

第七個引數bordertype,暫時沒看是什麼。

opencv非線性濾波 中值 雙邊濾波

中值濾波的核心係數全是1,通過對模板係數對應的影象畫素進行統計排序,找到中值,能夠很好地排除掉較大或較小的雜訊,例如椒鹽雜訊 形象的說就是在影象中的一些黑 白點 脈衝雜訊等。缺點 統計排序時間較長 void medianblur inputarray src,outputarray dst,int ...

opencv 自定義線性濾波

卷積概念 卷積是影象處理的乙個操作,是依據kernel對影象每個畫素點進行操作,kernel本質上是乙個固定大小的矩陣陣列,其中心為錨點。把kernel放在畫素的陣列之上,求錨點周圍覆蓋的畫素乘積之和 包括錨點 用其來替換錨點下的畫素值。稱之為卷積操作。公式如圖所示。依次對影象進行該操作。常見運算元...

opencv 自定義線性濾波

自定義線性濾波 效果 在學習自定義線性濾波前,需要了解卷積的相關概念 影象中的卷積 最常見的運算元 在邊緣檢測中經常用到,是canny邊緣檢測中重要的一步,通過sobel運算元得到梯度 銳化的掩膜中間是5,拉普拉斯運算元中間是4 拉普拉斯運算元和sobel運算元被用來尋找梯度 尋找影象的邊緣 和掩膜...