【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


相关文章
|
29天前
|
算法 Linux 程序员
嵌入式工程师以及C++程序员到公司就业需要掌握那些技术?
嵌入式工程师以及C++程序员到公司就业需要掌握那些技术?
|
2月前
|
Linux 数据处理 C++
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(一)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
80 0
|
2月前
|
存储 Linux API
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(三)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
32 1
|
2月前
|
消息中间件 Linux 数据处理
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(二)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
34 1
|
2月前
|
存储 编解码 vr&ar
用C++实现视频编码器:FFmpeg与SDL技术结合,轻松编写高效编解码器
用C++实现视频编码器:FFmpeg与SDL技术结合,轻松编写高效编解码器
76 0
|
19天前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
42 6
|
2月前
|
存储 算法 编译器
C/C++编译器局部优化技术:局部优化是针对单个函数或基本块进行的优化
C/C++编译器局部优化技术:局部优化是针对单个函数或基本块进行的优化
36 0
|
2月前
|
存储 缓存 算法
高效编程:我们应该了解哪些编译器优化技术?如何做出成熟的优化行为,掌握C++编程中的编译器优化艺术。
高效编程:我们应该了解哪些编译器优化技术?如何做出成熟的优化行为,掌握C++编程中的编译器优化艺术。
92 4
|
1天前
|
消息中间件 算法 Java
C++实时通信优化技术探究
C++实时通信优化技术探究
10 3
|
23天前
|
人工智能 机器人 Linux
【C++】Linux下如何查看opencv的版本
【C++】Linux下如何查看opencv的版本