OpenCV学习笔记

news2025/1/15 6:58:44

OpenCV基础

threshold函数的使用

https://blog.csdn.net/u012566751/article/details/77046445

图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。OpenCV中提供了函数cv::threshold();

距离变换distanceTransform应用——查找物体质心&&细化字符轮廓

https://www.cnblogs.com/mtcnn/p/9411967.html

distanceTransform方法的功能:
用于计算图像中每一个非零点距离离自己最近的零点的距离,distanceTransform的第二个Mat矩阵参数dst保存了每一个点与最近的零点的距离信息,图像上越亮的点,代表了离零点的距离越远

一、查找物体质心

C++

#include "core/core.hpp"
#include "imgproc/imgproc.hpp"
#include "highgui/highgui.hpp"

using namespace cv;

int main(int argc,char *argv[])
{
	float maxValue=0;  //定义距离变换矩阵中的最大值
	Point Pt(0,0);
	Mat image=imread(argv[1]);
	Mat imageGray;
	cvtColor(image,imageGray,CV_RGB2GRAY);
	imageGray=~imageGray;  //取反
	GaussianBlur(imageGray,imageGray,Size(5,5),2); //滤波
	threshold(imageGray,imageGray,20,200,CV_THRESH_BINARY); //阈值化	
	Mat imageThin(imageGray.size(),CV_32FC1); //定义保存距离变换结果的Mat矩阵
	distanceTransform(imageGray,imageThin,CV_DIST_L2,3);  //距离变换
	Mat distShow;
	distShow=Mat::zeros(imageGray.size(),CV_8UC1); //定义细化后的字符轮廓
	for(int i=0;i<imageThin.rows;i++)
	{
		for(int j=0;j<imageThin.cols;j++)
		{
			distShow.at<uchar>(i,j)=imageThin.at<float>(i,j);
			if(imageThin.at<float>(i,j)>maxValue)
			{
				maxValue=imageThin.at<float>(i,j);  //获取距离变换的极大值
				Pt=Point(j,i);  //坐标
			}
		}
	}
	normalize(distShow,distShow,0,255,CV_MINMAX); //为了显示清晰,做了0~255归一化
	circle(image,Pt,maxValue,Scalar(0,0,255),3);	
	circle(image,Pt,3,Scalar(0,255,0),3);
	imshow("Source Image",image);
	imshow("Thin Image",distShow);
	waitKey();
	return 0;
}

1.原始图片:
在这里插入图片描述
2.经过距离变换后距离Mat矩阵dst:
为了显示清晰,做了0~255的归一化。可以看到,中心处最亮,说明了中心点距离零点的距离最远,而最远处就可以作为物体的质心。
在这里插入图片描述
3.标记质心(绿色点):
在这里插入图片描述

二、细化轮廓

C++:

#include "core/core.hpp"
#include "imgproc/imgproc.hpp"
#include "highgui/highgui.hpp"

using namespace cv;

int main(int argc,char *argv[])
{
	float maxValue=0;  //定义距离变换矩阵中的最大值
	Mat image=imread(argv[1]);
	Mat imageGray;
	cvtColor(image,imageGray,CV_RGB2GRAY);
	imageGray=~imageGray;  //取反
	GaussianBlur(imageGray,imageGray,Size(5,5),2); //滤波
	threshold(imageGray,imageGray,20,200,CV_THRESH_BINARY); //阈值
	imshow("s",imageGray);
	Mat imageThin(imageGray.size(),CV_32FC1); //定义保存距离变换结果的Mat矩阵
	distanceTransform(imageGray,imageThin,CV_DIST_L2,3);  //距离变换
	Mat distShow;
	distShow=Mat::zeros(imageGray.size(),CV_8UC1); //定义细化后的字符轮廓
	for(int i=0;i<imageThin.rows;i++)
	{
		for(int j=0;j<imageThin.cols;j++)
		{
			if(imageThin.at<float>(i,j)>maxValue)
			{
				maxValue=imageThin.at<float>(i,j);  //获取距离变换的极大值
			}
		}
	}
	for(int i=0;i<imageThin.rows;i++)
	{
		for(int j=0;j<imageThin.cols;j++)
		{
			if(imageThin.at<float>(i,j)>maxValue/1.9)
			{
				distShow.at<uchar>(i,j)=255;   //符合距离大于最大值一定比例条件的点设为255
			}
		}
	}
	imshow("Source Image",image);
	imshow("Thin Image",distShow);
	waitKey();
	return 0;
}

