首页 > 其他分享 >OpenCV图像纹理(20)

OpenCV图像纹理(20)

时间:2023-04-22 23:32:53浏览次数:36  
标签:LBP 20 img temp 特征 void 纹理 OpenCV result

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值,并用这个值来反映该区域的纹理信息。数学表达式方式如下图所示

OpenCV图像纹理(20)_角点

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

OpenCV图像纹理(20)_特征点_02

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;
};

OpenCV图像纹理(20)_角点_03

opencv 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;
}

OpenCV图像纹理(20)_#include_04

标签:LBP,20,img,temp,特征,void,纹理,OpenCV,result
From: https://blog.51cto.com/u_15959862/6215718

相关文章

  • 2010年湖南省对口高考真题
    一、选择题1、下列不是C语言合法标识符的是__________。A._124            B.124abc          C.sum124          D.a_124 2、若有如图1所示存储结构,且变量定义为structnode{intdata;structnode*next;}p,q,r;若要实现图2所示的存储结......
  • Dlib 结合 Opencv 识别技术代码资料
    结合Dlibshap64面部识别#include<dlib/opencv.h>#include<opencv2/opencv.hpp>#include<dlib/image_processing/frontal_face_detector.h>#include<dlib/image_processing/render_face_detections.h>#include<dlib/image_processing.h>......
  • 2023 目标检测技术调研
     目标是找到一个实时的,能处理1080p视频流的算法,工程实现比较靠谱的项目 yolov7https://www.analyticsvidhya.com/blog/2022/08/yolov7-real-time-object-detection-at-its-best/https://viso.ai/deep-learning/yolov7-guide/ yolov8,2023年1月份https://github.com/ul......
  • Succinctly 中文系列教程(二) 20220109 更新
    Succinctly.NET本地化教程零、简介一、从本地化开始二、日期和时间三、周数四、时区五、数字六、货币七、文本八、附录SuccinctlyLinux教程一、简介二、Linux目录结构三、命令行界面四、目录五、查看文件和目录详情六、权限七、查看和编辑文件八、删除、移动和重命名文件和目......
  • Succinctly 中文系列教程 20220109 更新
    Succinctly会计教程一、会计简明指南二、收入和费用三、收入确认四、组织账目五、会计原则六、会计制度报告七、固定资产八、应收账款九、应付账款十、库存十一、工资单十二、总结十三、附录Succinctly安卓编程教程一、设置二、你好,安卓三、活动生命周期四、用户界面布局五、用户......
  • 今日总结0420
    今天是周四,上午在APP中增加了商品列表的展示,代码如下:publicclassBuhuoActivityextendsAppCompatActivityimplementsView.OnClickListener{privateListViewmSimpleList;privateSimpleAdaptermSimpleAdapter;privateList<Map<String,Object>>mList;p......
  • 算法学习day03链表part01-203、707、206--待办
    //这块需求重新进行学习packageLeetCode.linkedlistpart01;publicclassListNode{//结点的值intval;//下一个结点ListNodenext;//节点的构造函数(无参)publicListNode(){}//节点的构造函数(有一个参数)publicLis......
  • 2023-04-22 技术选型
    1.用户浏览器端&手机端:vue32.服务器端:.netCore3.负载均衡:Nginx4.CDN加速服务5.消息队列:Channel6.缓存层:Redis7.日志分析系统:Serilog日志组件+LogDashboard日志可视化组件8.数据库:MySQL、Oracle、MicrosoftSQLServer......
  • 联合省选2022游忆
    本文内容纯属虚构,如与事实相近,纯属偶然。本人文笔不好,请见谅。抑郁症患者勿入。话说是站在现在的角度写好呢,还是站在当时的角度写好呢。从1月18日开始写吧,先写省选前的记录,先写个大概,细节以后再补充。先粘几张排行榜:中途还有几场线下的模拟赛,但是都爆零/垫底了。noip......
  • 20-4-21--链表--两个有序链表序列的合并
    已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。输入格式:输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。输出格式:在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不......