OpenCV图像纹理

news2024/12/23 7:03:08

LBP描述

LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子;它具有旋转不变性和灰度不变性等显著的优点。它是首先由T. Ojala, M.Pietikäinen, 和D. Harwood 在1994年提出,用于纹理特征提取。而且,提取的特征是图像的局部的纹理特征

计算过程 

原始的LBP算子定义为在3\*3的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3\*3邻域内的8个点经比较可产生8位二进制数(通常转换为十进制数即LBP码,共256种),即得到该窗口中心像素点的LBP值,并用这个值来反映该区域的纹理信息。数学表达式方式如下图所示

70f436408cb74b9a9e4812ab38623f9c.webp

 上述表述可能会比较抽象,接下来我们举一个例子表述 一下:

36d6c7fce56e48cb8880d94a03a4310f.webp 

代码实现

class LBP 
{
public:
	LBP(string url = "mm.jpg") :img(imread(url, IMREAD_GRAYSCALE)) 
	{
		result["img"] = img;
	}
	void GetLBP()
	{
		result["LBP"] = Mat::zeros(img.rows - 2, img.cols - 2, CV_8UC1);
		for (int i = 1; i < img.rows - 1; i++) 
		{
			for (int j = 1; j < img.cols - 1; j++) 
			{
				uchar temp = img.at<uchar>(i, j);
				uchar color = 0;
				color |= (img.at<uchar>(i - 1, j - 1) > temp) << 7;
				color |= (img.at<uchar>(i - 1, j) > temp) << 6;
				color |= (img.at<uchar>(i - 1, j + 1) > temp) << 5;
				color |= (img.at<uchar>(i, j + 1) > temp) << 4;
				color |= (img.at<uchar>(i+1, j + 1) > temp) << 3;
				color |= (img.at<uchar>(i+1, j) > temp) << 2;
				color |= (img.at<uchar>(i+1, j - 1) > temp) << 1;
				color |= (img.at<uchar>(i, j - 1) > temp) << 0;
				result["LBP"].at<uchar>(i - 1, j - 1) = color;
			}
		}
	}
	void Show() 
	{
		for (auto v : result) 
		{
			imshow(v.first, v.second);
		}
		waitKey(0);
	}

protected:
	map<string, Mat> result;
	Mat img;
};

 214a5f7746aa4b7499ff86a167f1bba9.webp

SIFT特征检测

尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。 其应用范围包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对。

SIFT算法是为了解决图片的匹配问题,想要从图像中提取一种对图像的大小和旋转变化保持鲁棒的特征,从而实现匹配。这一算法的灵感也十分的直观:人眼观测两张图片是否匹配时会注意到其中的典型区域(特征点部分),如果我们能够实现这一特征点区域提取过程,再对所提取到的区域进行描述就可以实现特征匹配了。

 

SIFT算法大致流程

高斯金字塔

  • 人看物体时近大远小,可以对图片下采样实现
  • 远处模糊,可以对图像高斯平滑实现

 

高斯差分金字塔特征提取

  • 获取了不同尺度的图片
  • 获取高频区域(边缘检测的算法使用差分滤波器如拉普拉斯滤波器、sobel滤波器)

 

特征点处理

  • 阈值化操作(去噪)
  • 非极大值抑制
  • 二阶泰勒修正
  • 低对比度去除
  • 边缘效应去除

 

描述特征点

  • 确定特征点区域方向
  • 特征点区域描述子

 

API介绍 

static Ptr<SIFT> create(int nfeatures = 0, int nOctaveLayers = 3,double contrastThreshold = 0.04, double edgeThreshold = 10,double sigma = 1.6);
/*******************************************************************
*            nfeatures:                     保留的最佳特性的数量            
*            cornOctaveLayersners:        高斯金字塔最小层级数
*            contrastThreshold:            对比度阈值用于过滤区域中的弱特征
*            edgeThreshold:              用于过滤掉类似边缘特征的阈值
*            sigma:                        高斯输入层级            
*********************************************************************/

 


virtual void detect( InputArray image,std::vector<KeyPoint>& keypoints,InputArray mask=noArray());
/*******************************************************************
*            image:                 输入图                
*            keypoints:            角点信息
*            mask:                计算亚像素角点区域大小            
*********************************************************************/

 


