OpenCV——多分辨率LBP的计算方法

目录

OpenCV------多分辨率LBP的计算方法由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。

一、算法原理

1、原理概述

基本LBP算子虽然在早期的实验中取得了一系列成果,但是应用于不同领域的具体问题时,该算子的处理结果并不能达到预期的效果。因此,很多学者对其进行了改进,并取得了显著成果。改进算子主要有多分辨率LBP、旋转不变LBP和等价LBP等。

TimoOjala等_对基本LBP进行拓展,拓展后的多分辨率LBP不再仅仅是 3 × 3 3\times3 3×3格网,而是可以设置邻域像素数量和半径,通常用 P P P表示邻域像素个数,用 R R R表示半径,记为LBP_PR;与此同时,运用了插值的思想,将邻域窗口由方形拓展为圆形。基本LBP是邻域像素数量P=8,半径R=1.0的版本。下图描述了P和R取不同值时的情况。

多分辨率LBP   从图中可以看出,只要不断改变窗口大小,即改变P和R的值,LBP就具备了多分辨率识别的特性,TimoOjala等人通过实验得出,将图像的灰度直方图和LBP特征结合可以增强分类效果。

2、参考文献

1\] 马新江. 基于多元LBP特征的车载激光点云中道路边界提取\[D\].山东科技大学,2019.

二、代码实现

cpp 复制代码
#include<iostream>
#include<opencv2/opencv.hpp>

using namespace std;

// 多分辨率LBP
cv::Mat ExpandLocalBinaryPattern(cv::Mat& orignImg, int lbpRadius = 3, int maxCount = 20)
{
	cv::Mat grayImg;
	cvtColor(orignImg, grayImg, cv::COLOR_BGR2GRAY);
	int offset = lbpRadius * 2;
	cv::Mat elbpImg = cv::Mat::zeros(grayImg.rows - offset, grayImg.cols - offset, CV_8UC1);
	int numNeighbor = 8;
	for (int n = 0; n < numNeighbor; n++)
	{
		float x = lbpRadius * cos((2 * CV_PI * n) / numNeighbor);
		float y = lbpRadius * (-sin((2 * CV_PI * n) / numNeighbor));

		int fx = static_cast<int>(floor(x)); // 向下取整,它返回的是小于或等于函数参数,并且与之最接近的整数
		int fy = static_cast<int>(floor(y));
		int cx = static_cast<int>(ceil(x));  // 向上取整,它返回的是大于或等于函数参数,并且与之最接近的整数
		int cy = static_cast<int>(ceil(y));

		float ty = y - fy;
		float tx = x = fx;

		float w1 = (1 - tx) * (1 - ty);
		float w2 = (tx) * (1 - ty);
		float w3 = (1 - tx) * (ty);
		float w4 = (tx) * (ty);

		for (int row = lbpRadius; row < (grayImg.rows - lbpRadius); row++)
		{
			for (int col = lbpRadius; col < (grayImg.cols - lbpRadius); col++)
			{
				float t = w1 * grayImg.at<uchar>(row + fy, col + fx) +
					w2 * grayImg.at<uchar>(row + fy, col + cx) +
					w3 * grayImg.at<uchar>(row + cy, col + fx) +
					w4 * grayImg.at<uchar>(row + cy, col + cx);
				elbpImg.at<uchar>(row - lbpRadius, col - lbpRadius) +=
					((t > grayImg.at<uchar>(row, col)) && (abs(t - grayImg.at<uchar>(row, col)) > std::numeric_limits<float>::epsilon())) << n;

			}
		}
	}
	
	return elbpImg;
}


int main(int argc, char** argv)
{
	cv::Mat img = cv::imread("luna.png");
	//cv::Mat img;
	//resize(img, img, cv::Size(800, 500), 0, 0, cv::INTER_AREA);
	if (img.empty())
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}
	imshow("img", img);
	// 多分辨率LBP
	cv::Mat lbpImg = ExpandLocalBinaryPattern(img);

	imshow("多分辨率LBP", lbpImg);
	cv::waitKey(0);

	return 0;

}

三、结果展示

相关推荐
夏日听雨眠1 天前
linux(线程,线程同步 方法 互斥锁 信号量 条件变量 )
linux·运维·算法
神经网络机器学习智能算法画图绘图1 天前
基于改进的支持向量机多分类预测研究
算法·支持向量机·分类
阿Y加油吧1 天前
两道经典算法题复盘:最长有效括号 & 不同路径
算法
问道财经1 天前
开启AI端侧能源新纪元 豪鹏科技亮相CIBF 2026
人工智能·科技·能源
HaSaKing_7211 天前
API 中转站黑话说明:渠道、倍率、风险与选型
人工智能·ai编程·ai写作
木雷坞1 天前
K8s v1.36 AI 任务启动失败排查:PodGroup、DRA、ImagePullBackOff
人工智能·容器·kubernetes
晚风叙码1 天前
一文吃透二叉树:前中后序遍历+节点数+树高+叶子节点(含完整源码)
数据结构·算法
爱写代码的小朋友1 天前
人工智能赋能高中信息技术编程学习的实践研究
人工智能·学习·百度
迦南的迦 亚索的索1 天前
机器学习_05_k-means算法
算法·机器学习·kmeans
DogDaoDao1 天前
【GitHub】SkyReels-V2 无限时长电影级视频生成模型:技术架构与核心原理深度解析
人工智能·大模型·aigc·音视频·ai agent·生成视频·skyreels-v2