积分图像、图像分割、Harris角点检测

news2024/11/26 7:47:10

目录

1、积分图像

2、图像分割--漫水填充

3、图像分割--分水岭法

4、Harris角点检测


1、积分图像

 

//积分图像
int test1()
{
	//创建一个16×16全为1的矩阵,因为256=16×16
	Mat img = Mat::ones(16, 16, CV_32FC1);
	//在图像中加入随机噪声
	RNG rng(10086);
	for (int y = 0; y < img.rows; y++)
	{
		for (int x = 0; x < img.cols; x++)
		{
			float d = rng.uniform(-0.5, 0.5);
			img.at<float>(y, x) = img.at<float>(y, x) + d;
		}
	}
	//计算标准求和积分
	Mat sum;
	integral(img, sum);
	//为了便于显示,转成CV_8U格式
	Mat sum8U = Mat_<uchar>(sum);
	namedWindow("sum8U", WINDOW_NORMAL);
	imshow("sum8U", sum8U);

	//计算平方求和积分
	Mat sqsum;
	integral(img, sum, sqsum);//为了便于显示,转成CV_8U格式
	Mat sqsum8U = Mat_<uchar>(sqsum);
	namedWindow("sqsum8U", WINDOW_NORMAL);
	imshow("sqsum8U", sqsum8U);

	//计算倾斜求和积分
	Mat tilted;
	integral(img, sum, sqsum, tilted);//为了便于显示,转成CV_8U格式
	Mat tilted8U = Mat_<uchar>(tilted);
	namedWindow("tilted8U", WINDOW_NORMAL);
	imshow("tilted8U", tilted8U);

	waitKey(0);
	return 0;
}

2、图像分割--漫水填充

 


//图像分割--漫水填充
int test2()
{
	system("color 02");//将DOS界面调成白底黑字
	Mat img = imread("F:/testMap/lena.png");
	if (!(img.data))
	{
		cout << "读取图像错误,请确认图像文件是否正确" << endl;
		return -1;
	}
	RNG rng(10086);//随机数,用于随机生成像素

	//设置操作标志flags
	int connectivity = 4;//连通邻域方式
	int maskVal = 255;//掩码图像的数值
	int flags = connectivity | (maskVal << 8) | FLOODFILL_FIXED_RANGE;//漫水填充操作方式标志

	//设置与选中像素点的差值
	Scalar loDiff = Scalar(20, 20, 20);
	Scalar upDiff = Scalar(20, 20, 20);

	//声明掩模矩阵变量
	Mat mask = Mat::zeros(img.rows + 2, img.cols + 2, CV_8UC1);

	while (true)
	{
		//随机产生图像中某一像素点
		int py = rng.uniform(0, img.rows - 1);
		int px = rng.uniform(0, img.cols - 1);
		Point point = Point(px, py);

		//彩色图像中填充的像素值
		Scalar newVal = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));

		//漫水填充函数
		int area = floodFill(img, mask, point, newVal, &Rect(), loDiff, upDiff, flags);

		//输出像素点和填充的像素数目
		cout << "像素点x: " << point.x << " y : " << point.y << "填充像数数目:" << area << endl;

		//输出填充的图像结果
		imshow("填充的彩色图像", img);
		imshow("掩模图像", mask);

		//判断是否结束程序
		int c = waitKey(0);
		if ((c & 255) == 27)
		{
			break;
		}
	}
	waitKey(0);
	return 0;
}

3、图像分割--分水岭法

 

 


//图像分割--分水岭法
int test3()
{
	Mat img, imgGray, imgMask, img_;
	Mat maskWaterShed; //watershed()函数的参数

	img = imread("F:/testMap/lenaw.png"); //含有标记的图像
	img_ = imread("F:/testMap/lena.png"); //原图像
	cvtColor(img, imgGray, COLOR_BGR2GRAY);
	
	//二值化并开运算
	threshold(imgGray, imgMask, 230, 255, THRESH_BINARY);
	Mat k = getStructuringElement(0, Size(3, 3));
	morphologyEx(imgMask, imgMask, MORPH_OPEN, k);
	imshow("含有标记的图像", img);
	imshow("原图像", img_);

	vector<vector<Point>> contours;
	vector<Vec4i> hierarchy;
	findContours(imgMask, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);

	//在maskWaterShed上绘制轮廓,用于输入分水岭算法
	maskWaterShed = Mat::zeros(imgMask.size(),CV_32S); 
	for (int index = 0; index < contours.size(); index++)
	{
		drawContours(maskWaterShed, contours, index, Scalar::all(index + 1), -1, 8, hierarchy, INT_MAX);
	}
	//分水岭算法需要对原图像进行处理
	watershed(img_, maskWaterShed);
	
	vector<Vec3b> colors;// 随机生成几种颜色
	for (int i = 0; i < contours.size(); i++)
	{
		int b = theRNG().uniform(0, 255); 
		int g = theRNG().uniform(0, 255); 
		int r = theRNG().uniform(0, 255);
		colors.push_back(Vec3b((uchar)b, (uchar)g, (uchar)r));
	}

	Mat resultImg = Mat(img.size(), CV_8UC3); // 显示图像
	for(int i = 0; i < imgMask.rows; i++)
	{
		for (int j = 0; j < imgMask.cols; j++)
		{
			//绘制每个区域的颜色
			int index = maskWaterShed.at<int>(i, j);
			if (index == -1)//区域间的值被置为 - 1(边界)
			{
				resultImg.at<Vec3b>(i, j) = Vec3b(255, 255, 255);
			}
			else if (index <= 0 || index > contours.size())//没有标记清楚的区域被置为0
			{
				resultImg.at<Vec3b>(i, j) = Vec3b(0, 0, 0);
			}
			else//其他每个区域的值保持不变: 1,2,…,contours.size()
			{
				resultImg.at<Vec3b>(i, j) = colors[index - 1]; //把些区域绘制成不同颜色
			}
		}
	}
	imshow("resultImg", resultImg);
	resultImg = resultImg * 0.8 + img_*0.2;
	//addWeighted(resultImg,0.8,img_, 0.2,0, resultImg); 
	imshow("分水岭结果", resultImg);

	//绘制每个区域的图像
	for (int n = 1; n <= contours.size(); n++)
	{
		Mat resImagel = Mat(img.size(), CV_8UC3);//声明一个最后要显示的图像
		for (int i = 0; i < imgMask.rows; i++)
		{
			for (int j = 0; j < imgMask.cols; j++)
			{
				int index = maskWaterShed.at<int>(i, j);
				if (index == n)
					resImagel.at<Vec3b>(i, j) = img_.at<Vec3b>(i, j);
				else
					resImagel.at<Vec3b>(i, j) = Vec3b(0, 0, 0);
			}
		}
		//显示图像
		imshow(to_string(n), resImagel);
	}

	waitKey(0);
	return 0;
}

4、Harris角点检测

 

 

 

 

//Harris角点检测
int test4()
{
	Mat img = imread("F:/testMap/lena.png", IMREAD_COLOR);
	if (!img.data)
	{
		cout << "读取图像错误,请确认图像文件是否正确" << endl;
		return -1;
	}
	//转成灰度图像
	Mat gray;
	cvtColor(img, gray,COLOR_BGR2GRAY);
	
	//计算Harris系数
	Mat harris;
	int blockSize = 2; //邻域半径
	int apertureSize = 3;
	cornerHarris(gray,harris, blockSize,apertureSize,0.04);

	//归一化便于进行数值比较和结果显示
	Mat harrisn;
	normalize(harris, harrisn, 0, 255, NORM_MINMAX);//将图像的数据类型变成CV_8U
	convertScaleAbs(harrisn, harrisn);

	//寻找Harris角点
	vector<KeyPoint> keyPoints;
	for (int row = 0; row < harrisn.rows; row++)
	{
		for (int col = 0; col < harrisn.cols; col++)
		{
			int R = harrisn.at<uchar>(row, col);
			if (R >125)
			{
				//向角点存入KeyPoint中
				KeyPoint keyPoint;
				keyPoint.pt.y =row;
				keyPoint.pt.x = col;
				keyPoints.push_back(keyPoint);
			}
		}
	}
	//绘制角点与显示结果
	drawKeypoints(img,keyPoints,img); 
	imshow("系数矩阵", harrisn);
	imshow("Harris角点", img) ;

	waitKey(0);
	return 0;
}

 

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

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