void drawKeypoints( InputArray image, const std::vector<KeyPoint>& keypoints, InputOutputArray outImage,const Scalar& color=Scalar::all(-1), DrawMatchesFlags flags=DrawMatchesFlags::DEFAULT );
/*******************************************************************
*            image:                 输入图                
*            keypoints:            角点信息
*            outImage:            输出图
*            color:              颜色
*            flags:                绘制标记            
*********************************************************************/

完整代码 

#include <iostream>
#include <map>
#include <new>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
class SIFTFeature 
{
public:
	SIFTFeature() :img(imread("mm.jpg")) 
	{
		result["img"] = img;
	}
	void TestSIFT() 
	{
		Ptr<SIFT> sift = SIFT::create();
		sift->detect(img, point);
		drawKeypoints(img, point, result["SIFT"], Scalar(255, 0, 255));
	}
	void Show() 
	{
		for (auto& v : result) 
		{
			imshow(v.first, v.second);
		}
		waitKey(0);
	}
protected:
	Mat img;
	vector<KeyPoint> point;
	map<string, Mat> result;
};

int  main() 
{
	unique_ptr<SIFTFeature> p(new SIFTFeature);
	p->TestSIFT();
	p->Show();
	return 0;
}

效果图:

7cbe859b2ef44a07b864e928728a95b4.webp 

 

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

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

相关文章

Python实现双进程:防止单点故障的深度解析

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是涛哥&#xff0c;今天为大家分享 Python实现双进程&#xff1a;防止单点故障的深度解析&#xff0c;文章2800字&#xff0c;阅读大约10分钟&#xff0c;大家enjoy~~ 在分布式系统中&#xff0c;确保系统的高…

IntelliJIDEA快捷键中文版

IntelliJIDEA快捷键中文版&#xff0c;对于Android Studio也适用。官方快捷键链接在此&#xff0c;官方上是英文的&#xff0c;我于2023-11-16下载并翻译成中文&#xff0c;可能翻译不太准&#xff0c;所以英文我都保留下来了&#xff0c;大家可以对比着看&#xff0c;有些英文…

文件传输客户端 SecureFX mac中文版支持多种协议

SecureFX mac是一款功能强大的文件传输客户端&#xff0c;可在 Mac 操作系统上使用。它由 VanDyke Software 公司开发&#xff0c;旨在为用户提供安全、可靠、高效的文件传输服务。 SecureFX 支持多种协议&#xff0c;包括 SFTP、SCP、FTP、FTP over SSL/TLS 和 HTTP/S。它使用…

Python---列表 集合 字典 推导式(本文以 列表 为主)

推导式&#xff1a; 推导式comprehensions&#xff08;又称解析式&#xff09;&#xff0c;是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列&#xff08;一个有规律的列表或控制一个有规律列表&#xff09;的结构体。 共有三种推导&#xff1a;列表…

Trigger替换Demo

maven工程 pom依赖 <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.1</version> </dependency> import org.quartz.Job; import org.quartz.JobExecutionContext; imp…

怎么使用Cpolar+Lychee搭建私人图床网站并实现公网访问?

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…

springcloud程序启动后,nacos服务中心的服务名称与程序spring.application.name所配置的应用名不一致

目录 一、场景二、关键依赖三、bootstrap.yml四、Nacos服务中心五、原因六、解决七、备注 一、场景 1、将SpringBoot项目升级为SpringCloud 2、SpringBoot版本从2.1.3.RELEASE升级为2.7.8 3、程序启动后&#xff0c;在Nacos服务中心展示的服务名称不是spring.application.na…

MAC地址注册的网络安全影响和措施分析

MAC地址注册对网络安全具有重要影响&#xff0c;同时也需要采取相应的措施来应对潜在的安全风险。以下是有关MAC地址注册的网络安全影响和应对措施的分析&#xff1a; 影响&#xff1a; 1. 身份验证&#xff1a;MAC地址注册可用于设备的身份验证&#xff0c;但MAC地址本身并不…

系列二、什么是OOM?什么是StackOverflowError?有哪些方法分析?

一、什么是OOM&#xff1f; OOM是堆内存溢出&#xff0c;产生的原因是堆的空间大小是有限的&#xff0c;当堆空间的大小不足以满足创建对象所需要的内存空间时&#xff0c;就会抛出OOM的异常。 二、什么是StackOverflowError&#xff1f; StackOverflowError是栈内存溢出的意思…

