轮廓提取demo

news/2025/4/2 6:27:35/

note

步骤:

1.滤波(使用高斯核对原图卷积)

2.取梯度(使用sobel核对步骤1之后的图卷积得到x,y两个方向的梯度分量)

3.合成梯度图(x,y两个方向的梯度分量相加)

4.取梯度平方和矩阵(x*x + y*y)

5.取八邻域掩膜(3x3矩阵)

6.根据掩膜,合成梯度图,梯度平方和矩阵确定轮廓图中锚点位置的灰度值(保留梯度平方和最大的锚点灰度值为合成梯度图的对应点灰度值)

7.二值化(otsu)

8.膨胀(十字架膨胀)

code

// 轮廓提取
void MyContour(Mat& src, Mat& res) {Mat sobelX, sobelY;	// sobel梯度卷积核GetSobelMat(sobelX, sobelY);// 1.高斯滤波GaussianBlur(src, res, Size(3,3), 1);// 2.soble算子求梯度Mat gradX, gradY;filter2D(res, gradX, src.type(), sobelX);filter2D(res, gradY, src.type(), sobelY);Mat grad;	// 梯度合成图add(gradX, gradY, grad);// 3.求梯度幅值矩阵gradX.convertTo(gradX, CV_64FC1);gradY.convertTo(gradY, CV_64FC1);Mat gradAmplitude(gradX.rows, gradX.cols, gradX.type());multiply(gradX, gradX, gradX);multiply(gradY, gradY, gradY);add(gradX, gradY, gradAmplitude);// 4.从梯度合成图筛选出轮廓(若锚点位置梯度幅值最大则保留)Mat contour(src.rows, src.cols, src.type(), Scalar(0));	// 轮廓// Mat neiberHood = (Mat_<double>(3,3) << 1,1,1,1,0,1,1,1,1); // 8邻域矩阵,掩膜Rect roi;roi.width = 3;roi.height = 3;int anchor = roi.width / 2;for (int i = 0; i + roi.height <= gradAmplitude.rows; ++i) {for (int j = 0; j + roi.width <= gradAmplitude.cols; ++j) {roi.x = j;roi.y = i;double max = 0;Mat tmp = gradAmplitude(roi);int x = 0;int y = 0;for (int p = 0; p < tmp.rows; p++) {for (int q = 0; q < tmp.cols; q++) {if (max < tmp.at<double>(p,q)) {max = tmp.at<double>(p,q);x = q;y = p;}}}if (x == anchor) {contour.at<uchar>(i,j) =  grad.at<uchar>(i,j);}}}// 5.膨胀Mat dilateKernel = (Mat_<uchar>(3,3) << 0,255,0,255,255,255,0,255,0);	// 十字架膨胀dilate(contour, contour, dilateKernel);contour.copyTo(res);res.convertTo(res, CV_8UC1);threshold(res, res, 128, 255, THRESH_BINARY|THRESH_OTSU);}

test

 


http://www.ppmy.cn/news/955984.html

相关文章

Redis Windows版本安装教程

由于Redis官网不再提供最新版本的Windows安装包&#xff0c;但有些项目根据需要用到最新版本的。 Github仓库redis-windows提供了最新版Windows安装包下载 Redis最新版Windows安装包 https://github.com/redis-windows/redis-windows/releases 1. 命令行启动 cmd 启动 redis…

如何将chatgpt模型嵌套到我自己的ai中

要将ChatGPT模型嵌入到自己的AI系统中&#xff0c;您可以以下几个步骤&#xff1a; 安装OpenAI的API接口&#xff1a;OpenAI提供了与ChatGPT模型的交互的API接口&#xff0c;您可以通过该接口与ChatGPT模型进行交互。 获取API访问密钥&#xff1a;您需要注册并获取OpenAI API访…

python 如何调用chatgpt模型

step 1: pip install openai step 2: import openai # Set your API key openai.api_key "your api key"completion openai.Completion.create( # text-davinci-003 text-davinci-002engine"text-davinci-003",prompt使用python实现冒泡排序算法,max_t…

【Express.js】基于业务特性的分布式结构

基于业务特性的分布式结构 上节的mvc架构&#xff0c;把所有不同模块的同层文件都放在一个目录下 我们也可以将你的项目结构按照业务模块进行划分&#xff0c;每一个模块内可以再按mvc分层&#xff0c;或者不分&#xff0c;这样子把不同模块独立出来的就叫做分布式结构(dcs) …

【1】Spring手写模拟-ApplicationContext获取对象

ApplicationContext获取对象 阶段目标 当前阶段任务&#xff0c;实现ApplicationContext 加载配置文件&#xff0c;实现对配置的包扫描&#xff0c;获取其字节码文件&#xff0c;查看是否包含注需要Spring管理&#xff0c;以及实现单例或者多例获取Bean对象 实现配置文件con…

C++ 注释

程序的注释是解释性语句&#xff0c;您可以在 C 代码中包含注释&#xff0c;这将提高源代码的可读性。所有的编程语言都允许某种形式的注释。 C 支持单行注释和多行注释。注释中的所有字符会被 C 编译器忽略。 C 注释一般有两种&#xff1a; // - 一般用于单行注释。 /* ...…

自然语言处理中,中文优劣势.chatGPT,采访实录

下面的问答,是在chatGPT上进行的, 答案由chatGPT提供 我: 使用chatGPT时&#xff0c;使用用英文是否比使用中文更有优势 ChatGPT回答: ChatGPT是一种基于英语语言模型的技术&#xff0c;因此在英语环境中使用它可以获得更好的性能和结果。虽然它可以处理多种语言&#xff0c;但…

Maven下载依赖的顺序及配置文件说明

在 Maven 中&#xff0c;当下载依赖项时&#xff0c;存在多个仓库时会按照以下优先级顺序进行搜索&#xff1a; 本地仓库&#xff1a;Maven 会首先在本地的 Maven 仓库中查找依赖项。 私有仓库&#xff08;私服&#xff09;&#xff1a;如果在本地仓库中未找到依赖项&#xf…