首页 > 其他分享 >OpenCV图像腐蚀与膨胀(13)

OpenCV图像腐蚀与膨胀(13)

时间:2023-04-15 20:31:47浏览次数:44  
标签:kernel 13 img MORPH 形态学 OpenCV 腐蚀 result 图像

膨胀与腐蚀是数学形态学在图像处理中最基础的操作。其卷积操作非常简单,对于图像的每个像素,取其一定的邻域,计算最大值/最小值作为新图像对应像素位置的像素值。其中,取最大值就是膨胀,取最小值就是腐蚀。膨胀与腐蚀能实现多种多样的功能,主要如下:

  • 消除噪声
  • 分割出独立的图像元素,在图像中连接相邻的元素。
  • 寻找图像中的明显的极大值区域或极小值区域
  • 求出图像的梯度
  • 图像梯度计算的是图像变化的速度

形态学概述

形态学一词通常表示生物学的一个分支,该分支主要研究动植物的形态和结构。而我们图像处理中指的形态学,往往表示的是数学形态学。下面一起来了解数学形态学的概念。数学形态学是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换、灰值腐蚀和膨胀、灰值开闭运算、灰值形态学梯度等。简单来讲,形态学操作就是基于形状的一系列图像处理操作。opencv为进行图像的形态学变换提供了快捷、方便的函数。最基本的形态学操作有二种,他们是:膨胀与腐蚀

注意:在做图像的形态学处理的时候,需要对图像做二值化,且需要将处理的像素值改为255,因为图像的形态学处理操作都是基于白色像素上处理的

膨胀

膨胀操作是取每个位置领域内最大值,所以膨胀后输出图像的总体亮度的平均值比起原图会有所升高,图像中比较亮的区域的面积会变大,而较暗物体的尺寸会减小甚至消失。(增加高亮部分)

void dilate( InputArray src, OutputArray dst, InputArray kernel,Point anchor = Point(-1,-1), int iterations = 1,int borderType = BORDER_CONSTANT,const Scalar& borderValue = morphologyDefaultBorderValue() );
/*******************************************************************
*			src: 					输入图像
*			dst:					输出图像
*			kernel:					膨胀操作的核
*					参数为0:中心3*3的核
*			anchor:					锚点
*					(-1,-1):表示位于中心
*			iterations:				 迭代的次数
*			borderType:				 图像外部像素的某种边界模式
*			borderValue:			 边界值,一般不管
*********************************************************************/

腐蚀

膨胀和腐蚀是一对好基友,是相反的一对操作,所以腐蚀就是求局部最小值的操作。(减少高亮部分)

void erode( InputArray src, OutputArray dst, InputArray kernel,Point anchor = Point(-1,-1), int iterations = 1,int borderType = BORDER_CONSTANT,const Scalar& borderValue = morphologyDefaultBorderValue() );
/*******************************************************************
*			src: 					输入图像
*			dst:					输出图像
*			kernel:					 腐蚀操作的核
*					参数为0:中心3*3的核
*			anchor:					锚点
*					(-1,-1):表示位于中心
*			iterations:				 迭代的次数
*			borderType:				 断图像外部像素的某种边界模式
*			borderValue:			 边界值,一般不管
*********************************************************************/

核操作

getStructuringElement函数可用于构造一个特定大小和形状的结构元素,用于图像形态学处理

综合代码

#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
class Img 
{
public:
	Img() :img(imread("text.jpg")) 
	{
		result["原图"] = img;
	}
	void Show()
	{
		for (auto& v : result) 
		{
			imshow(v.first, v.second);
		}
		waitKey(0);
	}
	void Testdilate() 
	{
		Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));
		dilate(img, result["膨胀"], kernel);
	}
	void Testerode() 
	{
		Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));
		erode(img, result["腐蚀"], kernel);
	}
private:
	Mat img;
	map<string, Mat> result;
};
int main() 
{
	Img* pimg = new Img;
	pimg->Testdilate();
	pimg->Testerode();
	pimg->Show();
	return 0;
}

OpenCV图像腐蚀与膨胀(13)_#include

OpenCV图像开和闭运算

形态学处理

处理类型

操作

作用

开运算

先腐蚀再膨胀

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

闭运算

先膨胀后腐蚀

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

形态学梯度

膨胀图与腐蚀图之差

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

顶帽

原图与开运算图之差

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

黑帽

闭运算图与原图差

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

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

操作函数

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() );
/*******************************************************************
*			src: 					输入图像
*			dst:					输出图像
*			op:						 操作类型
*			kernel:					 操作的核
*					参数为0:中心3*3的核
*			anchor:					锚点
*					(-1,-1):表示位于中心
*			iterations:				 迭代的次数
*			borderType:				 图像外部像素的某种边界模式
*			borderValue:			 边界值,一般不管
*********************************************************************/
//操作类型
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  //随机操作,只支持CV_8UC1模式
}

核操作

getStructuringElement函数可用于构造一个特定大小和形状的结构元素,用于图像形态学处理

Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
/*******************************************************************
*			shape: 					形状类型
*			ksize:					大小
*			anchor:					锚点
*					(-1,-1):表示位于中心
*********************************************************************/
//shape取值
enum MorphShapes {
    MORPH_RECT    = 0, //矩形
    MORPH_CROSS   = 1, //十字交叉
    MORPH_ELLIPSE = 2  //椭圆                   
};