接口中的大事务,该如何进行优化?

作为后端开发的程序员&#xff0c;我们常常会的一些相对比较复杂的逻辑&#xff0c;比如我们需要给前端写一个调用的接口&#xff0c;这个接口需要进行相对比较复杂的业务逻辑操作&#xff0c;比如会进行&#xff0c;查询、远程接口或本地接口调用、更新、插入、计算等一些逻辑…

LabVIEW关于USRPRIO的示例代码

LabVIEW关于USRPRIO的示例代码 USRPRIO 通常以两种方式使用&#xff1a; 1 基于 FPGA 的编程 对于希望修改USRP上的底层FPGA代码以添加自定义DSP模块的应用&#xff0c;请使用USRP示例项目。它可作为构建 USRP RIO 流式处理应用程序的起点&#xff0c;可从“创建项目”对话框…

利用OpenCV做个熊猫表情包 二

之前写了一篇 利用OpenCV做个熊猫表情包吧_Leen的博客-CSDN博客 回想起来觉得有点太弱了&#xff0c;意犹未尽&#xff0c;每次使用需要自己去手动截取人脸&#xff0c;清除黑边什么的才能使用demo去合成表情&#xff0c;于是有空的时候就改进了一下&#xff0c;让它利用open…

腾讯云服务器租用价格,腾讯云服务器租用价格多少钱一年?

腾讯云服务器租用价格&#xff0c;腾讯云服务器租用价格多少钱一年&#xff1f;腾讯云服务器有优惠活动&#xff0c;现在租用只需要88元/年&#xff01;腾讯云服务器优惠购买入口&#xff1a;https://1111.mian100.cn 随着互联网的发展&#xff0c;越来越多的人开始选择将自己…

【部署篇】宝塔liunx中使用docker部署nestjs项目【全过程】

一、 &#x1f44b; 前序工作 连接服务器 获取宝塔面板信息 在命令行输入sudo /etc/init.d/bt default 进入宝塔面板输入账号密码 通过上面网址进入宝塔 安装自己需要的东西 **PS&#xff1a;**这里还需要自己登录宝塔账号&#xff0c;没有账号的同学需要注册一下 安装pm2…

Minio - 多节点多驱动器安装部署

先决条件 网络互通 MinIO集群中的节点的网络需要互相双向互通。 MinIO API默认端口9000 MinIO console默认端口9001 MinIO强烈建议使用负载均衡器来管理与集群的连接。负载均衡器策略使用“最小连接数”逻辑&#xff0c;因为在部署中任何 MinIO 节点都可以接收、路由或处理…

work环境配置

1.计算机右键找到属性 2.配置环境变量 3.新加环境变量 4.修改环境变量path .bat文件内容 php ApplicationsChatstart_register.php ApplicationsChatstart_gateway.php ApplicationsChatstart_businessworker.php pause

服务注册发现 springcloud netflix eureka

文章目录 前言角色&#xff08;三个&#xff09; 工程说明基础运行环境工程目录说明启动顺序&#xff08;建议&#xff09;&#xff1a;运行效果注册与发现中心服务消费者&#xff1a; 代码说明服务注册中心&#xff08;Register Service&#xff09;服务提供者&#xff08;Pro…

online java

在线JAVA执行器 online java 1&#xff1a;网页WEB或者客户端的文本TEX输入代码 2&#xff1a;服务端生成java文件 3&#xff1a;服务端生成class文件&#xff0c;命令javac 4&#xff1a;服务端执行class文件&#xff0c;命令java 5&#xff1a;生成结果&#xff0c;打印返回页…

基于PHP的纺织用品商城系统

有需要请加文章底部Q哦 可远程调试 基于PHP的纺织用品商城系统 一 介绍 此纺织用品商城系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。用户可注册登录&#xff0c;购物下单&#xff0c;评论等。管理员登录后台可对纺织用品&#xff0c;用户&#xf…

redis常见问题及解决方案

缓存预热 定义 缓存预热是一种优化方案&#xff0c;它可以提高用户的使用体验。 缓存预热是指在系统启动的时候&#xff0c;先把查询结果预存到缓存中&#xff0c;以便用户后面查询时可以直接从缓存中读取&#xff0c;节省用户等待时间 实现思路 把需要缓存的方法写在初始化方…