服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - OpenCV实现图像膨胀

OpenCV实现图像膨胀

2021-11-17 15:07我有一個夢想 C/C++

这篇文章主要为大家详细介绍了OpenCV实现图像膨胀,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

图像的膨胀与图像腐蚀是一对相反的过程,与图像腐蚀相似,图像膨胀同样需要结构元素用于控制图像膨胀的效果。结构元素可以任意指定结构的中心点,并且结构元素的尺寸和具体内容都可以根据需求自己定义。定义结构元素之后,将结构元素的中心点依次放到图像中每一个非0元素处,如果原图像中某个元素被结构元素覆盖,但是该像素的像素值不与结构元素中心点对应的像素点的像素值相同,那么将原图像中的该像素的像素值修改为结构元素中心点对应点的像素值。图像的膨胀过程示意图如图所示,图中左侧为待膨胀的原图像,中间为结构元素,首先将结构元素的中心与原图像中的A像素重合,将结构元素覆盖的所有像素的像素值都修改为1,将结构元素中心点依次与原图像中的每个像素重合,判断是否有需要填充的像素。原图像膨胀的结果如图中右侧图像所示。

OpenCV实现图像膨胀

图像膨胀数学表示形式如式(6.5)所示,通过公式可以发现,其实图像A的膨胀运算就是生成能够将结构元素B全部包含的图像。

OpenCV实现图像膨胀

膨胀函数

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:输入的待膨胀图像,图像的通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。
  • dst:膨胀后的输出图像,与输入图像src具有相同的尺寸和数据类型。
  • kernel:用于膨胀操作的结构元素,可以自己定义,也可以用getStructuringElement()函数生成。
  • anchor:中心点在结构元素中的位置,默认参数为结构元素的几何中心点
  • iterations:膨胀的次数,默认值为1。
  • borderType:像素外推法选择标志,取值范围在表3-5中给出。默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。
  • borderValue:使用边界不变外推法时的边界值。
  •  

该函数根据结构元素对输入图像进行膨胀,在膨胀多通道图像时每个通道独立进行膨胀运算。函数的第一个参数为待膨胀的图像,图像通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。函数第二个参数为膨胀后的输出图像,与输入图像具有相同的尺寸和数据类型。函数第三个和第四个参数都是与结构元素相关的参数,第三个参数为结构元素,膨胀时使用的结构元素尺寸越大效果越明显,第四个参数为结构元素的中心位置,第四个参数的默认值为Point(-1,-1),表示结构元素的几何中心处为结构元素的中心点。函数第五个参数是使用结构元素膨胀的次数,膨胀次数越多效果越明显,默认参数为1,表示只膨胀1次。函数第六个参数是图像像素外推法的选择标志,第七个参数为使用边界不变外推法时的边界值,这两个参数对图像中主要部分的膨胀操作没有影响,因此在多数情况下使用默认值即可。

简单示例

//
// Created by smallflyfly on 2021/6/18.
//

#include "opencv2/opencv.hpp"

#include <iostream>

using namespace cv;
using namespace std;

void drawResult(Mat im, int num, Mat stats, Mat centroids, const string& name) {
  for (int i = 1; i < num; ++i) {
      int x = centroids.at<double>(i, 0);
      int y = centroids.at<double>(i, 1);
      cout << x << " " << y << endl;
      circle(im, Point(x, y), 2, Scalar(0, 0, 255), -1);
      int xmin = stats.at<int>(i, CC_STAT_LEFT);
      int ymin = stats.at<int>(i, CC_STAT_TOP);
      int w = stats.at<int>(i, CC_STAT_WIDTH);
      int h = stats.at<int>(i, CC_STAT_HEIGHT);

      Rect rect(xmin, ymin, w, h);
      rectangle(im, rect, Scalar(255, 255, 255), 2);
      putText(im, to_string(i), Point(x+5, y), FONT_HERSHEY_SCRIPT_SIMPLEX, 0.3, Scalar(0, 0, 255), 1);
  }
  imshow(name, im);
}

int main() {
  Mat src = (
          Mat_<uchar>(6, 6) <<
                            0, 0, 0, 0, 255, 0,
                  0, 255, 255, 255, 255, 255,
                  0, 255, 255, 255, 255, 0,
                  0, 255, 255, 255, 255, 0,
                  0, 255, 255, 255, 255, 0,
                  0, 0, 0, 0, 255, 0
  );
  resize(src, src, Size(0, 0), 50, 50, INTER_NEAREST);
  Mat m1, m2;
  m1 = getStructuringElement(0, Size(3, 3));
  m2 = getStructuringElement(1, Size(3, 3));

  Mat dilateM1, dilateM2;
  dilate(src, dilateM1, m1, Point(-1, -1), 5);
  dilate(src, dilateM2, m2, Point(-1, -1), 5);

  imshow("src", src);
  imshow("dilateM1", dilateM1);
  imshow("dilateM2", dilateM2);

  Mat xbim = imread("xiaobai.jpg");
  Mat xbM1, xbM2;
  dilate(xbim, xbM1, m1, Point(-1, -1), 2);
  dilate(xbim, xbM2, m2, Point(-1, -1), 2);

  imshow("xbim", xbim);
  imshow("xbM1", xbM1);
  imshow("xbM2", xbM2);

  Mat im = imread("rice.jfif");
  resize(im, im, Size(0, 0), 0.6, 0.6);
  Mat im1 = im.clone();

  Mat gray;
  cvtColor(im, gray, CV_BGR2GRAY);
  Mat riceBin;
  threshold(gray, riceBin, 125, 255, THRESH_BINARY);

  Mat out, stats, centroids;
  int count1 = connectedComponentsWithStats(riceBin, out, stats, centroids, 8, CV_16U);
  drawResult(im, count1, stats, centroids, "no dilate");

  Mat dilateIm1, dilateIm2;
  dilate(riceBin, dilateIm1, m1, Point(-1, -1), 5);
  dilate(riceBin, dilateIm2, m2, Point(-1, -1), 5);

  int count2 = connectedComponentsWithStats(dilateIm1, out, stats, centroids, 8, CV_16U);
  drawResult(dilateIm1, count2, stats, centroids, "dilateIm1");
  int count3 = connectedComponentsWithStats(dilateIm2, out, stats, centroids, 8, CV_16U);
  drawResult(dilateIm2, count3, stats, centroids, "dilateIm2");

  waitKey(0);
  destroyAllWindows();

}

OpenCV实现图像膨胀

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/B08370108/article/details/118029682

延伸 · 阅读

精彩推荐
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30