opencv#38 形态学操作——膨胀

图像膨胀原理

首先需要给出结构元素,这里以十字形结构元素为例。图像膨胀也是将结构元素与原图像中非0像素进行重合。如下图

图像膨胀就是将没有像素值的区域进行填充,之后移动结构元素的中心位置,再次覆盖下一个像素值,得到一个新覆盖结果

我们发现结构元素上方没有覆盖像素值为1的像素,因此我们将这个位置也填充为1,依次移动中心位置,直到中心位置覆盖了原图像中所有非0像素。那么就可以得到膨胀后的结果。

这里,当我们把结构元素覆盖在了最边缘位置时,发现有一个像素超出图像尺寸,膨胀后的图像尺寸要与原图保持一致,所以这里不需要对原图像进行扩充。

结构元素生成函数

getStructuringElement()

cpp 复制代码
Mat cv::getStructuringElement(int    shape,
                              Size   ksize,
                              Point  anchor = Point(-1,-1)
                             )

·shape:结构元素的种类。

·ksize:结构元素的尺寸大小。

·anchor:中心点的位置,默认参数为结构元素的几何中心点。

图像膨胀操作函数

dilate()

cpp 复制代码
void cv::dilate(InputArray     src,
                OutputArray    dst,
                inputArray     kernel,
                Point          anchor = Point(-1,-1),
                int            iterations = 1,
                int            boederType = BORDER_CONSTANT,
                const Scalar & borderValue = morphologyDefaultBorderValue()
               )

·src:输入的待膨胀图像,图像的通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_16U,CV_16S,CV_32F,CV_64F之一。

·dst:腐蚀后的输出图像,与输入图像src具有相同的尺寸和数据类型。

·kernel:用于碰撞操作的结构元素,可以自己输入,也可以用getStructuringElement()函数生成。

·anchor:中心点在结构元素中的位置,默认参数为结构元素的几何中心点。

·iterations:膨胀的次数。

·borderType:像素外推法选择标志。

·borderValue:边界不变的边界值。

示例

cpp 复制代码
#include <opencv2/opencv.hpp>
#include <iostream>


using namespace cv; //opencv的命名空间
using namespace std;



//主函数
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, 0, 0);
	Mat struct1, struct2;
	struct1 = getStructuringElement(0, Size(3, 3));//矩形结构元素
	struct2 = getStructuringElement(1, Size(3, 3));//十字型结构元素

	Mat dilateSrc; //存放膨胀后的图像
	dilate(src, dilateSrc, struct2);
	namedWindow("src", WINDOW_GUI_NORMAL);
	namedWindow("dilateSrc", WINDOW_GUI_NORMAL);
	imshow("src", src);
	imshow("dilateSrc", dilateSrc);

	cout << "文字膨胀验证" << endl;
	waitKey(0);//等待函数用于显示图像,按下键盘任意键后退出

	Mat LearnCV_black = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/LearnCV_black.png");


	Mat dilate_black1, dilate_black2;
	//黑背景图像腐蚀
	dilate(LearnCV_black, dilate_black1, struct1);
	dilate(LearnCV_black, dilate_black2, struct2);
	imshow("LearnCV_black", LearnCV_black);
	imshow("dilate_black1", dilate_black1);
	imshow("dilate_black2", dilate_black2);

	cout << "文字膨胀" << endl;
	waitKey(0);//等待函数用于显示图像,按下键盘任意键后退出

	

	return 0;

}

结果

通过以上结果我们可以发现,图像膨胀可以填充某些缺失的区域,使区域变成一个整体,并且将两个邻近的区域连接在一起,进而也形成一个整体。

相关推荐
星辰AI4 分钟前
告别翻译腔:用 AI Agent 自动化构建开源项目的多语言技术文档
人工智能·ai·语言模型
KJ_BioMed7 分钟前
突破“不可成药”靶点:科晶生物AI互作蛋白与纳米抗体设计技术解析
人工智能·抗体药物·多肽药物·多肽设计·抗体设计
想你依然心痛13 分钟前
HarmonyOS 6(API 23)实战:基于悬浮导航、沉浸光感与HMAF的“药界智脑“——PC端AI智能体沉浸式药物研发与分子模拟工作台
人工智能·华为·ar·harmonyos·智能体
CodePlayer竟然被占用了14 分钟前
当编排逻辑从上下文窗口搬到脚本:Claude Code Dynamic Workflows 深度拆解
人工智能
AI视觉网奇14 分钟前
3d 标注工具
人工智能·3d
莫逸风19 分钟前
【AgentScope】HarnessAgent 学习指南
大数据·人工智能
武子康23 分钟前
调查研究-153 Cloudflare 能部署网站吗?2026 年完整对比 Vercel / Netlify / 自建服务器
大数据·运维·服务器·人工智能·部署·devops·opc
IvanCodes24 分钟前
Agent开发入门:提示词工程
人工智能·agent
麦哲思科技任甲林35 分钟前
白话Skills之七:编写AI Skill的原则
人工智能·prompt·agent·ai编程·skills
weixin_3975740937 分钟前
从“对接大模型“到“生成AI服务“:下一代企业AI应用开发框
人工智能