相关文章

路径规划算法:基于法医调查优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于法医调查优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于法医调查优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

听GPT 讲K8s源代码--pkg(二)

在 Kubernetes&#xff08;K8s&#xff09;项目中&#xff0c;pkg/controller 目录是用于存放控制器&#xff08;Controller&#xff09;相关的代码的目录。控制器是 Kubernetes 的核心组件之一&#xff0c;用于管理和控制集群中的资源对象的状态和行为。 pkg/controller 目录的…

RTCP/SRTCP介绍

RFC 4585 - Extended RTP Profile for Real-time Transport Control Protocol (RTCP)-Based Feedback (RTP/AVPF) RFC 5124 - Extended Secure RTP Profile for Real-time Transport Control Protocol (RTCP)-Based Feedback (RTP/SAVPF) 译文&#xff1a; http://www.gpssoft…

[SAM]A Comprehensive Survey on Segment Anything Model for Vision and Beyond

A Comprehensive Survey on Segment Anything Model for Vision and Beyond Abstract 本文是SAM的第一篇综述 讲述了SAM的发展历史、进展、在不同任务、不同数据类型下的应用 首先介绍专有名词和背景知识 其次介绍SAM再图像处理等应用中的优点和局限 以及SAM未来展望 git链接…

C# Linq 详解一

目录 一、概述 二、Where 三、Select 四、GroupBy 五、First / FirstOrDefault 六、Last / LastOrDefault​​​​​​​ 一、概述 语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称。 数据查询历来都表示为简单的字符串&#xff0c;没有编译时类型…

Exceptional C++读书笔记——泛型程序设计与C++标准库

更新中——上次更新&#xff08;2023.07.13-23:07&#xff09; 迭代器&#xff08;iterator&#xff09; #include <iostream> #include <vector> #include <iterator> #include <algorithm>int main() { std::vector<int> e; std::copy(…

第二章编程模型(Cortex-M7 Processor Programmers Model)

第二章编程模型 本章描述了程序员模型。它包含以下部分: 关于2-2页的程序员模型。2-3页的操作和执行方式。指令集摘要见第2-4页。系统地址映射在2-5页。2-8页的独家监视器。处理器核心寄存器在第2-9页。例外情况见第2-10页。 2.1关于编程模型 本章概述了描述实现定义选项的…

力扣题目解析:生成奇数个字符的字符串的巧妙方法

本篇博客会讲解力扣“1374. 生成每种字符都是奇数个的字符串”的解题思路&#xff0c;这是题目链接。 这道题的解题思路很巧妙&#xff0c;它利用了字符串长度n的奇偶性&#xff1a; 如果n是奇数&#xff0c;那么就把字符串全部填充为’a’&#xff0c;这样每种字符都是奇数个…

posix ipc之共享内存

note 1.shm_open的pathname不能带路径名&#xff0c;shm_open的创建目录为/dev/shm 2.使用ftruncate设置内核共享内存实例的大小 3.使用mmap进行有名映射(实例反应在文件系统的一个文件) code #include <sys/mman.h> #include <sys/stat.h> #include <fcntl…

【动手学习深度学习--逐行代码解析合集】16深度卷积神经网络(AlexNet)

【动手学习深度学习】逐行代码解析合集 16深度卷积神经网络&#xff08;AlexNet&#xff09; 视频链接&#xff1a;动手学习深度学习–深度卷积神经网络&#xff08;AlexNet&#xff09; 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v2.d2…

网络安全与防范

