1.腐蚀

概述:腐蚀掉图像的细节。若图像有很多毛刺,通过腐蚀操作,可以将毛刺消除。

下面所说的“值”可以简单理解为RGB三个通道[0,255],值越小,亮度越低,值越大,亮度越高。

我们首先定义了一个3*3的矩阵作为,我们不关心矩阵的值,只关心他的大小。在图像中用核选中3*3的像素块,若像素块中的值相差很大(我们可以将其想象成边界),值大的像素点会被值小的像素点给取代。这种计算操作对于图像的边缘是极为敏感的。

函数:erode(cv::InputArray src, cv::OutputArray dst, cv::InputArray kernel)

参数:在腐蚀操作中,我们主要关注以下三个参数。另一些关于边界填充的参数这里不做介绍。

1.cv::InputArray src 输入图像
2.OutputArray dst 输出图像
3.InputArray kernel

核:n*n的矩阵。n越大,腐蚀的越厉害

代码: 

#include <iostream>
#include <opencv.hpp>
#include <core/core.hpp>
#include <highgui/highgui.hpp>using namespace cv;
using namespace std;int main()
{Mat image_1 = imread("lena.jpg");Mat res;//定义一个3*3大小的方形核Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));erode(image_1,res,element);imshow("lena", image_1);imshow("res",res);waitKey(0);return 0;
}

输出结果:可以注意到很多毛刺都变得更加细,或者被消除。

2.膨胀

概述:与腐蚀相反,膨胀后的图片会将放大图像的细节。

其实原理和腐蚀原理一样。所说的“值”可以简单理解为RGB三个通道[0,255],值越小,亮度越低,值越大,亮度越高。

我们首先定义了一个3*3的矩阵作为,我们不关心矩阵的值,只关心他的大小。在图像中用核选中3*3的像素块,若像素块中的值相差很大(我们可以将其想象成边界),值小的像素点会被值大的像素点给取代。也就是亮度高的像素点会被放大取代亮度低的背景像素点。

函数:dilate(cv::InputArray src, cv::OutputArray dst, cv::InputArray kernel)

参数:在膨胀操作中,我们也只关注以下三个参数。

1.cv::InputArray src 输入图像
2.OutputArray dst 输出图像
3.InputArray kernel

核:n*n的矩阵。n越大,腐蚀的越厉害

代码:

#include <iostream>
#include <opencv.hpp>
#include <core/core.hpp>
#include <highgui/highgui.hpp>using namespace cv;
using namespace std;int main()
{Mat image_1 = imread("lena.jpg");Mat res;//定义一个3*3大小的方形核Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));dilate(image_1,res,element);imshow("lena", image_1);imshow("res",res);waitKey(0);return 0;
}

输出结果:第一眼看,图像变得更加模糊。但是仔细观察会发现,一些噪声点(白点),发丝等细节被放大。

3.开运算

 概述:先对图像进行腐蚀,再对图像进行膨胀。

函数:形态学计算(开运算、闭运算、梯度运算、礼帽、黑帽)等操作均使用该函数。

cv::morphologyEx(cv::InputArray src, cv::OutputArray dst, int op, cv::InputArray kernel,)

参数:我们关注以下四个参数。

1.cv::InputArray src 输入图像
2.OutputArray dst

输出图像

3.int op

形态操作类型(MORPH_OPEN )

4.InputArray kernel

核:n*n的矩阵。n越大,腐蚀的越厉害

代码:

#include <iostream>
#include <opencv.hpp>
#include <core/core.hpp>
#include <highgui/highgui.hpp>using namespace cv;
using namespace std;int main()
{Mat image_1 = imread("lena.jpg");Mat res;//定义一个3*3大小的方形核Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));morphologyEx(image_1,res,MORPH_OPEN,element);imshow("lena", image_1);imshow("res",res);waitKey(0);return 0;
}

输出结果:

4.闭运算

概述:先对图像进行膨胀,再对图像进行腐蚀。

函数:形态学计算(开运算、闭运算、梯度运算、礼帽、黑帽)等操作均使用该函数。

cv::morphologyEx(cv::InputArray src, cv::OutputArray dst, int op, cv::InputArray kernel,)

参数:我们关注以下四个参数。

1.cv::InputArray src 输入图像
2.OutputArray dst

输出图像

3.int op

形态操作类型(MORPH_CLOSE)

4.InputArray kernel

核:n*n的矩阵。n越大,腐蚀的越厉害

代码:

#include <iostream>
#include <opencv.hpp>
#include <core/core.hpp>
#include <highgui/highgui.hpp>using namespace cv;
using namespace std;int main()
{Mat image_1 = imread("lena.jpg");Mat res;//定义一个3*3大小的方形核Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));morphologyEx(image_1,res,MORPH_CLOSE,element);imshow("lena", image_1);imshow("res",res);waitKey(0);return 0;
}

输出结果:

5.梯度运算

概述:通过对腐蚀和膨胀的理解,我们可以认识到由于边界上色彩的差异很大,所以导致腐蚀和膨胀在边界区域的影响很大。简单化理解就是腐蚀是腐蚀边界上的细节,膨胀也是放大边界的细节,两者相减,就可以算出图像的边界信息。

代码:

#include <iostream>
#include <opencv.hpp>
#include <core/core.hpp>
#include <highgui/highgui.hpp>using namespace cv;
using namespace std;int main()
{Mat image_1 = imread("lena.jpg");Mat res;//定义一个3*3大小的方形核Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));morphologyEx(image_1,res,MORPH_GRADIENT,element);imshow("lena", image_1);imshow("res",res);waitKey(0);return 0;
}

输出结果:

6.礼帽与黑帽

概述:礼帽运算=原始图像-开运算生成的图像

 代码:

#include <iostream>
#include <opencv.hpp>
#include <core/core.hpp>
#include <highgui/highgui.hpp>using namespace cv;
using namespace std;int main()
{Mat image_1 = imread("lena.jpg");Mat res;//定义一个3*3大小的方形核Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));morphologyEx(image_1,res,MORPH_TOPHAT,element);imshow("lena", image_1);imshow("res",res);waitKey(0);return 0;
}

输出结果:

概述:礼帽运算=闭运算生成的图像-原始图像

 代码:

#include <iostream>
#include <opencv.hpp>
#include <core/core.hpp>
#include <highgui/highgui.hpp>using namespace cv;
using namespace std;int main()
{Mat image_1 = imread("lena.jpg");Mat res;//定义一个3*3大小的方形核Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));morphologyEx(image_1,res,MORPH_BLACKHAT,element);imshow("lena", image_1);imshow("res",res);waitKey(0);return 0;
}

输出结果:

(_cai_) opencv学习笔记(1):图像形态学计算的方式 morphology函数的应用相关推荐

  1. Opencv学习笔记四——图像形态学操作

    需要的库和自定义函数 import cv2 import numpy as np import matplotlib.pyplot as pltdef cv_show(name, mat):cv2.i ...

  2. OpenCV学习笔记(九)——图像轮廓(下)

    <OpenCV轻松入门:面向Python>学习笔记(九) 1-3 查找并绘制轮廓.矩特性及Hu矩 4-5 轮廓拟合及凸包 6. 利用形状场景算法比较轮廓 6.1 计算形状场景距离 6.2 ...

  3. C++下opencv学习笔记(一)(图像的简单读取丶显示与存储)

    C++下opencv学习笔记(一)(图像的简单读取丶显示与存储) 前言 学习C++ OpenCV,第一需要具备面向对象语言的基础,第二要对图像处理机器学习有基础了解,容易入门.觉得自己基础已经有了可以 ...

  4. Opencv学习笔记(八) -- 图像色彩空间转换

    1.常见图像色彩空间 RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道 ...

  5. opencv学习笔记18:canny算子边缘检测原理及其函数使用

    canny边缘检测原理 去噪:边缘检测容易受到噪声的影响,在此之间,先去噪,通常采用高斯滤波器.opencv学习笔记11:图像滤波(均值,方框,高斯,中值) 梯度:对去噪后的图像采用sobel算子计算 ...

  6. OpenCV学习笔记(七)——图像梯度及边缘检测

    图像梯度计算的是图像变化的速度.对于图像的边缘部分,其灰度值变化较大,梯度值也较大:相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小.一般情况下,图像梯度计算的是图像的边缘信息. ...

  7. Python 计算两个连通子图距离_【CV学习笔记】图像的计算

    关注"深度学习冲鸭",一起学习一起冲鸭! 设为星标,第一时间获取更多干货 作者:云时之间 来源:知乎 链接:https://zhuanlan.zhihu.com/p/1038790 ...

  8. [OpenCV学习笔记3][图像的加载+修改+显示+保存]

    正式进入OpenCV学习了,前面开始的都是一些环境搭建和准备工作,对一些数据结构的认识主要是Mat类的认识: [1.学习目标] 图像的加载:imread() 图像的修改:cvtColor() 图像的显 ...

  9. OpenCV学习笔记之图像融合

    一.线性融合操作 线性混合操作 也是一种典型的二元(两个输入)的 像素操作 : 通过在范围  内改变  ,这个操可以用来对两幅图像或两段视频产生时间上的 画面叠化 (cross-dissolve)效果 ...

最新文章

  1. 学习ASP.NET Core Razor 编程系列九——增加查询功能
  2. SSM项目各层单元测试
  3. 上海女博士“择偶条件”惹争议,相亲像是在许愿,网友:别做梦了 !
  4. iOS11新增版本判断API
  5. java工作台无法显示_【Eclipse】使用指南(18)搜索工作台
  6. linux的基础知识——守护进程
  7. Apache Solr Velocity 注入远程命令执行漏洞复现 (CVE-2019-17558)
  8. 2022年轻人潮流爱好报告:被朋友圈高赞的神秘爱好,不烧钱还能脱单
  9. mysql 转成树_Mysql树型结构2种方式及相互转换
  10. 打印工资条怎么做到每个人都有表头明细_现在还在用订书钉装订工资条,算是一种落后吗?你的公司怎么发?...
  11. 深入浅出分布式存储的设计与优化之道
  12. 没有servlet接口_Java——Servlet
  13. 【C】C99 restrict 关键字
  14. 计算机维修要学英文吗,学计算机编程需要英文吗?
  15. 逻辑回归代价函数的推导过程
  16. 微信小程序swiper上下滑动卡顿
  17. 1455B.Jumps
  18. IDEA设置注释作者名字,模板创建,代码快捷键设置
  19. 骁龙778g和天玑1200max哪个好
  20. Python获取PC版微信安装路径

热门文章

  1. 克隆数据库linux 不能登录,DockerSQL2017Linux容器的数据库克隆
  2. 在Pycharm中下载软件包遇到的问题及解决方法(适用小白)
  3. 江苏省计算机等级考试一级b,计算机等级考试一级B辅导
  4. ext-3 怎么将PDK的库包添加到CCS工程中
  5. matlab 突破交易策略,Matlab量化交易策略之 横盘突破策略(附源码)
  6. 如何判断素数(C++版)
  7. 初识Foxtable
  8. 微信小程序WebSocket心跳检测与断来重连
  9. ElasticSearch批量(mget)查询
  10. 女朋友让我写 1 万字检讨