1.原始图像:
在这里插入图片描述
2.细化效果:
在这里插入图片描述

形态学操作之腐蚀与膨胀

https://blog.csdn.net/qq_42856191/article/details/123663533

一、腐蚀(erosion)
1.1 什么是腐蚀
简单来说,腐蚀就是把图像中的物体变小了!(用背景去侵蚀前景)

腐蚀的工作过程如下图所示,A是一个集合,B是一个结构单元,我们使用B去对集合A进行腐蚀,腐蚀过程如C所示,在腐蚀过程中,结构单元必须全部位于集合A中才能进行腐蚀操作,最终得到的结果即为D所示。
在这里插入图片描述
Python:

import cv2
import numpy as np


ori = cv2.imread(r"C:\Users\Lenovo\Desktop\original.jpg")   # 读取图像

kernel1 = np.ones((3, 3), np.uint8)     # 3个不同尺度的腐蚀单元
kernel2 = np.ones((5, 5), np.uint8)
kernel3 = np.ones((7, 7), np.uint8)

erosion1 = cv2.erode(ori, kernel1)		# 腐蚀函数
erosion2 = cv2.erode(ori, kernel2)
erosion3 = cv2.erode(ori, kernel3)

cv2.imshow("original", ori)
cv2.imshow("erosion1", erosion1)
cv2.imshow("erosion2", erosion2)
cv2.imshow("erosion3", erosion3)

cv2.imwrite(r'C:\Users\Lenovo\Desktop\erosion1.jpg', erosion1)
cv2.imwrite(r'C:\Users\Lenovo\Desktop\erosion2.jpg', erosion2)
cv2.imwrite(r'C:\Users\Lenovo\Desktop\erosion3.jpg', erosion3)

cv2.waitKey()

下面展示的是程序得到的结果图,由图可知,腐蚀能对图像中的毛刺进行去除,但这也与腐蚀单元的大小有关,3 × 3 3×33×3大小的核去除效果不如5 × 5 5×55×5与7 × 7 7×77×7,此外7 × 7 7×77×7的核使得图像变得更加细小。
在这里插入图片描述

二、膨胀(dilation)

2.1 什么是膨胀
简单来说,膨胀就是把图像中的物体变大了!(对前景进行膨胀)

膨胀的工作过程如下图所示,A是一个集合,B是一个结构单元,我们使用B去对集合A进行膨胀,膨胀过程如C所示,在膨胀过程中,结构单元只要有一个位于集合A中就能进行膨胀操作,最终得到的结果即为D所示。
在这里插入图片描述
Python:

import cv2
import numpy as np


ori = cv2.imread(r"C:\Users\Lenovo\Desktop\original.jpg")   # 读取图像

kernel1 = np.ones((3, 3), np.uint8)     # 3个不同尺度的腐蚀单元
kernel2 = np.ones((5, 5), np.uint8)
kernel3 = np.ones((9, 9), np.uint8)

dilation1 = cv2.dilate(ori, kernel1)    # 膨胀函数
dilation2 = cv2.dilate(ori, kernel2)
dilation3 = cv2.dilate(ori, kernel3)

cv2.imshow("original", ori)
cv2.imshow("dilation1", dilation1)
cv2.imshow("dilation2", dilation2)
cv2.imshow("dilation3", dilation3)

cv2.imwrite(r'C:\Users\Lenovo\Desktop\dilation1.jpg', dilation1)
cv2.imwrite(r'C:\Users\Lenovo\Desktop\dilation2.jpg', dilation2)
cv2.imwrite(r'C:\Users\Lenovo\Desktop\dilation3.jpg', dilation3)

cv2.waitKey()

下面展示的是程序得到的结果图,由图可知,膨胀能对图像中的物体进行扩张,但这也与膨胀单元的大小有关,越大的膨胀核使得图像扩张区域更大。
在这里插入图片描述

形态学操作之开运算与闭运算

https://blog.csdn.net/qq_42856191/article/details/123670455

一、开运算

1.1 什么是开运算:先腐蚀后膨胀的操作称为开运算。
1.2作用:消除细小物体、在窄区域分离物体、平滑大物体边界等。
在这里插入图片描述

二、闭运算

2.1 什么是闭运算:先膨胀后腐蚀的操作称为闭运算。
2.2作用:填充物体空洞、消除噪声、连接邻近物体、平滑边界等。
在这里插入图片描述

