OpenCV (iOS)中的形态学变换(11)
形態學的高級形態往往是建立在腐蝕和膨脹這兩個基本操作之上,關于腐蝕和膨脹請參考OpenCV中的腐蝕和膨脹(9)
使用OpenCV中函數morphologyEx進行形態學操作
(1)開運算 (Opening)
(2)閉運算 (Closing)
(3)形態梯度 (Morphological Gradient)
(4)頂帽 (Top Hat)
(5)黑帽(Black Hat)
開運算(Opening)
開運算是通過先對圖像腐蝕再膨脹實現的
能夠排除小團塊的物體(假設物體背景明亮)
閉運算(Closing)
閉運算是通過先對圖像膨脹后再腐蝕實現的
能夠排除小型黑洞(黑色區域)
形態梯度(Morphological Gradient)
膨脹圖與腐蝕圖只差
頂帽(Top Hat)
原圖像與開運算結果的圖只差
黑帽(Black Hat)
閉運算結果圖與原圖像只差
函數morphologyEx參數介紹
void morphologyEx( InputArray src,// 預處理圖像
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?OutputArray dst,// 處理結果圖像
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int op,// 需要運行的形態學操作
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? InputArray kernel,? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Point anchor = Point(-1,-1),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int iterations =1,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int borderType = BORDER_CONSTANT,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?const Scalar& borderValue = morphologyDefaultBorderValue()
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? );
op 有六種形式 (2--6)
Opening:MORPH_OPEN: 2 // 開運算
Closing:MORPH_CLOSE: 3 // 閉運算
Gradient:MORPH_GRADIENT: 4 // 形態梯度
Top Hat:MORPH_TOPHAT: 5 // 頂帽
Black Hat:MORPH_BLACKHAT: 6 // 黑帽
代碼
- (void)initMat {
self.img = [UIImage imageNamed:@"123.png"];
UIImageToMat(_img, m_src);
[self morphologyEx];
}
- (void)createImageView {
CGFloat h = self.view.frame.size.width * 2 / 3;
self.imgView1 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 20, self.view.frame.size.width, h)];
[self.view addSubview:_imgView1];
_imgView1.backgroundColor = [UIColor lightGrayColor];
_imgView1.image = _img;
self.imgView2 = [[UIImageView alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(_imgView1.frame) + 5, self.view.frame.size.width, h)];
[self.view addSubview:_imgView2];
_imgView2.backgroundColor = [UIColor lightGrayColor];
_imgView2.image = _img;
}
- (void)createSlider {
NSArray *tempArr = @[@"Operator :", @"Element :", @"Kernel Size :"];
CGFloat w = self.view.frame.size.width - 100;
CGFloat y = self.view.frame.size.height - 50;
for (NSInteger i = 0; i < 3; i++) {
UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(90,? y - 45 * i, w, 40)];
[self.view addSubview:slider];
[slider addTarget:self action:@selector(valueChanged:)
forControlEvents:UIControlEventValueChanged];
[self sliderMumValueWith:i slider:slider];
slider.tag = 1000 + i;
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, y - 45 * i, 80, 40)];
label.textAlignment = NSTextAlignmentRight;
[self.view addSubview:label];
label.font = [UIFont systemFontOfSize:10];
label.text = tempArr[i];
}
}
- (void)sliderMumValueWith:(NSInteger)i slider:(UISlider *)slider {
switch (i) {
case 0: {
slider.continuous = YES; // NO makes it call only once you let go
slider.minimumValue = 2;
slider.maximumValue = 6;
} break;
case 1: {
slider.continuous = YES; // NO makes it call only once you let go
slider.minimumValue = 0;
slider.maximumValue = 2;
} break;
case 2: {
slider.continuous = YES; // NO makes it call only once you let go
slider.minimumValue = 0;
slider.maximumValue = 21;
} break;
}
}
- (void)morphologyEx {
// 由于 MORPH_X的取值范圍是: 2,3,4,5 和 6
Mat element = getStructuringElement(morph_elem, cv::Size(2 * morph_size + 1, 2 * morph_size + 1), cv::Point(morph_size, morph_size));
/// 運行指定形態學操作
morphologyEx(m_src, m_dst, morph_operator, element);
_imgView2.image = MatToUIImage(m_dst);//morph_operator
}
創建公共變量
Mat m_src, m_dst;
int morph_elem = 0;
int morph_size = 0;
int morph_operator = 0;
調用
[self initMat];
[self createSlider];
[self createImageView];
參考資料
OpenCV for iOS 學習筆記(十)—— 形態學變換
更多形態學變換
總結
以上是生活随笔為你收集整理的OpenCV (iOS)中的形态学变换(11)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iPhone失去反应咋办?
- 下一篇: Boolan STL 第三周笔记