您现在的位置是:首页 >技术教程 >【OpenCv • c++】形态学技术操作 —— 腐蚀与膨胀网站首页技术教程

【OpenCv • c++】形态学技术操作 —— 腐蚀与膨胀

锡兰_CC 2024-06-14 17:18:30
简介【OpenCv • c++】形态学技术操作 —— 腐蚀与膨胀

  • ? 个人简介:CSDN「博客新星」TOP 10 , C/C++ 领域新星创作者
  • ? 作    者:锡兰_CC ❣️
  • ? 专    栏:【OpenCV • c++】计算机视觉
  • ? 若有帮助,还请关注➕点赞➕收藏,不行的话我再努努力???

前言

形态学腐蚀膨胀操作是形态学的基本操作,常用于图形处理方面,实现了对目标像素点进行拓展的目的。从数学角度来讲,腐蚀膨胀操作就是将图像或者图像的一部分(称之为核A)与核(称之为核B)进行卷积。

腐蚀

Q:什么是腐蚀?
A: 腐蚀就是求局部最小值的操作,也就是核B与图像进行卷积,计算核B覆盖区域的像素点的最小值,并把最小值赋值给参考点指定的像素,使得图像中的白色区域变小。

参考代码

void erode(
	InputArray src,
	OutputArray dst,
	InputArray kernel,
	Point anchor = Point(-1, -1),
	int iterations = 1,
	int borderType = BORDER_CONSTANT,
	const Scalar& borderValue = morphologyDefaultB - orderValue()
)

其中,src代表输入图像(二值化、灰度图像),dst 代表输出图像,kernel表示定义的结构元素大小,anchor代表结构元素的中心,如果默认参数为 (-1,-1),程序会自动将其设置为结构元素的中心。iteration为迭代次数,可以选择对图像进行多次形态学运算。borderType以及borderValue是可选择参数设置,针对边界设置。

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/types_c.h>
#include<opencv2/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;

int main() {
	cv::Mat srcImage = cv::imread("C:\Users\86173\Desktop\cc.png");
	if (!srcImage.data)
		return 1;
	cv::Mat srcGray;
	cvtColor(srcImage, srcGray, CV_RGB2GRAY);
	cv::Mat segDst, dilDst, eroDst;
	// 分通道二值化
	cv::inRange(srcGray, cv::Scalar(100),
		cv::Scalar(255), segDst);
	// 定义结构元素
	cv::Mat element = cv::getStructuringElement(
		cv::MORPH_ELLIPSE, cv::Size(5, 5));
	// 腐蚀膨胀操作
	cv::erode(segDst, eroDst, element);
	cv::imshow(" srcGray ", srcGray);
	cv::imshow(" segDst ", segDst);
	cv::imshow(" eroDst ", eroDst);
	cv::waitKey();
	return 0;
}

实现效果

在这里插入图片描述

膨胀

Q:什么是膨胀?
A: 膨胀就是求局部最大值的操作,也就是核B与图像进行卷积,计算核B覆盖区域的像素点的最大值,并把最大值赋值给参考点指定的像素,使得图像中的白色区域变大。

参考代码

void dilate(
	InputArray src,
	OutputArray dst,
	InputArray kernel,
	Point anchor = Point(-1, -1),
	int iterations = 1,
	int borderType = BORDER_CONSTANT,
	const Scalar& borderValue = morphologyDefault - BorderValue()
)

其中,src代表输入图像(二值化、灰度图像),dst 代表输出图像,kernel表示定义的结构元素大小,anchor代表结构元素的中心,如果默认参数为 (-1,-1),程序会自动将其设置为结构元素的中心。iteration为迭代次数,可以选择对图像进行多次形态学运算。borderType以及borderValue是可选择参数设置,针对边界设置。

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/types_c.h>
#include<opencv2/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;

int main() {
	cv::Mat srcImage = cv::imread("C:\Users\86173\Desktop\cc.png");
	if (!srcImage.data)
		return 1;
	cv::Mat srcGray;
	cvtColor(srcImage, srcGray, CV_RGB2GRAY);
	cv::Mat segDst, dilDst, eroDst;
	// 分通道二值化
	cv::inRange(srcGray, cv::Scalar(100),
		cv::Scalar(255), segDst);
	// 定义结构元素
	cv::Mat element = cv::getStructuringElement(
		cv::MORPH_ELLIPSE, cv::Size(5, 5));
	// 腐蚀膨胀操作
	cv::dilate(segDst, dilDst, element);
	cv::imshow(" srcGray ", srcGray);
	cv::imshow(" segDst ", segDst);
	cv::imshow(" dilDst ", dilDst);
	cv::waitKey();
	return 0;
}

实现效果

在这里插入图片描述

其他

更多专栏订阅:

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。