模式识别 - 局部二值模式(Local Binary Patterns) 简介 及 代码

本文深入探讨了局部二值模式(LBP)的概念、原理及在图像处理领域的应用,包括代码实现和实例演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

局部二值模式(Local Binary Patterns)

OpenCV 2.4.6.0 不包含LBP的函数, 但包括使用LBP进行人脸检测的方法.

1. 简介

局部二值模式(Local Binary Patterns, LBP)的基本思想是:

定义于像素的8邻域中,以中心像素的灰度值为阈值,将周围8个像素的值与其比较,如果周围的像素值小于中心像素的灰度值,该像素位置就被标记为0,否则标记为1.每个像素得到一个二进制组合,就像00010011.每个像素有8个相邻的像素点,即有2^8种可能性组合,这些组合就被叫做局部二值模式(Local Binary Patterns)或缩写为LBP(LBP codes).如下图所示的例子:

2. 代码

olbp.hpp

#ifndef __OLBP_HPP__
#define __OLBP_HPP__

#include <opencv.hpp>

using namespace cv;

namespace cv {

	// 计算原始的局部二值模式
	void olbp(InputArray src, OutputArray dst);

	// see cv::olbp(InputArray, OutputArray)
	Mat olbp(InputArray src);

}

#endif


olbp.cpp

#include "olbp.hpp"

namespace cv {

	template <typename _Tp> static
		void olbp_(InputArray _src, OutputArray _dst) {
			Mat src = _src.getMat();
			// 省略两个边界
			_dst.create(src.rows-2, src.cols-2, CV_8UC1);
			Mat dst = _dst.getMat();
			dst.setTo(0);
			for(int i=1;i<src.rows-1;i++) {
				for(int j=1;j<src.cols-1;j++) {
					_Tp center = src.at<_Tp>(i,j);
					unsigned char code = 0;
					// 移位和bit位的或运算
					code |= (src.at<_Tp>(i-1,j-1) >= center) << 7;
					code |= (src.at<_Tp>(i-1,j) >= center) << 6;
					code |= (src.at<_Tp>(i-1,j+1) >= center) << 5;
					code |= (src.at<_Tp>(i,j+1) >= center) << 4;
					code |= (src.at<_Tp>(i+1,j+1) >= center) << 3;
					code |= (src.at<_Tp>(i+1,j) >= center) << 2;
					code |= (src.at<_Tp>(i+1,j-1) >= center) << 1;
					code |= (src.at<_Tp>(i,j-1) >= center) << 0;
					dst.at<unsigned char>(i-1,j-1) = code;
				}
			}
		}

}

void cv::olbp(InputArray src, OutputArray dst) {
	switch (src.getMat().type()) {
	case CV_8SC1:   olbp_<char>(src,dst); break;
	case CV_8UC1:   olbp_<unsigned char>(src,dst); break;
	case CV_16SC1:  olbp_<short>(src,dst); break;
	case CV_16UC1:  olbp_<unsigned short>(src,dst); break;
	case CV_32SC1:  olbp_<int>(src,dst); break;
	case CV_32FC1:  olbp_<float>(src,dst); break;
	case CV_64FC1:  olbp_<double>(src,dst); break;
	default: break;
	}
}

Mat cv::olbp(InputArray src) {
	Mat dst;
	olbp(src, dst);
	return dst;
}


main.cpp

#include "olbp.hpp"

using namespace cv;

int main(){
	cv::Mat src = cv::imread("heels.jpg", CV_LOAD_IMAGE_GRAYSCALE);
	cv::Mat dst;
	cv::olbp(src, dst);
	cv::imshow("Heel", dst);
	cv::waitKey(0);
}


output:

3. 参考

网址: http://www.bytefish.de/blog/local_binary_patterns/

中文论文: 局部二值模式方法研究与展望 宋克臣

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ManonLegrand

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值