形态学操作之膨胀

news2024/11/16 13:42:45

note

// 膨胀原理:操作过程中,若膨胀因子某点是1,且原图该点为1,则锚点位置为1

code

// 膨胀
// 膨胀原理:操作过程中,若膨胀因子某点是1,且原图该点为1,则锚点位置为1
typedef enum {
	MY_EXPAND_NONE,
	MY_EXPAND_HORIZON,	// 水平膨胀
	MY_EXPAND_VERTIC,	// 竖直膨胀
	MY_EXPAND_RECTANGLE,	// 矩形膨胀
	MY_EXPAND_CROSS,		// 十字架膨胀
}my_expand_t;
void MyExpandHorizon(Mat& src, Mat& res, uchar threshold = 255) {
	src.copyTo(res);
	Mat kernel = (Mat_<uchar>(1,3) << 0,255,0);
	int anchor = kernel.cols / 2;
	for (int r = 0; r+kernel.rows <= res.rows; r=r+kernel.rows) {
		for (int c = 0; c+kernel.cols <= res.cols; c = c+kernel.cols) {
			if (res.at<uchar>(r,c) >= threshold || res.at<uchar>(r,c+kernel.cols-1) >= threshold) {
				res.at<uchar>(r,c+anchor) = 255;
			}
		}
	}
}
void MyExpandVertic(Mat& src, Mat& res, uchar threshold = 255) {
	src.copyTo(res);
	Mat kernel = (Mat_<uchar>(3,1) << 0,255,0);
	int anchor = kernel.rows / 2;
	for (int c = 0; c+kernel.cols <= res.cols; c=c+kernel.cols) {
		for (int r = 0; r+kernel.rows <= res.rows; r=r+kernel.rows) {
			if ((res.at<uchar>(r,c) >= threshold) || (res.at<uchar>(r+kernel.rows-1) >= threshold)) {
				res.at<uchar>(r+anchor,c) = 255;
			}
		}
	}
	
}
void MyExpandRect(Mat& src, Mat& res, uchar threshold = 255) {
	src.copyTo(res);
	Mat kernel = (Mat_<uchar>(3,3) << 255,255,255,255,255,255,255,255,255);
	int anchor = kernel.rows / 2;
	bool flag = false;
	for (int r = 0; r+kernel.rows <= res.rows; r=r+kernel.rows) {
		for (int c = 0; c+kernel.cols <= res.cols; c=c+kernel.cols) {
			flag = false;
			for (int i = 0; i < kernel.rows; ++i) {
				for (int j = 0; j < kernel.cols; ++j) {
					if (res.at<uchar>(r+i,c+j) >= threshold) {
						flag = true;
						break;
					}
				}
				if (flag) {
					res.at<uchar>(r+anchor,c+anchor) = 255;
					break;
				}
			}
		}
	}
}
void MyExpandCross(Mat& src, Mat& res, uchar threshold = 255) {
	src.copyTo(res);
	Mat kernel = (Mat_<uchar>(3,3) << 0,255,0,255,255,255,0,255,0);
	int anchor = kernel.rows / 2;
	bool flag = false;
	for (int r = 0; r+kernel.rows <= res.rows; r=r+kernel.rows) {
		for (int c = 0; c+kernel.cols <= res.cols; c=c+kernel.cols) {
			flag = false;
			for (int i = 0; i < kernel.rows; ++i) {
				for (int j = 0; j < kernel.cols; ++j) {
					if (kernel.at<uchar>(i,j) == 255 && res.at<uchar>(r+i,c+j) >= threshold) {
						flag = true;
						break;
					}
				}
				if (flag) {
					res.at<uchar>(r+anchor,c+anchor) = 255;
					break;
				}
			}
		}
	}
}
void MyExpand(my_expand_t type, Mat& src, Mat& res) {
	switch (type) {
		case MY_EXPAND_HORIZON:
			MyExpandHorizon(src, res, 255);
			break;
		case MY_EXPAND_VERTIC:
			MyExpandVertic(src, res, 255);
			break;
		case MY_EXPAND_RECTANGLE:
			MyExpandRect(src, res, 255);
			break;
		case MY_EXPAND_CROSS:
			MyExpandCross(src, res, 255);
			break;
		default:
			break;
	}
}
void MyExpandTest(void) {
	Mat src = imread("../source/LinuxLogo.jpg", IMREAD_GRAYSCALE);
	if (src.empty()) {
		return;
	}
	Mat res;

	namedWindow("src", WINDOW_NORMAL);
	namedWindow("res", WINDOW_NORMAL);

	threshold(src, src, 0, 255, THRESH_BINARY|THRESH_OTSU);
	MyExpand(MY_EXPAND_RECTANGLE, src, res);

	imshow("src", src);
	imshow("res", res);

	MyWait();
	destroyAllWindows();
}