综合代码

#include <iostream>
#include <map>
#include <string>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
class Morphology 
{
public:
	Morphology() :img(imread("20.jpg")) 
	{
		result["原图"] = img;
	}
	void Show() 
	{
		for (auto& v : result) 
		{
			imshow(v.first, v.second);
		}
		waitKey(0);
	}

	void TestMorphology() 
	{
		Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));
		morphologyEx(img, result["腐蚀"], MORPH_ERODE, kernel);
		morphologyEx(img, result["膨胀"], MORPH_DILATE, kernel);
		morphologyEx(img, result["开"], MORPH_OPEN, kernel);
		morphologyEx(img, result["闭"], MORPH_CLOSE, kernel);
		morphologyEx(img, result["梯度"], MORPH_GRADIENT, kernel);
		morphologyEx(img, result["顶帽"], MORPH_TOPHAT, kernel);
		morphologyEx(img, result["黑帽"], MORPH_BLACKHAT, kernel);
	}
private:
	Mat img;
	map<string, Mat> result;
};
int main() 
{
	Morphology* pmorph = new Morphology;
	pmorph->TestMorphology();
	pmorph->Show();
	return 0;
}

OpenCV图像腐蚀与膨胀(13)_图像处理_02

标签:kernel,13,img,MORPH,形态学,OpenCV,腐蚀,result,图像
From: https://blog.51cto.com/u_15959862/6192434

相关文章

  • [oeasy]python00134_[趣味拓展]python起源_历史_Guido人生_ABC编程语言_Tanenbaum
    python历史回忆上次内容颜文字是kaomoji把字符变成一种图画的方法一层叠一层很多好玩儿的kaomoji是一层层堆叠起来的meme虚拟的表情也在真实世界有巨大影响一步步地影响字符编码就是这样一步步发展过来的python也是一步步发展到今天的python究竟是怎么发展的呢?......
  • [oeasy]python00134_[趣味拓展]python起源_历史_Guido人生_ABC编程语言_Tanenbaum
    python历史回忆上次内容颜文字是kaomoji把字符变成一种图画的方法一层叠一层很多好玩儿的kaomoji是一层层堆叠起来的meme ​ 添加图片注释,不超过140字(可选) 虚拟的表情也在真实世界有巨大影响一步步地影响 ​......
  • coloros13.1更新了什么
    OPPO即将发布新的操作系统,ColorOS13.1操作系统,随着即将发布的消息公布之后,很多小伙伴都很关注ColorOS13.1操作系统,对于这个新的操作系统具体更新了哪些板块也很期待。coloros13.1更新了什么答:更新了高效会议、高效出行和高效办公等功能,还更新了网络和内存基因重组技术。1、高......
  • coloros13.1升级名单
    手机系统都是在不断更新升级的,新系统会修复一些已知问题,也会提升我们的使用感受,不少小伙伴们对手机系统的更新升级还是很在意的,下面介绍一下coloros13.1升级名单。coloros13.1升级名单详情 OPPOK9Pro5GOPPOK9x5GOPPOA555GOPPOA55s5Gcoloros13.1系统介绍1、屏幕......
  • coloros13.1什么时候正式上线
    OPPO公司即将将全新的coloros13.1操作系统发布,ColorOS13.1操作系统实现了将高负载内存优化,突破了性能上限等操作,所以很多小伙伴对这个新的操作系统还是非常期待的。coloros13.1什么时候正式上线答:4月21日正式上线。ColorOS13.1操作系统开通了双5G的通讯共享技术,可以快速连......
  • Luogu_P1613 跑路 题解
    发现和最短路差不多,不过不能朴素的跑最短路。考虑对于每两个相隔\(2\)的整数次幂的点建边,在这个新图上跑最短路就是答案。设\(f_{i,j,k}\)表示从点\(i\)跳\(2^k\)步能否到点\(j\),转移方程就是一个普通的倍增。如果点\(i\)和点\(j\)可以一步到达,那么就在新图上建一条......
  • OpenCV图像阈值操作(12)
    什么是阈值阈值又叫临界值,是指一个效应能够产生的最低值或最高值。实际上是基于图片亮度的一个黑白分界值,默认值是50%中性灰,即128,亮度高于128(<50%的灰)的会变白,低于128(>50%的灰)的会变黑。从一副图像中利用阈值分割出我们需要的物体部分(当然这里的物体可以是一部分或者整体)。这样......
  • 23-04-13
    #A.最大子段和最大子段和(正常)for(inti=1;i<=n;i++)sum[i]=max(sum[i-1]+in[i],in[i]);\(sum[i]\)表示以第i个数为结尾的最大子段和,可以由前一个最大子段和转移过来\((sum[i-1]+in[i])\),也可以只包含自己\((in[i])\);本题用\(fr[i]\)表示以前i个数的最大子段和,\(......
  • leetcode-1360-easy
    NumberofDaysBetweenTwoDatesWriteaprogramtocountthenumberofdaysbetweentwodates.Thetwodatesaregivenasstrings,theirformatisYYYY-MM-DDasshownintheexamples.Example1:Input:date1="2019-06-29",date2="201......
  • kuangbin专题一 简单搜索 棋盘问题(POJ-1321)
    棋盘问题TimeLimit:1000MS MemoryLimit:10000KTotalSubmissions:125427 Accepted:56304Description在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘......