OpenCV——八邻域断点检测

这篇具有很好参考价值的文章主要介绍了OpenCV——八邻域断点检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

OpenCV——八邻域断点检测,OpenCV 图像/点云处理,opencv,人工智能,计算机视觉,开发语言,算法,c++

OpenCV——八邻域断点检测由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。

一、理论基础

1、八邻域

OpenCV——八邻域断点检测,OpenCV 图像/点云处理,opencv,人工智能,计算机视觉,开发语言,算法,c++

图1 八邻域示意图

OpenCV——八邻域断点检测,OpenCV 图像/点云处理,opencv,人工智能,计算机视觉,开发语言,算法,c++

图2 八邻域对应坐标关系

2、断点检测

  首先将图像进行二值化,然后检测以 P 1 P_1 P1为中心的它的八个领域,

  • P 2 + P 3 + P 4 + P 5 + P 6 + P 7 + P 8 + P 9 ≤ 255 × 6 P_2+P_3+P_4+P_5+P_6+P_7+P_8+P_9\leq255\times6 P2+P3+P4+P5+P6+P7+P8+P9255×6,则 P 1 P_1 P1点是一个边界点。
  • P 2 + P 3 + P 4 + P 5 + P 6 + P 7 + P 8 + P 9 ≥ 255 × 6 P_2+P_3+P_4+P_5+P_6+P_7+P_8+P_9\geq255\times6 P2+P3+P4+P5+P6+P7+P8+P9255×6,则 P 1 P_1 P1点是一个内部点。
  • P 2 + P 3 + P 4 + P 5 + P 6 + P 7 + P 8 + P 9 = 0 P_2+P_3+P_4+P_5+P_6+P_7+P_8+P_9=0 P2+P3+P4+P5+P6+P7+P8+P9=0,则 P 1 P_1 P1点是一个孤立点。
  • P 2 + P 3 + P 4 + P 5 + P 6 + P 7 + P 8 + P 9 = 255 P_2+P_3+P_4+P_5+P_6+P_7+P_8+P_9=255 P2+P3+P4+P5+P6+P7+P8+P9=255,则 P 1 P_1 P1点是一个端点。
    OpenCV——八邻域断点检测,OpenCV 图像/点云处理,opencv,人工智能,计算机视觉,开发语言,算法,c++
图3 点的类型

二、代码实现

#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

vector<Point> breakImage(Mat& src);

int main()
{  // 加载RGB图片
	Mat colorImage, grayImage, binImage;
	colorImage = imread("2.png");
	// 显示图片
	namedWindow("原始图像", cv::WINDOW_NORMAL); // 图像窗口函数
	imshow("原始图像", colorImage);
	// 图像二值化
	cvtColor(colorImage, grayImage, COLOR_BGR2GRAY);
	threshold(grayImage, binImage, 1, 255, THRESH_BINARY);

	vector<Point>P;
	P = breakImage(binImage);
	
	int nsize = P.size();
	Mat temp = Mat::zeros(binImage.size(), CV_8UC3);
	// 用圆圈出端点
	for (int i = 0; i < nsize; i++)
	{
		circle(temp, P[i], 10, Scalar(0, 255, 0));
	}
	Mat circleadd;
	
	addWeighted(temp, 1, colorImage, 1, 0, circleadd);
	imwrite("端点.png",circleadd);
	namedWindow("circleadd", cv::WINDOW_NORMAL);
	imshow("circleadd", circleadd);

	waitKey(0);
	   
}
#pragma region//8邻域提取端点
vector<Point> breakImage(Mat& src)
{
	vector<Point> pointxy;
	Point ptPoint;
	Size size = src.size();
	int nSize;

	for (int i = 1; i < size.height - 1; i++)
	{
		uchar* dataPre = src.ptr<uchar>(i - 1);
		uchar* dataCurr = src.ptr<uchar>(i);
		uchar* dataNext = src.ptr<uchar>(i + 1);
		for (int j = 1; j < size.width - 1; j++)
		{
			//  p9 p2 p3    
			//  p8 p1 p4    
			//  p7 p6 p5
			int p1 = dataCurr[j];
			if (p1 != 255) continue;
			int p2 = dataPre[j];
			int p3 = dataPre[j + 1];
			int p4 = dataCurr[j + 1];
			int p5 = dataNext[j + 1];
			int p6 = dataNext[j];
			int p7 = dataNext[j - 1];
			int p8 = dataCurr[j - 1];
			int p9 = dataPre[j - 1];

			if (p1 == 255)
			{
				if ((p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9) == 255)
				{
					ptPoint.x = j;
					ptPoint.y = i;
					pointxy.push_back(ptPoint);
					printf("端点的坐标为:x:%d y:%d\n", j, i);
				}
			}

		}
	}
	nSize = (int)pointxy.size();
	printf("提取端点个数:%d\n", nSize);
	
	return pointxy;
}
#pragma endregion

三、结果展示

OpenCV——八邻域断点检测,OpenCV 图像/点云处理,opencv,人工智能,计算机视觉,开发语言,算法,c++
OpenCV——八邻域断点检测,OpenCV 图像/点云处理,opencv,人工智能,计算机视觉,开发语言,算法,c++