1.重要性 随着互联网的发达&#xff0c;各种WEB应用也变得越来越复杂&#xff0c;满足了用户的各种需求&#xff0c;但是随之而来的就是各种网络安全的问题。了解常见的前端攻击形式和保护我们的网站不受攻击是我们每个优秀fronter必备的技能。 2.分类 XSS攻击CSRF攻击网络劫…

瑞萨RFP工具使用问题总结

最近在用瑞萨的RH850&#xff0c;需要用到瑞萨提供的刷新工具RFP&#xff08;Renesas Flash Programmer&#xff09;&#xff0c;但是总是遇到一些问题&#xff0c;除了一些能够在官网上找到答案的问题&#xff0c;还遇到了其他各种各样的问题&#xff0c;这里记录一下问题和对…

【问题分析解决】git添加.gitignore后不生效问题

一&#xff0c;问题现象 在已经提交过的git管理的项目中&#xff0c;新增加一个.gitignore文件&#xff0c;或者修改.gitignore文件之后&#xff0c;新增的内容不生效。 二&#xff0c;问题原因 因为我们误解了.gitignore文件的用途&#xff0c;该文件只能作用于Untracked F…

AI图像生成无需API开发连接集简云数据表,实现生成图片自动同步能力

1 场景描述 人工智能的出现&#xff0c;各个领域都开始尝试将AI作为提高工作效率的必备工具。除了AI对话等&#xff0c;越来越多的AI图像生成工具也出现在市场上。这些AI图像生成工具可以自动创建惊人的图像、艺术作品和设计&#xff0c;从而帮助设计师和创意人员更快速地实现其…

工业交换机网管运维方案

工业交换机设备商对网管的需求 对工业交换机设备提供商来说&#xff0c;如下几个因素都是需要面对的&#xff1a; 最终客户的需要&#xff1a; 网络和工业交换机设备的可管理性&#xff0c;已经被越来越多的最终用户所重视&#xff0c;在设备采购中&#xff0c;多数时候甚至是…

电脑内存错误怎么办?

内存是电脑的基本配件之一&#xff0c;一款电脑的内存大小能够在一定程度上决定这款电脑的性能。我们在使用电脑的过程中总会出现一些关于内存大大小小的问题&#xff0c;其中电脑提示内存错误的原因是什么?电脑内存错误怎么解决呢? 内存错误的原因 电脑的很多故障往往都会反…

面试题更新之-本地存储是什么?

文章目录 本地存储是什么Cookiesjs中如何使用Cookies localStoragejs中如何使用localStorage sessionStoragejs中如何使用sessionStorage 本地存储是什么 本地存储是指将数据保存在用户的本地设备上&#xff0c;以供后续使用和访问。通过本地存储&#xff0c;网页和应用程序可…

Day2 图连通

A - PRO-Professor Szu 简单的来说就是 缩点、反图拓扑。 需要注意不与 n 1 n1 n1 联通的点可能会使得一些点的入度无法为 0 而无法入队&#xff0c;消除这些点的影响即可。 当时写的&#xff1a; D - BLO-Blockade 非割点&#xff1a; 2 ( n − 1 ) 2(n-1) 2(n−1)。 …

【环信集成教程】环信的那些”已读“功能实现及问题解决

写在前面 在调用环信的消息回执时&#xff0c;是否有以下的烦恼 1、发送了消息已读回执&#xff0c;为什么消息列表页的未读数没有发生变化&#xff1f; 2、发送了消息已读回执&#xff0c;为什么消息漫游拉取不到已读状态&#xff1f; 如果你有这些烦恼&#xff0c;那就继续…

大量SDK设备接入时,如何巧妙配置EasyCVR平台参数?

EasyCVR视频融合平台可支持海量视频的轻量化接入与汇聚管理。在视频能力上&#xff0c;EasyCVR可实现视频直播、录像、回放、检索、云存储、告警上报、语音对讲、电子地图、集群、智能分析以及平台级联等。平台支持多协议接入&#xff0c;包括国标GB28181、RTMP、RTSP/Onvif、海…