OpenCV图像处理学习十一,图像开操作与闭操作

一.开操作:

开操作即为先腐蚀后膨胀。以单通道的黑白图像为例,先通过腐蚀操作,将黑色区域腐蚀扩大,再通过膨胀操作,将白色区域膨胀扩大。如果图像上有一个小白色像素点,先通过腐蚀操作,被周围的黑色像素点覆盖掉,再进行膨胀操作,去掉小的白色像素点。

在二值图中,表现为去掉白色的小点或填充黑点

形态学操作API函数接口:

void cv::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() 
    )   


(1)InputArray类型的src,输入图像。通道数可以任意,但深度应为CV_8U、CV_16U、CV_16S、CV_32F或CV_64F之一。

(2)OutputArray类型的dst,即目标图像,与输入图像有相同的尺寸和类型。

(3)int类型的op,形态学操作的类型,请参见cv::MorphTypes

(4)InputArray类型的kernel,用于膨胀的结构元素;如果elemenat=Mat(),则使用3 x 3矩形结构元素。可以使用getStructuringElement创建内核。

(5)Point类型的anchor:锚定在元素中的位置;默认值(-1,-1)表示锚定在元素中心。

(6)int类型的iterations:应用膨胀的次数。

(7)int类型的borderType:像素外推方法,参见cv::BorderTypes。

(8)Scalar类型的borderValue:恒定边框时的边框值。

cv::MorphTypes结构体内容如下:

enum MorphTypes{
    MORPH_ERODE    = 0,  //腐蚀
    MORPH_DILATE   = 1,  //膨胀
    MORPH_OPEN     = 2,  //开操作
    MORPH_CLOSE    = 3,  //闭操作
    MORPH_GRADIENT = 4,  //梯度操作
    MORPH_TOPHAT   = 5,  //顶帽操作
    MORPH_BLACKHAT = 6,  //黑帽操作
};

二.闭操作:

闭操作即为先膨胀后腐蚀,以单通道的黑白图像为例,先通过膨胀操作,将白色区域膨胀扩大,再通过腐蚀操作,将黑色区域腐蚀扩大。一个小的黑色像素点,先通过膨胀操作,被周围的白色覆盖掉,再进行腐蚀操作,去除小的黑色像素点。也就是合适的闭操作,可以填充小对象。


 =========================================================================

代码实现:

#include"stdafx.h"
#include<opencv2\imgproc\types_c.h>
#include<opencv2\opencv.hpp>
#include<iostream>

using namespace std;
using namespace cv;

int main()
{

	Mat image1 = imread("F:/photo/qx.jpg", 1);
	namedWindow("input_picture1");
	imshow("input_picture1", image1);

	Mat image2;
	Mat image3;
	cvtColor(image1, image2, COLOR_RGB2GRAY);
	namedWindow("input_picture2");
	imshow("input_picture2", image2);

	threshold(image2, image3, 65, 255, THRESH_BINARY);
	namedWindow("input_picture3");
	imshow("input_picture3", image3);

	
	Mat dst;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(7, 7), Point(-1, -1));
	//开操作
	morphologyEx(image3, dst, CV_MOP_OPEN, kernel);
	imshow("open-src", dst);
	//闭操作
	morphologyEx(image3, dst, CV_MOP_CLOSE, kernel);
	imshow("close-src", dst);
	//形态学梯度
	//morphologyEx(image3, dst, CV_MOP_GRADIENT, kernel);
	//imshow("gradient-src", dst);
	//顶帽
	//morphologyEx(image3, dst, CV_MOP_TOPHAT, kernel);
	//imshow("tophat-src", dst);
	//黑帽
	//morphologyEx(image3, dst, CV_MOP_BLACKHAT, kernel);
	//imshow("blackhat-src", dst);

	waitKey(0);
	return 0;
}

图像处理效果:

原图和灰度图片

灰度图和二值化图

图像开操作和闭操作

猜你喜欢

转载自blog.csdn.net/weixin_44651073/article/details/126334714