08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线)

这篇具有很好参考价值的文章主要介绍了08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

一、膨胀(Dilation)与 腐蚀(Erosion)

二、形态学操作

1、开操作(Opening)

2、闭操作(Closing)

3、形态学梯度(Morphological Gradient)

4、顶帽 ( top hat)

5、黑帽 ( black hat)

6、相关的API

7、代码演示

三、形态学操作应用-提取水平与垂直线

1、原理方法

2、实现步骤


前言

1、了解图像形态学

图像形态学操作是一种基于图像形状的图像处理方法,常用于图像分割、边缘检测、图像增强等领域。

2、图像形态学主要包括腐蚀(Erosion)、膨胀(Dilation)、开运算(Opening)、闭运算(Closing)等操作。

除了以上基本操作,还有其他形态学操作,如击中击不中变换(Hit-or-Miss Transform)、顶帽运算(Top Hat Transform)和黑帽运算(Black Hat Transform)等。

这些图像形态学操作可以通过OpenCV库中的函数进行实现,例如cv::erodecv::dilatecv::morphologyEx等函数。

3、膨胀与腐蚀是图像处理中最常用得形态学手段。

一、膨胀(Dilation)与 腐蚀(Erosion)

通俗来讲:膨胀是用来处理缺陷问题,腐蚀用来处理毛刺问题。

所以膨胀过后的图像边界看起来更加清晰;腐蚀后的图像去除噪点,边界模糊了。

1、膨胀含义:

将图像中的前景物体进行扩张,通过在图像上滑动一个结构元素,当结构元素与前景物体有重叠时,将该像素置为1(白色)。膨胀操作可以填充物体内部的空洞,同时使物体边界变得更加清晰。

跟卷积操作类似,假设有图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中B作为结构体可以是任意形状。

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

 2、腐蚀含义:

将图像中的前景物体进行收缩,通过在图像上滑动一个结构元素,当结构元素完全覆盖住前景物体时,将该像素置为0(黑色)。腐蚀操作可以去除小的噪点,同时使物体边界变得模糊。

腐蚀跟膨胀操作的过程类似,唯一不同的是以最小值替换锚点重叠下图像的像素值。

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

3、相关的API:

(1)getStructuringElement(int shape, Size ksize, Point anchor)  

- 形状 (MORPH_RECT \MORPH_CROSS \MORPH_ELLIPSE)  

- 大小

 - 锚点 默认是Point(-1, -1)意思就是中心像素

(2)dilate(src, dst, kernel)

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

(3)erode(src, dst, kernel)

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

4、相关代码演示

#include<opencv2\opencv.hpp>
#include<iostream>

int main()
{
	cv::Mat image = cv::imread("char.jpg", cv::IMREAD_GRAYSCALE);
	if (image.empty())
	{
		std::cout << "Failed to read image" << std::endl;
		return -1;
	}

	// 定义腐蚀和膨胀的核(结构元素)
	cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));

	// 腐蚀操作

	cv::Mat eroded_image;
	cv::erode(image, eroded_image, kernel);

	// 膨胀操作

	cv::Mat dilated_image;
	cv::dilate(image, dilated_image, kernel);

	cv::imshow("Original Image", image);
	cv::imshow("Eroded Image", eroded_image);
	cv::imshow("Dilated Image", dilated_image);
	cv::waitKey(0);
	cv::destroyAllWindows();

	return 0;
}

效果展示:

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

二、形态学操作

1、开操作(Opening)

先进行腐蚀操作,再进行膨胀操作。开运算可以消除小的噪点,并保持物体的整体形状不变。

(1)先腐蚀后膨胀

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

(2)可以去掉小的对象,假设对象是前景色,背景是黑色

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

2、闭操作(Closing)

先进行膨胀操作,再进行腐蚀操作。闭运算可以填充物体内部的空洞,并保持物体的整体形状不变。

(1)先膨胀后腐蚀(bin2)

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

(2)可以填充小的洞(fill hole),假设对象是前景色,背景是黑色

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

