OpenCV2学习笔记(三):形态学及边缘角点检测

形态学滤波理论于上世纪90年代提出,目前被广泛用于分析及处理离散图像。其基本运算有4个: 膨胀、腐蚀、开启和闭合, 它们在二值图像和灰度图像中各有特点。基于这些基本运算还可推导和组合成各种数学形态学实用算法,用它们可以进行图像形状和结构的分析及处理,包括图像分割、特征抽取、边缘检测、 图像滤波、图像增强和恢复等。数学形态学方法利用一个称作结构元素的“探针”收集图像的信息,当探针在图像中不断移动时, 便可考察图像各个部分之间的相互关系,从而了解图像的结构特征。数学形态学基于探测的思想,与人的FOA(Focus Of Attention)的视觉特点有类似之处。其中最重要的结构元素,可直接携带知识(形态、大小、甚至加入灰度和色度信息)来探测、研究图像的结构特点。鉴于研究所需,记录一些知识点,开发平台为OpenCV2.4.9+Qt5.3.2。

一:图像腐蚀、膨胀和开闭运算

这些运算的基本公式和原理参考: 图像的腐蚀:替换为当前像素位像素集合中的最小像素值,函数为cv::erode 图像的膨胀:替换为当前像素位像素集合中的最大像素值,函数为cv::dilate 图像的开运算:先腐蚀后膨胀,函数为cv::morphologyEx,对应的参数为MORPH_CLOSE 图像的闭运算:先膨胀后腐蚀,函数为cv::morphologyEx,对应的参数为MORPH_OPEN 如morphologyEx(image, opened, cv::MORPH_OPEN, element2, cv::Point(-1,-1), 1); 中,输入图像为image,输出图像为opened,执行开操作,结构元素为element2,原点参数cv::Point(-1,-1)表示原点位于矩阵的中心(默认),最后的1则表示对图像的操作次数(注:对一幅图像多次使用开操作和闭操作时效果不会有改善,这些运算是等幂的)。形态学滤波本是基于二值图像上,但以上这些运算同样适用于灰度图像。

新建一个Qt控制台应用,创建一个类:MorphoFeatures:

{public:void fourFunctions(cv::Mat &image); // 腐蚀、膨胀、开操作、闭操作}#endif // MORPHOFEATURES_H&image){// 腐蚀运算,替换为当前像素位像素集合中的最小像素值cv::Mat eroded;cv::erode(image, eroded, cv::Mat());// 膨胀运算,替换为当前像素位像素集合中的最大像素值cv::Mat dilated;cv::dilate(image, dilated, cv::Mat());// 闭运算,先膨胀后腐蚀cv::Mat closed;cv::Mat element1(3, 3, CV_8U, cv::Scalar(1));cv::morphologyEx(image,// 输入图像closed,// 输出图像cv::MORPH_CLOSE, // 指定操作element1,// 结构元素设置cv::Point(-1,-1), // 操作的位置1);// 操作的次数//开运算,先腐蚀后膨胀cv::Mat opened;cv::Mat element2(3, 3, CV_8U, cv::Scalar(1));cv::morphologyEx(image, opened, cv::MORPH_OPEN, element2, cv::Point(-1,-1), 1);cv::namedWindow(“Eroded Image”);cv::imshow(“Eroded Image”, eroded);cv::namedWindow(“Dilated Image”);cv::imshow(“Dilated Image”, dilated);cv::namedWindow(“Orginal Image”);cv::imshow(“Orginal Image”, image);cv::namedWindow(“Closed Image”);cv::imshow(“Closed Image”, closed);cv::namedWindow(“Opened Image”);cv::imshow(“Opened Image”, opened);}

得出四种操作的处理效果:

这里你会觉得腐蚀与膨胀、开操作与闭操作的效果和期望是相反的。这是因为我们认为图像素材中黑色字体是前景,白色为背景。而一般的,形态学规定用高像素表示前景物体,用低像素表示背景,因此使用这些基本运算之前,可以根据实际情况给原图像取反。

二、利用形态学滤波进行边缘检测

形态学滤波利用梯度进行边缘检测,其原理是计算膨胀后的图像和腐蚀后的图像的差值,由于两个变换后的图像不同之处主要在边缘处,图像边缘将通过求差得到强化。函数为morphologyEx,参数为MORPH_GRADIENT。若架构元素尺寸越大,检测出的边缘越厚。最简单的边缘检测运算是用原图减去腐蚀后的图像,或者用膨胀后的图像减去原图或腐蚀图像,效果很直观,缺点是得到的边缘较薄。

以下给出形态学滤波进行边缘检测的基本方法: 在class MorphoFeatures中添加几个函数:

public:cv::Mat getEdges(const cv::Mat &image);void setThreshold(int gate); // 设定阈值private:void applyThreshold(cv::Mat &result);一个人身边的位置只有这么多,

OpenCV2学习笔记(三):形态学及边缘角点检测

相关文章:

你感兴趣的文章:

标签云: