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

简介: 【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("...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;
}


实现效果


0710eae48fa2b0419106c8ba56b5ae98_b97e2293f83f4c56af2a1155940a6653.png


膨胀


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("...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;
}


实现效果


35de08c97f047a292d25899a5b0e0d63_ac2bbed81d0d462d930e4ee364c35981.png


相关文章
|
1月前
|
C++ 容器
C++中向量的操作vector
C++中向量的操作vector
|
2月前
|
算法 开发工具 计算机视觉
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
51 1
|
2月前
|
C++
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
28 0
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
|
2月前
|
C++ iOS开发 开发者
C++一分钟之-文件输入输出(I/O)操作
【6月更文挑战第24天】C++的文件I/O涉及`ifstream`, `ofstream`和`fstream`类,用于读写操作。常见问题包括未检查文件打开状态、忘记关闭文件、写入模式覆盖文件及字符编码不匹配。避免这些问题的方法有:检查`is_open()`、显式关闭文件或使用RAII、选择适当打开模式(如追加`ios::app`)以及处理字符编码。示例代码展示了读文件和追加写入文件的实践。理解这些要点能帮助编写更健壮的代码。
41 2
|
2月前
|
算法 前端开发 Linux
【常用技巧】C++ STL容器操作:6种常用场景算法
STL在Linux C++中使用的非常普遍,掌握并合适的使用各种容器至关重要!
55 10
|
1月前
|
存储 计算机视觉
OpenCv形态学(一)
OpenCv形态学(一)
|
2月前
|
人工智能 计算机视觉 Python
人工智能视觉:基于OpenCV的人脸识别技术的深度解析
人工智能视觉:基于OpenCV的人脸识别技术的深度解析
|
2月前
|
计算机视觉
OpenCV中图像算术操作与逻辑操作
OpenCV中图像算术操作与逻辑操作
44 1
|
2月前
|
存储 Cloud Native Linux
OpenCV鼠标操作(画红色方框截取图像)
OpenCV鼠标操作(画红色方框截取图像)
|
2月前
|
移动开发 算法 计算机视觉
技术笔记:openCV特征点识别与findHomography算法过滤
技术笔记:openCV特征点识别与findHomography算法过滤
39 0

热门文章

最新文章