3、形态学梯度(Morphological Gradient)

(1)膨胀减去腐蚀

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

(2)又称为基本梯度(其它还包括-内部梯度、方向梯度)

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

4、顶帽 ( top hat)

顶帽 是原图像与开操作之间的差值图像

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

5、黑帽 ( black hat)

黑帽是闭操作图像与源图像的差值图像

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

6、相关的API

morphologyEx(src, dest, CV_MOP_BLACKHAT, kernel);

// 函数原型:

void morphologyEx (

InputArray src, // 输入图像,可以是单通道灰度图像或多通道彩色图像。

OutputArray dst, // 输出图像,与输入图像具有相同的尺寸和类型。

int op, // 形态学操作类型,可以是以下常量之一:

InputArray kernel, // 结构元素,用于定义形态学操作的形状和大小。可以使用cv::getStructuringElement函数创建不同形状的结构元素。

Point anchor = Point(-1,-1), // 锚点位置,默认为(-1,-1),表示结构元素的中心。

int iterations = 1, // 形态学操作的迭代次数,默认为1。

int borderType = BORDER_CONSTANT, // 边界类型,默认为BORDER_CONSTANT,表示使用常数值进行边界扩展。

const Scalar& borderValue = morphologyDefaultBorderValue() // 边界值,默认为morphologyDefaultBorderValue(),表示使用默认的边界值。

);
 

其中:

  • op:形态学操作类型,可以是以下常量之一:

    • cv::MORPH_ERODE:腐蚀操作

    • cv::MORPH_DILATE:膨胀操作

    • cv::MORPH_OPEN:开运算

    • cv::MORPH_CLOSE:闭运算

    • cv::MORPH_GRADIENT:形态学梯度

    • cv::MORPH_TOPHAT:顶帽运算

    • cv::MORPH_BLACKHAT:黑帽运算

7、代码演示
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
int main(int argc, char** argv) {
	Mat src, dst;
	src = imread("D:/vcprojects/images/bin2.png");
	if (!src.data) {
		printf("could not load image...\n");
	}
	namedWindow("input image", CV_WINDOW_AUTOSIZE);
	imshow("input image", src);
	char output_title[] = "morphology demo";
	namedWindow(output_title, CV_WINDOW_AUTOSIZE);

	Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11), Point(-1, -1));
	morphologyEx(src, dst, CV_MOP_BLACKHAT, kernel);
	imshow(output_title, dst);

	waitKey(0);
	return 0;
}

效果展示:(黑帽 CV_MOP_BLACKHAT)

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

三、形态学操作应用-提取水平与垂直线

1、原理方法

图像形态学操作时候,可以通过自定义的结构元素实现结构元素 对输入图像一些对象敏感、另外一些对象不敏感,这样就会让敏 感的对象改变而不敏感的对象保留输出。

通过使用两个最基本的 形态学操作 – 膨胀与腐蚀,使用不同的结构元素实现对输入图像 的操作、得到想要的结果。

(1)膨胀,输出的像素值是结构元素覆盖下输入图像的最大像素值

二值图像与灰度图像上的膨胀操作:

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

(2)腐蚀,输出的像素值是结构元素覆盖下输入图像的最小像素值

二值图像与灰度图像上的腐蚀操作

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

(3)结构元素

        1)上述膨胀与腐蚀过程可以使用任意的结构元素

        2)常见的形状:矩形、园、直线、磁盘形状、砖石形状等各种自定义形状。

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

2、实现步骤

(1)输入图像彩色图像 imread

(2)转换为灰度图像 – cvtColor

(3)转换为二值图像 – adaptiveThreshold

(4)定义结构元素

(5)开操作 (腐蚀+膨胀)提取 水平与垂直线

(1)输入图像彩色图像 imread

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

(2)转换为灰度图像 – cvtColor

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

(3)转换为二值图像 – adaptiveThreshold

