opencv图像处理学习(七十四)——局部二值模式(LBP)

  LBP是一种描述图像局部纹理的特征算子,该算子具有旋转不变性与灰度不变性等显著优点。 以窗口中心像素为阈值,将其相邻8淋雨像素灰度与中心像素值比较,若周围像素值大于中心像素值,则该中心像素位置被标记为1,否则为0,通过计算得到的窗口中心像素点LBP码可以用来反映该窗口的区域纹理特征特征信息,经典LBP的数学表达式如下:
L B P ( x c , y c ) = ∑ n = 0 n − 1 2 n ψ ( i n − i c ) LBP(x_c,y_c)=\sum_{n=0}^{n-1}2^n \psi(i_n-i_c) LBP(xc,yc)=n=0n12nψ(inic)
  其中, ψ ( x ) = { 1 x > 0 0 x < 0 \psi(x)=\begin{cases}1&x>0\\0&x<0\end{cases} ψ(x)={10x>0x<0,为了区分中心点等于还是大于邻域像素点,引入LBP+和LBP-因子。

  圆形LBP的基本思想是将局部纹理分布作为当前像素灰度的联合概率分布,将正方形窗口扩展到任意圆形邻域,满足半径为R采样到N个像素点,对于非整数坐标像素,采用近邻域插值或双线性插值。

cv::Mat OLBP(cv::Mat srcImage)
{
	const int nRows = srcImage.rows;
	const int nCols = srcImage.cols;
	cv::Mat resultMat(srcImage.size(), srcImage.type());

	for (int y = 1; y < nCols - 1; y++)
	{
		for (int x = 1; x < nRows - 1; x++)
		{
			uchar neighbor[8] = { 0 };
			neighbor[0] = srcImage.at<uchar>(x - 1, y - 1);
			neighbor[1] = srcImage.at<uchar>(x , y - 1);
			neighbor[2] = srcImage.at<uchar>(x + 1, y - 1);
			neighbor[3] = srcImage.at<uchar>(x + 1, y );
			neighbor[4] = srcImage.at<uchar>(x + 1, y + 1);
			neighbor[5] = srcImage.at<uchar>(x, y + 1);
			neighbor[6] = srcImage.at<uchar>(x - 1, y + 1);
			neighbor[7] = srcImage.at<uchar>(x - 1, y);

			uchar center = srcImage.at<uchar>(x, y);
			uchar temp = 0;

			for (int k = 0; k < 8; k++)
			{
				temp += (neighbor[k] >= center) * (1 << k);
			}

			resultMat.at<uchar>(x, y) = temp;
		}
	}

	return resultMat;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的局部二值模式LBP的C++版本OpenCV代码: ```c++ #include <opencv2/opencv.hpp> #include <iostream> #include <cmath> using namespace cv; using namespace std; // 计算像素点的LBP值 uchar getLBPValue(Mat img, int row, int col) { uchar center = img.at<uchar>(row, col); uchar code = 0; code |= (img.at<uchar>(row-1, col-1) >= center) << 7; code |= (img.at<uchar>(row-1, col) >= center) << 6; code |= (img.at<uchar>(row-1, col+1) >= center) << 5; code |= (img.at<uchar>(row, col+1) >= center) << 4; code |= (img.at<uchar>(row+1, col+1) >= center) << 3; code |= (img.at<uchar>(row+1, col) >= center) << 2; code |= (img.at<uchar>(row+1, col-1) >= center) << 1; code |= (img.at<uchar>(row, col-1) >= center) << 0; return code; } // 计算图像的LBP特征图 Mat getLBPImage(Mat img) { Mat dst = Mat::zeros(img.size(), CV_8UC1); for (int i = 1; i < img.rows - 1; i++) { for (int j = 1; j < img.cols - 1; j++) { dst.at<uchar>(i, j) = getLBPValue(img, i, j); } } return dst; } int main(int argc, char** argv) { // 加载图像 Mat img = imread("lena.jpg", IMREAD_GRAYSCALE); if (img.empty()) { cout << "Failed to load image!" << endl; return -1; } // 计算LBP特征图 Mat lbpImg = getLBPImage(img); // 显示原图和LBP特征图 namedWindow("Original Image", WINDOW_NORMAL); namedWindow("LBP Image", WINDOW_NORMAL); imshow("Original Image", img); imshow("LBP Image", lbpImg); waitKey(0); return 0; } ``` 这个代码可以计算输入图像的LBP特征图,并显示出来。其中,`getLBPValue()`函数计算像素点的LBP值,`getLBPImage()`函数计算整个图像的LBP特征图。你可以根据需要修改代码以适应你的应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值