图像形态学的操作
OpenCV的形态学操作,多数是基于膨胀(dilate)与腐蚀(erode)形成的,在二值图像处理和灰度图像处理中有很多运用;彩色图像直接进行图像形态学操作效果不好;图像形态学操作主要针对二值图像
1、开操作-open;
2、闭操作-close;
3、形态学梯度- Morphological Gradient;
4、顶帽-top hat;
5、黑帽-black hat;
开操作(open)
1、开操作:指先腐蚀后膨胀;
2、可以去除小的对象;假设对象是前景色,背景是黑色;
闭操作(close)
1、闭操作:指先膨胀后腐蚀;
2、可以填充小的洞(fill hole),假设对象是前景色,背景是黑色;
形态学梯度(Morphological Gradient)
1、膨胀减去腐蚀;
2、又称为基本梯度,每个像素的值不同成梯度(其他还包括内部梯度(原图-腐蚀图),方向梯度(在x,y方向进行梯度计算))
顶帽(Tophat)
1、顶帽:指原图像与开操作之间的差值图像;
黑帽(Blackhat)
1、黑帽:指闭操作图像与原图像的差值图像;
相关API
1、形态学操作API:morphologyEx(src, dest, CV_MOP_BLACKHAT , kernel);
(形态学扩展 )
//参数说明:
morphologyEx(src, dest, CV_MOP_BLACKHAT , kernel);
src : 输入图像
dest : 输出图像
int OPT : 形态学操作类型,可以传入的宏参数有:CV_MOP_OPEN/CV_MOP_CLOSE/CV_MOP_GRADIENT/CV_MOP_TOPHAT/CV_MOP_BLACKHAT;
Mat kernel : 结构元素
int iteration : 迭代次数,默认是1
Code
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat src = imread("C:\\Users\\hello\\Desktop\\9.jpg");
if (!src.data)
{
cout << "could not load the image..." << endl;
return -1;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
char output_title[] = "morphology demo";
namedWindow(output_title, CV_WINDOW_AUTOSIZE);
Mat dest;
//结构元素大小的选取和要去除的对象有关系,必须能够部分覆盖要去除的对象;
Mat kernel = getStructuringElement(MORPH_RECT,Size(11,11),Point(-1,-1));
//开操作
//morphologyEx(src, dest, CV_MOP_OPEN, kernel);
//闭操作
//morphologyEx(src, dest, CV_MOP_CLOSE, kernel);
//形态学梯度
morphologyEx(src, dest, CV_MOP_GRADIENT, kernel);
//Tophat
//morphologyEx(src, dest, CV_MOP_TOPHAT, kernel);
//Blackhat
morphologyEx(src, dest, CV_MOP_BLACKHAT, kernel);
imshow(output_title, dest);
waitKey(0);
return 0;
}
效果
形态学腐蚀:
顶帽:
黑帽:(闭操作的特性是填洞)(实际运用中可以用来寻找坏点)