adaptiveThreshold(

Mat src, // 输入的灰度图像

Mat dest, // 二值图像

double maxValue, // 二值图像最大值

int adaptiveMethod // 自适应方法,只能其中之一 –                 

                                // ADAPTIVE_THRESH_MEAN_C ,APTIVE_THRESH_GAUSSIAN_C

int thresholdType,// 阈值类型

int blockSize, // 块大小

double C // 常量C 可以是正数,0,负数

)

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

(4)定义结构元素

一个像素宽的水平线 -  水平长度 width/30

一个像素宽的垂直线 – 垂直长度 height/30

(5)开操作 (腐蚀+膨胀)提取 水平与垂直线

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

后处理

1)bitwise_not(Mat bin, Mat dst)像素取反操作,255 – SrcPixel

2)模糊(blur)

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

3、代码演示

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
int main(int argc, char** argv) {
	Mat src, dst;
	src = imread("D:/vcprojects/images/chars.png");
	if (!src.data) {
		printf("could not load image...\n");
		return -1;
	}

	char INPUT_WIN[] = "input image";
	char OUTPUT_WIN[] = "result image";
	namedWindow(INPUT_WIN, CV_WINDOW_AUTOSIZE);
	imshow(INPUT_WIN, src);

	Mat gray_src;
	cvtColor(src, gray_src, CV_BGR2GRAY);
	imshow("gray image", gray_src);
	
	Mat binImg;
	adaptiveThreshold(~gray_src, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
	imshow("binary image", binImg);

	// 水平结构元素
	Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1));
	// 垂直结构元素
	Mat vline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 16), Point(-1, -1));
	// 矩形结构
	Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));

	Mat temp;
	erode(binImg, temp, kernel);
	dilate(temp, dst, kernel);
	// morphologyEx(binImg, dst, CV_MOP_OPEN, vline);

    // 背景变色
	bitwise_not(dst, dst);

    // 结果更加圆滑些
	//blur(dst, dst, Size(3, 3), Point(-1, -1));
	imshow("Final Result", dst);

	waitKey(0);
	return 0;
}

效果展示:

(1)水平结构元素:

先腐蚀后膨胀,相当于一开始把垂直的元素擦掉,所以就保留了水平的线。

Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1));

erode(binImg, temp, hline)

dilate(temp, dst, hline);

等同于:

morphologyEx(binImg, dst, CV_MOP_OPEN, hline);

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

(2)垂直结构元素

先腐蚀后膨胀,相当于一开始把水平的元素擦掉,所以就保留了垂直的线。

Mat vline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 16), Point(-1, -1));

morphologyEx(binImg, dst, CV_MOP_OPEN, vline);

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀

(3)矩形结构

矩形大小的干扰项都去掉。

Mat kernel = getStructuringElement(MORPH_RECT, Size(4, 4), Point(-1, -1));

morphologyEx(binImg, dst, CV_MOP_OPEN, kernel);

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线),OpenCV,opencv,人工智能,计算机视觉,形态学操作,图像膨胀与腐蚀文章来源地址https://www.toymoban.com/news/detail-796638.html

到了这里,关于08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 我在Vscode学OpenCV 图像处理一(阈值处理、形态学操作【连通性,腐蚀和膨胀,开闭运算,礼帽和黑帽,内核】)

    例如,设定阈值为127,然后:  将图像内所有像素值大于 127 的像素点的值设为 255。  将图像内所有像素值小于或等于 127 的像素点的值设为 0。 cv2.threshold() 和 cv2.adaptiveThreshold() 是 OpenCV 中用于实现阈值处理的两个函数,它们之间有以下区别: 1.1.1. cv2.threshold(): 这个函数

    2024年02月05日
    浏览(40)
  • opencv基础-38 形态学操作-闭运算(先膨胀,后腐蚀)cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

    闭运算是先膨胀、后腐蚀的运算,它有助于关闭前景物体内部的小孔,或去除物体上的小黑点,还可以将不同的前景图像进行连接。 例如,在图 8-17 中,通过先膨胀后腐蚀的闭运算去除了原始图像内部的小孔(内部闭合的闭运算),其中: 左图是原始图像。 中间的图是对原

    2024年02月14日
    浏览(48)
  • opencv35-形态学操作-腐蚀cv2.erode()

    形态学,即数学形态学(Mathematical Morphology),是图像处理过程中一个非常重要的研 究方向。形态学主要从图像内提取分量信息,该分量信息通常对于表达和描绘图像的形状具有 重要意义,通常是图像理解时所使用的最本质的形状特征。例如,在识别手写数字时,能够通 过

    2024年02月14日
    浏览(27)
  • opencv36-形态学操作-膨胀 cv2.dilate()

    膨胀操作是形态学中另外一种基本的操作。膨胀操作和腐蚀操作的作用是相反的,膨胀操作能对图像的边界进行扩张。膨胀操作将与当前对象(前景)接触到的背景点合并到当前对象内,从而实现将图像的边界点向外扩张。如果图像内两个对象的距离较近,那么在膨胀的过程

    2024年02月14日
    浏览(26)
  • Python从0到1丨了解图像形态学运算中腐蚀和膨胀

    摘要: 这篇文章将详细讲解图像形态学知识,主要介绍图像腐蚀处理和膨胀处理。 本文分享自华为云社区《[Python从零到壹] 四十七.图像增强及运算篇之腐蚀和膨胀详解》,作者: eastmount 。 数学形态学的应用可以简化图像数据,保持它们基本的形状特征,并出去不相干的结

    2024年02月06日
    浏览(30)
  • Halcon形态学处理-腐蚀、膨胀、开运算、闭运算、顶帽运算和底帽运算

    提示:文章参考了网络上其他作者的文章,以及相关书籍,如有侵权,请联系作者。        图像的形态学处理是对图像的局部像素进行处理,用于从图像中提取有意义的局部图像细节。通过改变局部区域的像素形态,以对目标进行增强,或者为后续进行图像分割、特征提

    2024年02月05日
    浏览(113)
  • 【C++】【图像处理】形态学处理(腐蚀、膨胀)算法解析(以.raw格式的图像为基础进行图像处理、gray levels:256)

        总结 针对处理二值图图像时,腐蚀或膨胀算法的核心: 1、确定该点(假设为A点)的灰度级,是0还是255; 2、遍历以该点为中心的3x3的邻域,获取灰度级等于0或者等于255的像素点个数,使用 flag 变量记录; 3、当 flag 大于设定的数值时,则A点的灰度级将被赋值为0或者

    2024年02月05日
    浏览(39)
  • 图像处理技巧形态学滤波之腐蚀操作

    欢迎回来,我的图像处理爱好者们!今天,让我们深入研究图像处理领域中的形态学计算。这些非线性的图像处理技术允许我们操纵图像中对象的形状和结构。在本系列中,我们将依次介绍四种基本的形态学操作:腐蚀、膨胀、开操作和闭操作。 闲话少说,我们直接开始吧!

    2024年02月13日
    浏览(31)
  • OpenCV(项目)车牌识别1 -- 车牌提取(形态学)

    目录 一、形态学车牌提取(简单:单情景)  1、读取图片,转灰度图  2、提取轮廓(Sobel算子提取y方向边缘) 3、自适应二值化 4、闭运算处理,把图像闭合、揉团,使图像区域化 5、腐蚀/膨胀去噪得到车牌区域 5-1、横向腐蚀、膨胀 5-2、纵向腐蚀、膨胀 6、获取外轮廓 6-1、

    2024年02月08日
    浏览(31)
  • OpenCV之形态学操作

    形态学操作包含以下操作: 腐蚀 (Erosion) 膨胀 (Dilation) 开运算 (Opening) 闭运算 (Closing) 形态梯度 (Morphological Gradient) 顶帽 (Top Hat)黑帽(Black Hat) 其中腐蚀和膨胀操作是最基本的操作,其他操作由这两个操作变换而来。         用一个结构元素扫描图像中每一个像素,结构元素

    2024年02月09日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包