原理
歸一化塊濾波器 (Normalized Box Filter)
高斯濾波器 (Gaussian Filter)
中值濾波器 (Median Filter)
中值濾波將圖像的每個(gè)像素用鄰域 (以當(dāng)前像素為中心的正方形區(qū)域)像素的中值代替 抒和。
雙邊濾波 (Bilateral Filter)
目前我們了解的濾波器都是為了平滑圖像矫渔, 問題是有些時(shí)候這些濾波器不僅僅削弱了噪聲, 連帶著把邊緣也給磨掉了摧莽。 為避免這樣的情形 (至少在一定程度上 ), 我們可以使用雙邊濾波庙洼。
類似于高斯濾波器,雙邊濾波器也給每一個(gè)鄰域像素分配一個(gè)加權(quán)系數(shù)镊辕。 這些加權(quán)系數(shù)包含兩個(gè)部分, 第一部分加權(quán)方式與高斯濾波一樣油够,第二部分的權(quán)重則取決于該鄰域像素與當(dāng)前像素的灰度差值。
函數(shù)介紹:
(1)均值平滑函數(shù)(均值濾波器)(blur)(所有像素加權(quán)系數(shù)相等)
blur(InputArraysrc,? // 輸入圖像? ??
? ? ? ? OutputArray dst,? // 輸出圖像? ??
? ? ? ? Size ksize,? ? ? // Size(w,h ): 定義內(nèi)核大小(w像素寬度丑蛤, h 像素高度)? ??
? ? ? ? ?Point anchor = Point(-1,-1),? // Point(-1,-1): 指定錨點(diǎn)位置(被平滑點(diǎn))叠聋, 如果是負(fù)值,取核的中心為錨點(diǎn)? ?
? ? ? ? ? int borderType = BORDER_DEFAULT);? // 可省略不寫
(2)高斯平滑函數(shù)(高斯濾波器)(GaussianBlur)(中間像素的加權(quán)系數(shù)是最大的受裹, 周邊像素的加權(quán)系數(shù)隨著它們遠(yuǎn)離中間像素的距離增大而逐漸減小碌补。)
GaussianBlur(InputArray src,// 輸入圖像
? ? ? ? ? ? ? ? ? ? ? ? OutputArray dst,// 輸出圖像
? ? ? ? ? ? ? ? ? ? ? ? ?Size ksize,// Size( w,h ): 定義內(nèi)核大小( w 像素寬度, h 像素高度)
? ? ? ? ? ? ? ? ? ? ? ? ?double sigmaX,// x 方向標(biāo)準(zhǔn)方差
? ? ? ? ? ? ? ? ? ? ? ? ? double ?sigmaY =0,// y 方向標(biāo)準(zhǔn)方差
? ? ? ? ? ? ? ? ? ? ? ? ? ?int borderType = BORDER_DEFAULT)
(3)中值平滑函數(shù)(中值濾波器)(medianBlur)(中值濾波將圖像的每個(gè)像素用鄰域 (以當(dāng)前像素為中心的正方形區(qū)域)像素的中值代替棉饶。)
medianBlur(InputArray src,// 輸入圖像
? ? ? ? ? ? ? ? ? ? OutputArray dst,// 輸出圖像
? ? ? ? ? ? ? ? ? ? ?int ksize)// 內(nèi)核大小 (只需一個(gè)值厦章,因?yàn)槲覀兪褂谜叫未翱?,必須為奇數(shù)照藻。
代碼實(shí)現(xiàn)
全局變量
Mat src;
Mat dst;
int MAX_KERNEL_LENGTH = 20;
點(diǎn)擊btn實(shí)現(xiàn)不同效果的轉(zhuǎn)換(按鈕是通過storyboard創(chuàng)建的袜啃,通過tag值來區(qū)分)
- (IBAction)changeType:(id)sender {
UIButton *btn = (UIButton *)sender;
switch (btn.tag) {
case 1000:// 展示原圖
{
self.secondImageView.image = MatToUIImage(src);
}
break;
case 1001:// 均值
{
for (int i = 1; i < MAX_KERNEL_LENGTH; i+=2) {
blur(src, dst, cv::Size(i,i));
}
self.secondImageView.image = MatToUIImage(dst);
}
break;
case 1002:// 高斯模糊
{
for (int i = 1; i < MAX_KERNEL_LENGTH; i+=2) {
GaussianBlur(src, dst, cv::Size(i,i),0);
}
self.secondImageView.image = MatToUIImage(dst);
}
break;
case 1003:// 中值
{
for (int i = 1; i < MAX_KERNEL_LENGTH; i+=2) {
medianBlur(src, dst, i);
}
self.secondImageView.image = MatToUIImage(dst);
}
break;
default:
break;
}
}
效果
原圖
模糊效果(其中一種)
參考資料