OpenCV(七)形态学操作2--开运算与闭运算

目录

概述:

morphologyEX()函数

一、开运算(分开)

1、基础理论

1、作用:

2、代码

3、效果

二、闭运算(封闭)

1、基础理论

1、作用

2、过程

2、代码

3、效果

总代码

参考资料:


概述:

运算类型

操作

目的

开运算

先腐蚀再膨胀

可在纤细点出分离物体。有助于消除噪音

闭运算

先膨胀后腐蚀

用于排除前景对象中的小孔或对象上的小黑点

形态学梯度

膨胀图与腐蚀图之差

用于保留目标物体的边缘轮廓

顶帽

原图与开运算图之差

分离比邻近点亮的斑块,用于突出原图像中比周围亮的区域

黑帽

闭运算图-原图像

分离比邻近点暗的斑块,突出原图像中比周围暗的区域

形态学处理往往是在阈值处理之后才进行的,因为当图像被转化为二值图以后,这个时候只有黑白两者颜色,然后再进行形态学处理是效果最好的

morphologyEX()函数

morphologyEx(Mat src, Mat dst, int op, Mat kernel, Point anchor, int iterations, int borderType, Scalar borderValue)

参数介绍:

第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像位深应该为以下五种之一:CV_8U, CV_16U,CV_16S, CV_32F 或CV_64F。
第二个参数,OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。
第三个参数,int类型的op,表示形态学运算的类型,可以是如下之一的标识符:  

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

第四个参数,InputArray类型的kernel,形态学运算的内核。

一、开运算(分开)

1、基础理论

1、作用:

1、分离物体,消除小区域。

2、消除噪点消除小干扰块,而不影响原来的图像。

2、过程:

腐蚀运算,再膨胀运算(看上去把细微连在一起的两块目标分开了)

 (1)腐蚀

 (2)膨胀

2、代码

C++:

//开运算
void Open()
{
	Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11));  //创建结构元
	//								  矩形卷积核		尺寸为(19, 19)宽高
	morphologyEx(img, dst, MORPH_OPEN, kernel, Point(-1, -1));     // 形态学处理--开运算
	//			原图  新图  开运算		卷积核  锚点				  
	imshow("新图", dst);               // 显示形态学处理后的效果
}

python:

# 开运算(先腐后膨)
def Open():
    open = cv2.morphologyEx(img, cv2.MORPH_OPEN, (7, 7), iterations=5)
    #                            类型             卷积核大小    迭代次数
    cv2.imshow('open', open)

3、效果

 

二、闭运算(封闭)

1、基础理论

1、作用

消除闭合区域内的空洞,填充闭合区域。

2、过程

膨胀运算,再腐蚀运算(看上去将两个细微连接的图块封闭在一起)

(1)膨胀

 (2)腐蚀

2、代码

C++:

//闭运算
void Close()
{
	Mat kernel = getStructuringElement(MORPH_RECT, Size(19, 19));  //创建结构元
	//								  矩形卷积核		尺寸为(19, 19)宽高
	morphologyEx(img, dst, MORPH_CLOSE, kernel, Point(-1, -1));     // 形态学处理--开运算
	//			原图  新图  闭运算		卷积核  锚点				  
	imshow("闭运算", dst);               // 显示形态学处理后的效果
}

python:

# 闭运算(先膨后腐)
def Close():
    close = cv2.morphologyEx(img, cv2.MORPH_CLOSE, (7, 7), iterations=5)
    #                            类型             卷积核大小    迭代次数
    cv2.imshow('close', close)

3、效果

 

 

                                                        

总代码

C++:

//开运算与闭运算(形态学)
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

Mat img, dst;

//图像初始化
void Image_Init()
{
	img = imread("Resource/test5.jpg");
	dst = Mat::zeros(img.size(), img.type());

	if (img.empty())
	{
		printf("图像加载失败");
		exit(0);
	}
}

//开运算
void Open()
{
	Mat kernel = getStructuringElement(MORPH_RECT, Size(19, 19));  //创建结构元
	//															矩形卷积核		尺寸为(11,11)宽高
	morphologyEx(img, dst, MORPH_OPEN, kernel, Point(-1, -1));     // 形态学处理--开运算
	//						原图  新图  开运算				 卷积核  锚点				  
	imshow("开运算", dst);               // 显示形态学处理后的效果
}

//闭运算
void Close()
{
	Mat kernel = getStructuringElement(MORPH_RECT, Size(19, 19));  //创建结构元
	//															矩形卷积核		尺寸为(11,11)宽高
	morphologyEx(img, dst, MORPH_CLOSE, kernel, Point(-1, -1));     // 形态学处理--开运算
	//						原图  新图  闭运算				 卷积核  锚点				  
	imshow("闭运算", dst);               // 显示形态学处理后的效果
}


//显示图像
void Show()
{
	imshow("原图", img);
}

int main()
{
	Image_Init();								//图像初始化

	Open();										//开运算

	Close();									//闭运算

	Show();										//显示原图像


	waitKey(0);

	return 0;
}

python:

# 形态学(膨胀、腐蚀、开闭运算、顶帽与底帽)
import cv2

# 膨胀
def Dilate():
    # 膨胀
    dilate = cv2.dilate(img, kernel=(7, 7), iterations=1)
    #                        卷积核大小      迭代次数
    cv2.imshow("dilate", dilate)


# 腐蚀
def Enrode():
    # 腐蚀
    erode = cv2.erode(img, kernel=(7, 7), iterations=5)
    #                        卷积核大小      迭代次数
    cv2.imshow("erode", erode)


# 开运算(先腐后膨)
def Open():
    open = cv2.morphologyEx(img, cv2.MORPH_OPEN, (7, 7), iterations=5)
    #                            类型             卷积核大小    迭代次数
    cv2.imshow('open', open)


# 闭运算(先膨后腐)
def Close():
    close = cv2.morphologyEx(img, cv2.MORPH_CLOSE, (7, 7), iterations=5)
    #                            类型             卷积核大小    迭代次数
    cv2.imshow('close', close)


# 顶帽(原-开)
def TopHat():
    tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, (7, 7), iterations=5)
#                                   类型              卷积核   迭代次数
    cv2.imshow('TopHat', tophat)


# 底帽(原-闭)
def BlackHat():
    blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT,  (7, 7), iterations=5)
#                                    类型                  卷积核   迭代次数
    cv2.imshow('BlackHat', blackhat)


if __name__ == '__main__':
    # 读取图片
    img = cv2.imread("Resource/test5.jpg")
    cv2.imshow("img", img)

    Dilate()        #膨胀

    Enrode()        #腐蚀

    Open()          #开运算

    Close()         #闭运算

    TopHat()        #顶帽运算

    BlackHat()      #底帽运算

    cv2.waitKey(0)

参考资料:

https://blog.csdn.net/dujuancao11/article/details/109339686?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162855777116780271518767%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162855777116780271518767&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-17-109339686.pc_search_result_control_group&utm_term=%E5%BD%A2%E6%80%81%E5%AD%A6%E5%BC%80%E9%97%AD%E8%BF%90%E7%AE%97&spm=1018.2226.3001.4187

https://blog.csdn.net/weixin_41695564/article/details/79935028 

https://www.jianshu.com/p/ee72f5215e07

  • 1
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_(*^▽^*)_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值