第五章 使用形态学滤波对图像进行开闭运算

来源:互联网 发布:无人机与人工智能 编辑:程序博客网 时间:2024/05/21 21:44

知识点:
1.闭运算:对图像先膨胀,再腐蚀。 白色前景物体中的小洞被填充;将误分割成碎片的物体重新连接
2.开运算:对图像先腐蚀,再膨胀 。 移除场景中比较小的物体;图像早点引起的(Blob)
以上都在视频序列中很有帮助,若将二值图像相继进行闭、开运算,获得的图像只显示场景中的主要物体。若有限处理噪点可先进行开运算再闭运算,但可能去除一些分散的物体。
3.

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() ); 

第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像位深应该为以下五种之一:CV_8U, CV_16U, CV_16S, CV_32F 或CV_64F。
第二个参数,OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。
第三个参数,int类型的op,表示形态学运算的类型,可以是如下之一的标识符:
MORPH_OPEN – 开运算(Opening operation)
MORPH_CLOSE – 闭运算(Closing operation)
MORPH_GRADIENT - 形态学梯度(Morphological gradient)
MORPH_TOPHAT - “顶帽”(“Top hat”)
MORPH_BLACKHAT - “黑帽”(“Black hat“)
第四个参数,InputArray类型的kernel,形态学运算的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。我们一般使用函数 getStructuringElement配合这个参数的使用。getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵)。关于getStructuringElement我们上篇文章中讲过了,这里为了大家参阅方便,再写一遍:
其中,getStructuringElement函数的第一个参数表示内核的形状,我们可以选择如下三种形状之一 :
矩形: MORPH_RECT
交叉形 : MORPH_CROSS
椭圆形 : MORPH_ELLIPSE
而getStructuringElement函数的第二和第三个参数分别是内核的尺寸以及锚点的位置。
我们一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获得getStructuringElement函数的返回值。对于锚点的位置,有默认值Point(-1, -1),表示锚点位于中心。且需要注意,十字形的element形状唯一依赖于锚点的位置。而在其他情况下,锚点只是影响了形态学运算结果的偏移。
第五个参数,Point类型的anchor,锚的位置,其有默认值( - 1, - 1),表示锚位于中心。
第六个参数,int类型的iterations,迭代使用函数的次数,默认值为1。
第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_ CONSTANT。
第八个参数,const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般我们不用去管他。需要用到它时,可以看官方文档中的createMorphologyFilter()函数得到更详细的解释

main:

#include <opencv2/core/core.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/highgui/highgui.hpp>cv::Mat resrve(cv::Mat src);//二值化图像取反int main(){    // Read input image    cv::Mat image = cv::imread("D:/1.jpg", 0);    if (!image.data)        return 0;    // Display the image    cv::namedWindow("Image");    cv::imshow("Image", image);    //二值化    cv::Mat thresholded, result;    cv::threshold(image, thresholded, 110, 255, cv::THRESH_BINARY);    cv::namedWindow("thresholded");    cv::imshow("thresholded", thresholded);    ///图片的补(图像求反)    cv::Mat image2;    image2 = resrve(thresholded);    cv::namedWindow("resrved");    cv::imshow("resrved", image2);    //闭运算    cv::Mat elements5(5, 5, CV_8U, cv::Scalar(1));    cv::Mat closed;    cv::morphologyEx(image2, closed, cv::MORPH_CLOSE, elements5);    cv::namedWindow(" Closed Image");    cv::imshow(" Closed Image", closed);    //闭运算    /*// Dilate the image膨胀图像    cv::Mat dilated;    cv::dilate(image2, dilated, cv::Mat());    // Erode the image腐蚀图像    cv::Mat result1;    cv::erode(dilated, result1, cv::Mat());*/    // Display the eroded image    cv::namedWindow("Closed Image2");    cv::imshow("Closed Image2", result1);    cv::waitKey(0);    return 0;}
阅读全文
0 0