OpenCV(八)形态学操作3--形态学梯度实现轮廓分析(基本梯度、内部梯度、外部梯度、方向梯度X(Y))
目录
形态学梯度概述
一、基本梯度
1、原理
2、代码
3、效果
二、内部梯度
1、原理
2、代码
3、效果
三、外部梯度
1、原理
2、代码
3、效果
四、方向梯度
1、原理
2、二值化图像(黑白)
3、求X(Y)轴方向梯度
X轴:
Y轴:
总代码
参考资料:
形态学梯度概述
作用:保留物体的边缘轮廓,便于轮廓分析(突出高亮区域)
形态学梯度定义: G = I⊕S − I!S
(其中G为输出图像,I为输入图像,S为卷积核函数。⊕为膨胀运算,!为腐蚀运算。
- 形态学梯度操作的输出图像像素值是在对应结构元素而非局部过渡区域所定义的领域中灰度级强度变化的最大值。
- 对二值图像进行形态学操作可以将团块(blob)的边缘突出出来,可以用形态学梯度来保留物体的边缘轮廓。
一、基本梯度
1、原理
基本梯度 = 膨胀图像 - 腐蚀图像
基本梯度是用膨胀后的图像减去腐蚀后的图像得到差值图像,称为梯度图像也是OpenCV中支持的计算形态学梯度的方法,而此方法得到梯度有被称为基本梯度。
2、代码
//基本梯度(膨胀-腐蚀)
void BasicGrad()
{//创建卷积核(结构元)Mat kernel = getStructuringElement(MORPH_RECT, Size(15, 15), Point(-1, -1));//创建新图像(膨胀、腐蚀)Mat dilate_output, erode_ouput;dilate(img, dilate_output, kernel, Point(-1, -1)); //膨胀erode(img, erode_ouput, kernel, Point(-1, -1)); //腐蚀//计算基本梯度subtract(dilate_output, erode_ouput, dst, Mat()); //膨胀-腐蚀// 膨胀 腐蚀 结果imshow("基本梯度", dst);
}
3、效果
二、内部梯度
1、原理
内部梯度 = 原图像 - 腐蚀图像
内部梯度是用原图像减去腐蚀之后的图像得到差值图像。
2、代码
//内部梯度(原图-腐蚀)
void InternalGrad()
{//创建卷积核(结构元)Mat kernel = getStructuringElement(MORPH_RECT, Size(15, 15), Point(-1, -1));//创建新图(腐蚀)Mat erode_ouput;erode(img, erode_ouput, kernel, Point(-1, -1)); //腐蚀//计算内部梯度(原图-腐蚀)subtract(img, erode_ouput, dst, Mat());imshow("内部梯度", dst);
}
3、效果
三、外部梯度
1、原理
外部梯度 = 膨胀图像 - 原图像
外部梯度使用膨胀之后的图像减去原来的图像得到的差值图像。
2、代码
//外部梯度(膨胀-原图)
void ExternalGrad()
{//创建卷积核(结构元)Mat kernel = getStructuringElement(MORPH_RECT, Size(15, 15), Point(-1, -1));//创建新图(膨胀)Mat dilate_output;dilate(img, dilate_output, kernel, Point(-1, -1)); //膨胀//计算外部梯度(膨胀-原图)subtract(dilate_output, img, dst, Mat());imshow("外部梯度", dst);
}
3、效果
四、方向梯度
1、原理
方向梯度是使用X方向与Y方向的直线作为结构元素之后得到图像梯度。
用X方向直线做结构元素分别膨胀与腐蚀之后得到图像求差值之后称为X方向梯度;
用Y方向直线做结构元素分别膨胀与腐蚀之后得到图像求差值之后称为Y方向梯度。
2、二值化图像(黑白)
开始计算方向梯度前,先把图像二值化(黑白化)。
二值化步骤:
1、先把彩图转灰度图
2、再把灰度图转黑白图(二值化)
//图像二值化
void ToBin()
{// 1、转为灰度图cvtColor(img, grayImage, COLOR_BGR2GRAY);// 2、将灰度图二值化threshold(grayImage, binImg, 0, 255, THRESH_OTSU);
}
3、求X(Y)轴方向梯度
X方向梯度 = X轴方向膨胀 - X轴方向腐蚀 (黑白图像)
Y方向梯度 = Y轴方向膨胀 - Y轴方向腐蚀 (黑白图像)
把黑白图像分别沿X(Y)轴膨胀和腐蚀,最后求差值。
X轴:
//X方向梯度(黑白图:沿X轴方向膨胀 - 沿X方向腐蚀)
void XDirectGrad()
{//X方向梯度:使用X方向的直线作为结构元素Mat X = getStructuringElement(MORPH_RECT, Size(img.cols / 32, 1)); //X向量:宽XX,高1Mat dilate_direct, erode_direct; //膨胀与腐蚀图像Mat xDirectImg; //X方向梯度图像// 1、图像二值化ToBin();// 2、沿X轴方向分别膨胀和腐蚀dilate(binImg, dilate_direct, X); //沿X轴方向膨胀erode(binImg, erode_direct, X); //沿X轴方向腐蚀// 3、X 方向梯度:X轴方向膨胀 - X轴方向腐蚀subtract(dilate_direct, erode_direct, xDirectImg, Mat());imshow("X 方向梯度", xDirectImg);
}
Y轴:
//Y方向梯度(黑白图:沿Y轴方向膨胀 - 沿Y方向腐蚀)
void YDirectGrad()
{//Y方向梯度:使用Y方向的直线作为结构元素Mat Y = getStructuringElement(MORPH_RECT, Size(1, img.rows / 32)); //Y向量:宽1,高XXMat dilate_direct, erode_direct; //膨胀与腐蚀图像Mat yDirectImg; //Y方向梯度图像// 1、图像二值化ToBin();// 2、沿Y轴方向分别膨胀和腐蚀dilate(binImg, dilate_direct, Y); //沿Y轴方向膨胀erode(binImg, erode_direct, Y); //沿Y轴方向腐蚀// 3、Y 方向梯度:Y轴方向膨胀 - Y轴方向腐蚀subtract(dilate_direct, erode_direct, yDirectImg, Mat());imshow("Y 方向梯度", yDirectImg);
}
总代码
//形态学梯度(基本梯度、内部梯度、外部梯度、方向梯度X(Y))
#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;Mat img, dst;
Mat grayImage, binImg;//图像初始化
void Image_Init()
{img = imread("Resource/test7.jpg");dst = Mat::zeros(img.size(), img.type());if (img.empty()){printf("图像加载失败");exit(0);}
}//基本梯度(膨胀-腐蚀)
void BasicGrad()
{//创建卷积核(结构元)Mat kernel = getStructuringElement(MORPH_RECT, Size(15, 15), Point(-1, -1));//创建新图像(膨胀、腐蚀)Mat dilate_output, erode_ouput;dilate(img, dilate_output, kernel, Point(-1, -1)); //膨胀erode(img, erode_ouput, kernel, Point(-1, -1)); //腐蚀//计算基本梯度subtract(dilate_output, erode_ouput, dst, Mat()); //膨胀-腐蚀// 膨胀 腐蚀 结果imshow("基本梯度", dst);
}//内部梯度(原图-腐蚀)
void InternalGrad()
{//创建卷积核(结构元)Mat kernel = getStructuringElement(MORPH_RECT, Size(15, 15), Point(-1, -1));//创建新图(腐蚀)Mat erode_ouput;erode(img, erode_ouput, kernel, Point(-1, -1)); //腐蚀//计算内部梯度(原图-腐蚀)subtract(img, erode_ouput, dst, Mat());imshow("内部梯度", dst);
}//外部梯度(膨胀-原图)
void ExternalGrad()
{//创建卷积核(结构元)Mat kernel = getStructuringElement(MORPH_RECT, Size(15, 15), Point(-1, -1));//创建新图(膨胀)Mat dilate_output;dilate(img, dilate_output, kernel, Point(-1, -1)); //膨胀//计算外部梯度(膨胀-原图)subtract(dilate_output, img, dst, Mat());imshow("外部梯度", dst);
}//图像二值化
void ToBin()
{// 1、转为灰度图cvtColor(img, grayImage, COLOR_BGR2GRAY);// 2、将灰度图二值化threshold(grayImage, binImg, 0, 255, THRESH_OTSU);
}//X方向梯度(黑白图:沿X轴方向膨胀 - 沿X方向腐蚀)
void XDirectGrad()
{//X方向梯度:使用X方向的直线作为结构元素Mat X = getStructuringElement(MORPH_RECT, Size(img.cols / 32, 1)); //X向量:宽XX,高1Mat dilate_direct, erode_direct; //膨胀与腐蚀图像Mat xDirectImg; //X方向梯度图像// 1、图像二值化ToBin();// 2、沿X轴方向分别膨胀和腐蚀dilate(binImg, dilate_direct, X); //沿X轴方向膨胀erode(binImg, erode_direct, X); //沿X轴方向腐蚀// 3、X 方向梯度:X轴方向膨胀 - X轴方向腐蚀subtract(dilate_direct, erode_direct, xDirectImg, Mat());imshow("X 方向梯度", xDirectImg);
}//Y方向梯度(黑白图:沿Y轴方向膨胀 - 沿Y方向腐蚀)
void YDirectGrad()
{//Y方向梯度:使用Y方向的直线作为结构元素Mat Y = getStructuringElement(MORPH_RECT, Size(1, img.rows / 32)); //Y向量:宽1,高XXMat dilate_direct, erode_direct; //膨胀与腐蚀图像Mat yDirectImg; //Y方向梯度图像// 1、图像二值化ToBin();// 2、沿Y轴方向分别膨胀和腐蚀dilate(binImg, dilate_direct, Y); //沿Y轴方向膨胀erode(binImg, erode_direct, Y); //沿Y轴方向腐蚀// 3、Y 方向梯度:Y轴方向膨胀 - Y轴方向腐蚀subtract(dilate_direct, erode_direct, yDirectImg, Mat());imshow("Y 方向梯度", yDirectImg);
}//显示图像
void Show()
{imshow("原图", img);
}int main()
{Image_Init(); //图像初始化BasicGrad(); //基本梯度InternalGrad(); //内部梯度ExternalGrad(); //外部梯度XDirectGrad(); //X方向梯度YDirectGrad(); //Y方向梯度Show(); //显示原图像waitKey(0);return 0;
}
参考资料:
https://blog.csdn.net/sinat_36264666/article/details/78629600?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162856242416780261952100%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162856242416780261952100&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-78629600.pc_search_result_control_group&utm_term=%E5%BD%A2%E6%80%81%E5%AD%A6%E6%A2%AF%E5%BA%A6&spm=1018.2226.3001.4187
https://blog.csdn.net/weixin_41695564/article/details/79935028
https://blog.csdn.net/qq_41498261/article/details/103112661?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%BD%A2%E6%80%81%E5%AD%A6%E6%A2%AF%E5%BA%A6&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-7-.nonecase&spm=1018.2226.3001.4187
OpenCV(八)形态学操作3--形态学梯度实现轮廓分析(基本梯度、内部梯度、外部梯度、方向梯度X(Y))相关推荐
- 形态学操作之膨胀与腐蚀
文章目录 1. 形态学 2. 腐蚀 - 黑进白退 3. 膨胀 - 白进黑退 4. 开/闭运算 5. 其它形态学操作 1. 形态学 形态学操作是根据图像形状进行的简单操作.一般情况下对二值化图像/灰 ...
- 【Groovy】MOP 元对象协议与元编程 ( Groovy 类内部和外部分别获取 metaClass | 分析获取 metaClass 操作的字节码 | HandleMetaClass 注入方法 )
文章目录 一.Groovy 类内部和外部分别获取 metaClass 二.分析 Groovy 类内部和外部获取 metaClass 操作的字节码 三.使用 HandleMetaClass 注入方法 一 ...
- opencv进阶学习笔记13:图像形态学操作大全(膨胀,腐蚀,开闭,黑帽,顶帽,梯度)python版
基础版学习笔记: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 基础版形态学: opencv学 ...
- OpenCV与图像处理学习六——图像形态学操作:腐蚀、膨胀、开、闭运算、形态学梯度、顶帽和黑帽
OpenCV与图像处理学习六--图像形态学操作:腐蚀.膨胀.开.闭运算.形态学梯度.顶帽和黑帽 四.图像形态学操作 4.1 腐蚀和膨胀 4.1.1 图像腐蚀 4.1.2 图像膨胀 4.2 开运算与闭运 ...
- opencv 实现图像形态学操作 膨胀和腐蚀 开闭运算 形态学梯度 顶帽和黑帽
图像膨胀和腐蚀 图解 原理及python实现 更多内容:图像膨胀和腐蚀原理及python实现 opencv中膨胀和腐蚀函数 dilation = cv.dilate(img, kernel) # 膨胀 ...
- 2020.11.01 使用OpenCV进行图像形态学操作(开、闭、梯度)【OpenCV C++】
进行基础的图像形态学操作练习 (开操作.闭操作.梯度.顶帽.黑帽操作) 源代码: // #include <opencv2/opencv.hpp> #include <iostrea ...
- OpenCV 形态学操作之腐蚀与膨胀,开运算与闭运算,顶帽与黑帽,图像梯度运算相关知识点回顾
Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧.本篇博客是这个系列的第 45 篇. 该系列文章导航参考:https://blog.csdn.net/hihell/categ ...
- openCV专栏(五):形态学操作+梯度算子
OPENCV基础操作 提示:本专栏所用版本仅供参考,其他版本也可 库 版本 python Python 3.9.3 opencv 4.5.5 matplotlib 3.4.3 numpy 1.19.5 ...
- 使用Python,OpenCV进行形态学操作
使用Python,OpenCV进行形态学操作) 1. 效果图 2. 原理 3. 源码 3.1 [制作logo源码](https://blog.csdn.net/qq_40985985/article/ ...
最新文章
- ElasticSearch(3)-安装kibana
- 【福利】有道云笔记免费送30天VIP会员,有道云笔记功能优缺点汇总
- mongodb导出查询结果
- GCD 深入理解:第一部分
- PHP超实用的函数总结整理
- Github带来的不止是开源,还有折叠的认知
- 西北冬日的校园很静谧,却不失韵味,因为有我们美好的青春!
- R语言给图形填充颜色(polygon函数)
- matlab中ga函数用法,matlab遗传算法ga函数
- mysql指定某行或者某列的排序
- Java中的System.getProperty()设置参数的方法
- 数据库连接失败could not find driver 解决方法
- 工作站Linux双显卡BIOS设置,在BIOS Setup里面设置双显卡机型的双显卡模式常见方式介绍...
- 文档计算机无法分页,word文档总是重新分页 word文档老是分页显示怎么解决
- LeetCode-Hot100-最长回文子串
- 游戏开发九宫格战斗架构解析具体解释
- 23.敏捷优秀实践 - 产品开发流程
- 文学档次,也可以是背出来的【148…
- [HNOI2002] 沙漠寻宝题解
- 芋道 Spring Security OAuth2 入门
热门文章
- 请给出一个Scala RDD的HelloWorld例子
- n皇后问题JS实现(N-Queens)
- 浙江大学数学专业考研试题参考解答
- ECSHOP 数据库结构说明
- 死锁产生的原因和解锁的方法
- 接口与抽象类的使用选择
- Hibernate的一级缓存
- eclipse CreateProcess error=87 的解决办法
- 狗年拜年php源码,2018狗年拜年词大全!再也不担心拜年没祝词啦~祝您新年快乐!...
- 广西卫生职业技术学院计算机考试,广西卫生职业技术学院单招2021年春招分数线...