我的编程空间,编程开发者的网络收藏夹
学习永远不晚

OpenCV实现图像腐蚀

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

OpenCV实现图像腐蚀

图像的腐蚀过程与图像的卷积操作类似,都需要模板矩阵来控制运算的结果,在图像的腐蚀和膨胀中这个模板矩阵被称为结构元素。与图像卷积相同,结构元素可以任意指定图像的中心点,并且结构元素的尺寸和具体内容都可以根据需求自己定义。定义结构元素之后,将结构元素的中心点依次放到图像中每一个非0元素处,如果此时结构元素内所有的元素所覆盖的图像像素值均不为0,则保留结构元素中心点对应的图像像素,否则将删除结构元素中心点对应的像素。图像的腐蚀过程示意图如图6-12所示,图6-12中左侧为待腐蚀的原图像,中间为结构元素,首先将结构元素的中心与原图像中的A像素重合,此时结构元素中心点的左侧和上方元素所覆盖的图像像素值均为0,因此需要将原图像中的A像素删除;当把结构元素的中心点与B像素重合时,此时结构元素中所有的元素所覆盖的图像像素值均为1,因此保留原图像中的B像素。将结构元素中心点依次与原图像中的每个像素重合,判断每一个像素点是否保留或者删除,最终原图像腐蚀的结果如图中右侧图像所示。

图像腐蚀可以用“Θ”表示,其数学表示形式如式(6.4)所示,通过公式可以发现,其实对图像A的腐蚀运算就是寻找图像中能够将结构元素B全部包含的像素点。

生成常用的矩形结构元素、十字结构元素和椭圆结构:


Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
  • shape:结构元素的种类,可以选择的参数及含义在表6-5中给出。
  • ksize:结构元素的尺寸大小
  • anchor:中心点的位置,默认参数为结构元素的几何中心点。

该函数用于生成图像形态学操作中常用的矩形结构元素、十字结构元素和椭圆结构元素。函数第一个参数为生成结构元素的种类,可以选择的参数及含义在表给出,函数第二个参数是结构元素的尺寸大小,能够影响到图像腐蚀的效果,一般情况下,结构元素的种类相同时,结构元素的尺寸越大腐蚀效果越明显。函数的最后一个参数是结构元素的中心点,只有十字结构元素的中心点位置会影响图像腐蚀后的轮廓形状,其他种类的结构元素的中心点位置只影响形态学操作结果的平移量。

腐蚀函数


void erode( InputArray class="lazy" data-src, OutputArray dst, InputArray kernel,
                         Point anchor = Point(-1,-1), int iterations = 1,
                         int borderType = BORDER_CONSTANT,
                         const Scalar& borderValue = morphologyDefaultBorderValue() );
  • class="lazy" data-src:输入的待腐蚀图像,图像的通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。
  • dst:腐蚀后的输出图像,与输入图像class="lazy" data-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次。
函数第六个参数是图像像素外推法的选择标志,
第七个参数为使用边界不变外推法时的边界值,这两个参数对图像中主要部分的腐蚀操作没有影响,因此在多数情况下使用默认值即可。

需要注意的是该函数的腐蚀过程只针对图像中的非0像素,因此如果图像是以0像素为背景,那么腐蚀操作后会看到图像中的内容变得更瘦更小;如果图像是以255像素为背景,那么腐蚀操作后会看到图像中的内容变得更粗更大。

简单示例


//
// Created by smallflyfly on 2021/6/18.
//
 
#include "opencv2/opencv.hpp"
 
#include <iostream>
 
using namespace std;
using namespace cv;
 
 
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 class="lazy" data-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(class="lazy" data-src, class="lazy" data-src, Size(0, 0), 50, 50, INTER_NEAREST);
    Mat m1, m2;
    m1 = getStructuringElement(0, Size(3, 3));
    m2 = getStructuringElement(1, Size(3, 3));
 
    Mat erodeM1, erodeM2;
    erode(class="lazy" data-src, erodeM1, m1, Point(-1, -1), 10);
    erode(class="lazy" data-src, erodeM2, m2, Point(-1, -1), 10);
 
    imshow("class="lazy" data-src", class="lazy" data-src);
    imshow("erodeM1", erodeM1);
    imshow("erodeM2", erodeM2);
 
    Mat xbim = imread("xiaobai.jpg");
    Mat xbM1, xbM2;
    erode(xbim, xbM1, m1, Point(-1, -1), 2);
    erode(xbim, xbM2, m2, Point(-1, -1), 2);
 
    imshow("xb", xbim);
    imshow("xbM1", xbM1);
    imshow("xbM2", xbM2);
 
    Mat im = imread("rice.jfif");
    Mat im1 = im.clone();
    Mat im2 = im.clone();
    Mat im3 = 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(im1, count1, stats, centroids, "no erode");
 
    Mat erodeIm1, erodeIm2;
    erode(riceBin, erodeIm1, m1, Point(-1, -1), 5);
    erode(riceBin, erodeIm2, m2, Point(-1, -1), 5);
 
    int count2 = connectedComponentsWithStats(erodeIm1, out, stats, centroids, 8, CV_16U);
    drawResult(erodeIm1, count2, stats, centroids, "erode1");
    int count3 = connectedComponentsWithStats(erodeIm2, out, stats, centroids, 8, CV_16U);
    drawResult(erodeIm2, count3, stats, centroids, "erode2");
 
    waitKey(0);
    destroyAllWindows();
 
}

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

OpenCV实现图像腐蚀

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python中怎么使用OpenCV实现腐蚀与膨胀

今天就跟大家聊聊有关Python中怎么使用OpenCV实现腐蚀与膨胀,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。什么是形态学要了解腐蚀之前,我们需要了解一个概念:形态学。形态学,又
2023-06-15

opencv实现图像平移

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

OpenCV图像算法怎么实现图像切分图像合并

本篇内容介绍了“OpenCV图像算法怎么实现图像切分图像合并”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!将一张图片切分成多个小图片并将小图
2023-06-30

OpenCV实现图像细化算法

本文主要介绍了OpenCV实现图像细化算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2022-11-13

OpenCV实现图像拼接案例

这篇文章主要介绍了OpenCV实现图像拼接案例,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
2022-11-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录