test

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/700758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

gma 2 教程(一)概述:1.GMA 简介

地理与气象分析库&#xff08;Geographic and Meteorological Analysis. gma&#xff09;&#xff0c;是一个基于 Python 的地理、气象数据快速处理分析和地理制图函数包。构建过程参考了ArcGIS和QGIS的操作逻辑和特点&#xff0c;并添加诸多独创性、独有的功能&#xff0c;具有…

QT Creator上位机学习(三)QString及其相关控件介绍

系列文章目录 文章目录 系列文章目录字符串QStringQLableQLineEditQString的常用功能 字符串QString QSting类&#xff0c;用于处理字符串&#xff0c;进行字符串和数字之间的转化 转换函数&#xff1a; //字符串转数字 QString str......; int numstr.toInt(); float num2s…

微信项目IO优化:Jetpack DataStore 与MMKV实现高效持久化

咱们一起来看看mmkv 腾讯微信团队于2018年9月底宣布开源 MMKV &#xff0c;原理上基于 mmap的一个高性能key-value 组件&#xff0c;数据的序列化/反序列化使用 protobuf 实现&#xff0c;主打高性能和稳定性&#xff0c;也支持了Android 平台。 **MMKV最新源码托管地址&#…

Mybatis【核心配置文件说明】

配置解析 1、核心配置文件 mybatis-config.xml 注意&#xff1a; 在配置 mybatis-config.xml 时&#xff0c;要注意标签的顺序&#xff1a; 2、环境变量&#xff08;environments&#xff09; MyBatis 可以配置成适应多种环境 不过要记住&#xff1a;尽管可以配置多个环境…

现代操作系统(下)

第六章 死锁 在计算机系统中有很多独占性的资源&#xff0c;在任一时刻它们都只能被一个进程使用。两个进程同时使用同一文件系统表中的表项会引起文件系统的瘫痪。正因为如此&#xff0c;操作系统都具有授权一个进程&#xff08;临时&#xff09;排他地访问某一种资源的能力。…

【AcWing】夏季每日一题2023 -- 4382. 快速打字 -- Java Version

题目链接&#xff1a;https://www.acwing.com/problem/content/4385/ 1. 题解&#xff08;4382. 快速打字&#xff09; y总视频讲解&#xff1a;https://www.acwing.com/video/4743/ 类似题目&#xff1a;AcWing 2816. 判断子序列 1.1 双指针&#xff1a;判断子序列 ⭐ 时间复…

一文吃透MAUI、WinUI3和WPF的优势及劣势

引言&#xff1a; 在应用程序开发领域&#xff0c;选择合适的框架对于开发人员和业务来说至关重要。本文将比较并对比三个流行的用户界面框架&#xff1a;MAUI&#xff08;Multi-platform App UI&#xff09;、WinUI 3和WPF&#xff08;Windows Presentation Foundation&#x…

element ui table表格(表头、表体)样式

效果图如下 1.表头样式&#xff1a;header-cell-stayle 2.表体样式 在methods中写 在style中

使用Qt/C++实现WGS84、高德GCJ-02、百度BD-09坐标系间相互转化

在做地图相关开发时候&#xff0c;绕不开不同坐标系间的转化&#xff0c;因此我根据查阅相关资料后将不同坐标系间的转换封装到一个GeoTranslate类中&#xff0c;该类转换函数不仅支持Qt/C调用&#xff0c;同时可在QML中直接调用&#xff0c;配合上QML/Map很方便&#xff0c;我…