四、参考链接

[1] 八邻域断点检测
[2] OpenCV 八领域断点检测+断点缺陷修补文章来源地址https://www.toymoban.com/news/detail-803636.html

到了这里,关于OpenCV——八邻域断点检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之四 简单行人人体检测效果

    目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之四 简单行人人体检测效果 一、简单介绍 二、简单行人人体检测效果实现原理 三、简单行人人体检测效果案例实现简单步骤 四、注意事项 Python是一种跨平台的计算机程序设计语言。是一种面向对

    2024年04月26日
    浏览(58)
  • OpenCV(图像处理)-基于Python-特征检测-特征点匹配

    图像特征就是指有意义的图像区域,具有独特性,易于识别性,比如角点、斑点以及高密度区。而为什么角点具有重要的特征呢? 看下图: 观察ABD三张图片,我们不容易得知图像的位置,而CEF三张图我们特别容易找到它们在原图中对应的位置,这是因为ABD比较平滑,我们不

    2024年02月03日
    浏览(47)
  • Python-OpenCV中的图像处理-边缘检测

    Canny 边缘检测是一种非常流行的边缘检测算法,是 John F.Canny 在 1986 年提出的。它是一个有很多步构成的算法:噪声去除、计算图像梯度、非极大值抑制、滞后阀值等。 Canny(image: Mat, threshold1, threshold2, edges=…, apertureSize=…, L2gradient=…) 在 OpenCV 中只需要一个函数: cv2.Canny(),

    2024年02月13日
    浏览(54)
  • QT+OpenCV实现一个标注工具(图像处理、边缘检测)

    作者是一名QT初学者,为检验学习成果及完成毕业设计,在张老师和学姐的指导下,开发了这个标注工具。CSDN上很多文章对我的学习提供了极大的帮助,分享这篇文章给需要的人一起学习进步~ 废话不多说,先看看效果: Windows10、Qt5.13.2(编译器用的是MinGW64_bit)、OpenCV4.1 环

    2024年02月11日
    浏览(44)
  • 图像处理(二)之 基于OpenCV的水泥裂缝检测(区域延申)

    一、基本逻辑思路 1. 读取图形、修改尺寸、灰度图转换 2. 直方图均衡化 原理:         直方图均衡化通常是对图像灰度值进行归一化的方法,并且可以增强图像的对比度;         图像中像素个数多的灰度级进行展宽,而对图像中像素个数少的灰度进行压缩,从而扩

    2023年04月09日
    浏览(45)
  • 基于 OpenCV 的车辆变道检测,计算机视觉+图像处理技术

    本期教程我们将和小伙伴们一起研究如何使用计算机视觉和图像处理技术来检测汽车在行驶中时汽车是否在改变车道!大家一定听说过使用 OpenCV 的 haar 级联文件可以检测到面部、眼睛等,但是如果目标是汽车,公共汽车呢? 01. 数据集 我们将道路上汽车的视频文件用作数据

    2024年01月25日
    浏览(67)
  • Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之六 简单进行人脸训练与识别

    目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之六 简单进行人脸训练与识别 一、简单介绍 二、简单进行人脸训练与识别 1、LBPH(Local Binary Patterns Histograms)算法进行人脸训练和识别 2、实现步骤: 3、判断是谁的人脸: 案例中涉及的关键函数说

    2024年04月26日
    浏览(86)
  • 我在Vscode学OpenCV 图像处理三(图像梯度--边缘检测【图像梯度、Sobel 算子、 Scharr 算子、 Laplacian 算子、Canny 边缘检测】)

    这里需要区分开边缘检测和轮廓检测 边缘检测并非万能,边缘检测虽然能够检测出边缘,但边缘是不连续的,检测到的边缘并不是一个整体。图像轮廓是指将边缘连接起来形成的一个整体,用于后续的计算。 OpenCV 提供了查找图像轮廓的函数 cv2.findContours(),该函数能够查找图

    2024年02月04日
    浏览(56)
  • OpenCV4.x图像处理实例-YOLO v8检测与识别物体

    本文将详细介绍通过OpenCV的DNN模块,使用YOLO V8模型进行对静态图像、视频流和摄像头进行物体检测与识别。 YOLO v8 (You Only Look Once)由 Ultralytics 开发的一种先进的 (SOTA) 模型。它建立在以前成功的 YOLO 版本的基础上,并引入了新的功能和改进,以进一步提高性能和灵活性。

    2024年02月08日
    浏览(58)
  • 数字图像处理(实践篇)二十二 使用opencv进行人脸、眼睛、嘴的检测

    目录 1 xml文件 2 涉及的函数 3 实践 使用opencv进行人脸、眼睛、嘴的检测。 1 xml文件 方法① 下载  地址:https://github.com/opencv/opencv/tree/master/data/haarcascades 点击haarcascade_frontalface_default.xml文件 对着Raw右键,选择“链接另存为”,选择代码所在的路径即可,就可以下载这个文件啦

    2024年02月03日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包