-
環(huán)境配置 :OpenCV在xCode中的安裝與環(huán)境配置
-
函數(shù)
均值平滑函數(shù)(均值濾波器)(
blur
)
所有像素加權(quán)系數(shù)相等锹漱。
- blur
函數(shù)解析
blur(InputArray src, // 輸入圖像
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); // 可省略不寫
高斯平滑函數(shù)(高斯濾波器)(
GaussianBlur
)
中間像素的加權(quán)系數(shù)是最大的蹦掐, 周邊像素的加權(quán)系數(shù)隨著它們遠(yuǎn)離中間像素的距離增大而逐漸減小。
- GaussianBlur
函數(shù)解析
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)
中值平滑函數(shù)(中值濾波器)(
medianBlur
)
中值濾波將圖像的每個(gè)像素用鄰域 (以當(dāng)前像素為中心的正方形區(qū)域)像素的中值代替泌类。
- medianBlur
函數(shù)解析
medianBlur(InputArray src, // 輸入圖像
OutputArray dst, // 輸出圖像
int ksize) // 內(nèi)核大小 (只需一個(gè)值,因?yàn)槲覀兪褂谜叫未翱?底燎,必須為奇數(shù)刃榨。
-
代碼實(shí)現(xiàn)
- 創(chuàng)建Button
- (void)createButton {
NSArray *arr = @[@"Original", @"Homogeneous", @"Gaussian", @"Median"];
CGFloat w = self.view.frame.size.width / 4;
CGFloat y = self.view.frame.size.height - 50;
for (NSInteger i = 0; i < 4; i++) {
UIButton *button = [UIButton buttonWithType:(UIButtonTypeSystem)];
button.frame = CGRectMake(w * i, y, w, 40);
[self.view addSubview:button];
button.backgroundColor = [UIColor lightGrayColor];
[button setTitle:arr[i] forState:(UIControlStateNormal)];
[button addTarget:self action:@selector(buttonClick:) forControlEvents:(UIControlEventTouchUpInside)];
button.titleLabel.font = [UIFont systemFontOfSize:11];
button.tag = 1000 + i;
}
}
- Button Click
- (void)buttonClick:(UIButton *)button {
NSInteger tag = button.tag;
switch (tag) {
case 1000: {
_imageView1.image = MatToUIImage(src);
} break;
// 均值
case 1001: {
for (int i = 1; i < MAX_KERNEL_LENGTH; i += 2) {
blur(src, dst, cv::Size(i, i));
}
_imageView1.image = MatToUIImage(dst);
} break;
// 高斯
case 1002: {
for (int i = 1; i < MAX_KERNEL_LENGTH; i += 2) {
GaussianBlur(src, dst, cv::Size(i, i), 0);
}
_imageView1.image = MatToUIImage(dst);
} break;
// 中值
case 1003: {
for (int i = 1; i < MAX_KERNEL_LENGTH; i += 2) {
medianBlur(src, dst, i);
}
_imageView1.image = MatToUIImage(dst);
} break;
}
}
- 全局變量
int MAX_KERNEL_LENGTH = 20;
Mat src, dst;
-
效果
-
參考資料 :圖像平滑處理