大咖培训讲座|高性能计算专场 认识真正的高性能计算,探究如何成为高性能计算工程师 ...

猿代码科技高性能计算讲座原文——OpenBLAS创始人无保留分享 我们如何成为一个高性能计算的工程师&#xff0c;或者这种性能优化的这一部分的软件工程师。 我其实想了一下&#xff0c;这一部分的入门的基础其实没那么难。 就是更主要的话&#xff0c;我还是在于兴趣和自驱力…

idea自定义类注释以及方法注释,无警告

背景 idea&#xff1a;IntelliJ IDEA 2023.1.3 (Ultimate Edition) 效果 类 方法 正式&#xff1a;类 设置 代码 /** * author: 你的名字* date: ${DATE} on ${TIME}* desc: $NAME*/注意&#xff0c;请全部复制&#xff0c;空行也要&#xff0c;看设置截图选中部分 …

Jenkins定时执行JMeter脚本并查看测试报告实现

【整体思路】 通过Tomcat启动Jenkins服务&#xff0c;在Jenkins中创建自动化测试项目&#xff0c;项目配置中配置构建时执行的动作&#xff0c;配置构建后动作展示报告 【涉及软件及版本信息】 Tomcat版本&#xff1a;9.0.76 Jenkins版本&#xff1a;2.332.3&#xff08;注…

ES批量上传数据 - Python操作ES

代码 # -*- coding: utf-8 -*- # Author : markadcimport randomfrom elasticsearch import Elasticsearch, helpersurl http://localhost:9200/ client Elasticsearch(url) index testsome [] for i in range(1, 10001):docu {uid: i, age: random.randint(1, 100)} …

ChatGPT中的Token:了解聊天模型的基本单位

✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的加入&#xff1a;全栈弄潮儿的个人社区 &#x1f4d9; 专栏地址&#xff1a;AI大模型 ChatGPT中的Token是什么&#xff1f; 在ChatGPT…

23-BOM和常见的BOM对象

一、是什么 BOM (Browser Object Model)&#xff0c;浏览器对象模型&#xff0c;提供了独立于内容与浏览器窗口进行交互的对象 作用&#xff1a;跟浏览器做一些交互效果&#xff0c; 如何进行页面的后退&#xff0c;前进&#xff0c;刷新&#xff0c;浏览器的窗口发生变化&am…

ECS云服务器U实例评测,可以免费体验哦

目录 一、ECS云服务器U实例介绍 话题一、U实例使用体感如何&#xff0c;是否和主售型实例有区别&#xff0c;具体体现在哪里&#xff1f; 话题二、结合相关数据材料&#xff0c;对您感兴趣的场景 话题三、使用u实例是否为您的云上业务或者测试项目提供了帮助支持&#xff1…

Axure教程——表格内部修改

本文介绍的时用Axue中的中继器制作表内修改效果 效果 预览地址&#xff1a;https://w97xns.axshare.com 功能 点击某条数据的”编辑“按钮可以修改此条数据的每项数据&#xff0c;”编辑“和”删除“按钮变为”保存“和”取消‘按钮 制作 需要的元件&#xff1a;矩形、中继…

asp.net MVC

文件目录 页面 HTML与Script的联系 HTML元素通过调用脚本中的function来触发前端的动作要进行的后端逻辑操作 Script中通过选择器$(“#str”)来改变前端HTML的显示数据 Script中有两种类型的函数模式 $(function(){ … }) &#xff1a;window.onload时调用。function btnRese…

​Chamilo 学习管理软件存在命令执行漏洞(CVE-2023-34960)

Chamilo 学习管理软件存在命令执行漏洞&#xff08;CVE-2023-34960&#xff09; 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff…

Python基础语法笔记整理(黑马8天学会python笔记)

Python 第一章、基础语法 01.字面量(写在代码中的固定的值) 02.注释 # 单行注释 """ 多行注释 """03.变量 变量无类型&#xff0c;数据有类型 变量名 变量值04.数据类型 数据类型&#xff1a; type()05.类型转换 字符串转数字&#xff…