图像分割 – 距离变换与分水岭算法(硬币检测、扑克牌检测、车道检测)

https://blog.csdn.net/great_yzl/article/details/119831771

以上述引用中的硬币检测为例子的分割过程:
1.将RGB图片转换为灰度图
2.去噪
开运算:先侵蚀后膨胀。会将两个物体之间可能存在的粘连噪点过滤,并将前景物体扩大。
3.确定背景区域
对图片进行膨胀操作,将前景扩大,背景也会随之减小。那么此时对象>原对象,此时背景 < 原背景,那么此时的背景自然可以确定为原背景的一部分。(离对象中心很远的是背景)
4.确定前景区域
原理:距离变换,在二值图中把对象缩小,得到的就是原图的一部分,可以确定为前景。
这种距离变换可以将前景中的不同实例分离,距离变换后得到前景物体不同灰度值的像素,通过threshold函数选定一个阈值来缩小前景物体中每个的大小,从而达到将不同实例分离的效果。(不分离的话,可以不用距离变换,只用腐蚀就够了)
下图分别为img原始图片、opening膨胀后的图片、sure_fg距离变换后经过threshold阈值操作获得的确定前景实例
在这里插入图片描述

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

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

相关文章

四个制作PPT的小技巧

制作PPT已经很麻烦了&#xff0c;学习一些小技巧可以帮助我们省时省力吧&#xff01; 技巧一&#xff1a;自动更新日期和时间 当我们给幻灯片添加了页脚并且是时间日期&#xff0c;可以通过设置达到自动更新&#xff0c;这样我们就不需要每次修改的时候都要手动更新日期和时间…

电商API接口中关于品牌详情/商品评论/视频/店铺链接等电商数据采集实例

单个品牌详情API接口 接口亮点&#xff1a;1.品牌商品&#xff0c;质量保障 2.高性价比商品&#xff0c;转化高 接口说明&#xff1a;该接口返回某个具体品牌的详细信息和推荐商品 使用场景&#xff1a;展示单个品牌相关信息以及品牌商品 商品评论API接口 接口亮点&…

C语言KR圣经笔记 2.8自增和自减 2.9位运算 2.10赋值

2.8 自增和自减操作符 C提供了两个不同寻常的操作符&#xff0c;用于对变量进行自增和自减。自增操作符对操作数加上1&#xff0c;而自减操作符 -- 对操作数减去1。我们已经频繁使用 对变量进行自增&#xff0c;如&#xff1a; if (c \n)nl; 不寻常之处在于 和 -- 既能用作…

接触式静电压测量仪的用途和操作方法

接触式静电压测量仪是一种用于测量静电电荷的仪器&#xff0c;主要用于工业生产和科学研究领域。它可以测量静电电压、静电场强、静电电荷等参数&#xff0c;对于静电控制和环境监测等方面具有重要的作用。 接触式静电压测量仪的操作方法如下&#xff1a; 接通电源&#xff1a;…

【Java系列】HashSet

HashSet 介绍添加元素判断元素是否存在删除元素删除集合中所有元素可以使用 clear 方法&#xff1a;计算大小迭代 HashSet 系列文章版本记录 介绍 HashSet 基于 HashMap 来实现的&#xff0c;是一个不允许有重复元素的集合。 HashSet 允许有 null 值。 HashSet 是无序的&#x…

PHP | php入门知识(if、switch、数组、数组排序、超级全局变量)

文章目录 一、php条件语句&#xff08;if、switch&#xff09;1. if语句2. if...else语句3. if...elseif...else语句4. switch语句 二、数组1&#xff09;数值数组1. 创建数值数组的两种方法&#xff1a;2. 获取数组的长度&#xff08;count()函数&#xff09;3. 遍历数值数组&…

港大联合百度开源通用图大模型GraphGPT:让大语言模型读懂图数据

导读 图神经网络&#xff08;GNN&#xff09;已成为处理和学习图数据的强大工具&#xff0c;在社交网络分析、推荐系统、智慧城市和生物信息等多个领域带来了革命性的进展。图神经网络的核心优势在于其揭示图数据中复杂关联性的能力。通过消息传递和信息聚合&#xff0c;图神经…

Leo赠书活动-04期 【国家数据局正式揭牌,数据专业融合型人才迎来发展良机 】文末送书5本

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠书活动专栏 ✨特色专栏&#xff1a;…

数据防泄密软件排行榜(10大数据防泄密软件推荐)

众所周知&#xff0c;公司中往往由于员工离职而出现泄密的情况&#xff0c;比如公司的财务资料、客户资料以及数据资料等&#xff0c;员工在跳槽的时候将这些带走&#xff0c;管理者无从考证导致部门甚至企业出现亏损的情况。 数据泄密一旦发生&#xff0c;企业在查证追责时就有…

有了这本书学习递归算法不再那么难

递归是一种编程技术&#xff0c;能够产生相当优雅的代码&#xff0c;但它也经常会把写代码和看代码的程序员给弄糊涂。这并不是说程序员可以或者应该忽略递归。尽管大家都知道递归比较难&#xff0c;但是这是计算机科学领域的一个重要话题&#xff0c;它能让你敏锐地观察到编程…

【linux进程(七)】程序地址空间深度剖析

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; 程序地址空间 1. 前言2. 什么…

中国卖家的出路:TikTok电商重塑东南亚市场

2023年10月4日&#xff0c;印尼政府发布了一则重要公告&#xff0c;宣布不再允许社交媒体作为商品销售平台。这一决策直接影响了TikTok在印尼的电商业务&#xff0c;迫使该平台关闭了其印尼市场的电商运营。 对于TikTok电商而言&#xff0c;印尼市场一直占据着重要地位&#x…

机器视觉工程师们,人的命运大多数连在一起

看着鱼池里的小鱼&#xff0c;很是治愈。自己的往后的生活还要继续。 有次出差&#xff0c;和工作经验13年机器视觉工程师&#xff0c;他用手指着流水线上的操作工说&#xff0c;他们失业&#xff0c;去干什么&#xff0c;回家种田吗&#xff1f;都机械化种田&#xff0c;回家…

程序员为啥要做副业(02)-中指备用金

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 免责声明~ 任何文章不要过度深思&#xff01; 万事万物都经不起审视&#xff0c;因为世上没有同样的成长环境&#xff0c;也没有同样的认知水平&#xff0c;更「没有适用于所有人的解决方案…

table 部分列宽度固定,剩余列宽度等分

table 固定列固定宽度&#xff0c;剩余列给最小宽度 <thead><tr><th rowspan"2" style"width:100px">序号</th><th rowspan"2" style"width:120px">姓名</th><th v-for"date in dates&q…

如何实现可靠的数据调度同步,数据同步方案看一下!

随着企业规模不断扩大&#xff0c;分支机构越来越多&#xff0c;跨区域跨国的集团越来越多&#xff0c;越来越多的企业要求内部各种业务数据在服务器、数据中心甚至云上&#xff0c;能够进行实时的调度和同步&#xff0c;从而需要部署一套数据同步方案&#xff0c;实现服务器与…

DC电源模块如何承受超负荷电流的能力

BOSHIDA DC电源模块如何承受超负荷电流的能力 DC电源模块是现代电子设备中必不可少的部件&#xff0c;它们通常被用来将交流电转换为稳定的直流电&#xff0c;为电子设备提供所需的电力。在某些情况下&#xff0c;DC电源模块可能会遇到超负荷电流的情况&#xff0c;如启动过程…

CleanMyMacXMac4.14.4版本系统优化工具

CleanMyMac是macOS上不可或缺的清理工具&#xff0c;它的作用非常强大&#xff0c;可以帮助用户清理系统、照片、邮件、iTunes垃圾&#xff0c;甚至是隐私数据。以下是CleanMyMac的主要功能和特点&#xff1a; 首先&#xff0c;CleanMyMac可以帮助清理系统垃圾&#xff0c;包括…

Pyqt5 List Widget 用户自定义添加/删除字段

添加和删除字段的逻辑 在窗口上显示一个list widget的窗口&#xff0c;还有一个添加字段的按钮 点击添加字段会弹出一个输入框&#xff0c;将内容作为一个item添加到list widget中 点击对应的已添加的字段&#xff0c;即会显示删除按钮&#xff0c;点击即可删除该字段 效果…

登录Edge发生了错误请稍后再试。Oxcfff82e发送反馈ccf05c90-0acc-0005-3100-f2cccc0ada01

登录Edge 发生了错误请稍后再试。Oxcfff82e发送反馈ccf05c90-0acc-0005-3100-f2cccc0ada01 1、如果连接了 VPN &#xff0c;建议断开 VPN。 2、按 “Windows 徽标键X”&#xff0c;启动 “Windows Power Shell&#xff08;管理员&#xff09;”&#xff08;也可以自行以管理员…