Advertisement

LBP算法提取图片纹理特征图

阅读量:

LBP算法提取图片纹理特征图

一、项目目标

采用LBP算法提取图片的纹理特征图。

二、LBP算法原理

LBP常被定义为局部二值模式(Local Binary Pattern),其英文全称是Local Binary Patterns(缩写LBPs)。最初主要应用于辅助图像对比度分析,在这一阶段并不能单独构成有效的特征描述工具。然而随着研究的发展,在数字图像处理与模式识别领域中逐渐演变为一种鲁棒的纹理特征提取工具。传统的LBP方法仅考虑中心像素与其周围像素灰度值差异情况,在9x9邻域内生成一个8位的二进制模式码(Binary Pattern),最终将该模式码转换为十进制数值即为LBP特征码。为了提高算法性能和适应复杂场景需求,在此基础上衍生出了多种改进型算法如旋转加权二值模式(Rotated Binary Patterns)以及加权累积直方图(Weighted Cumulative Histograms)等不同的变体形式以满足实际应用需求

在这里插入图片描述

其中二进制数"11110001"的排列顺序并非必须严格遵循某种规定,在同一处理过程中应保持一致即可。

三、代码

复制代码
    #include <opencv2/opencv.hpp>
    #include <iostream> 
    
    using namespace cv;
    using namespace std; 
    
    Mat LBP(Mat src_image); 
    
    int main()
    {	
    	Mat img0 = imread("src.jpg");	
    	cv::imshow("原图", img0); 
    	LBP(img0);	
    	cvWaitKey(0);	
    	return 0;
    } 
    
    Mat LBP(Mat src_image)
    {     
    	//源图像预处理	
    	cv::Mat Image(src_image.rows, src_image.cols, CV_8UC1);  //建立一个与src_image等高等宽的单通道图像Image
    	cv::Mat lbp(src_image.rows, src_image.cols, CV_8UC1);    //建立一个与src_image等高等宽的单通道图像lbp	
    	if (src_image.channels() == 3)		
    		cvtColor(src_image, Image, CV_BGR2GRAY);   //LBP只能处理灰度图像,转化为灰度图	
    	unsigned center = 0;   //提取需要计算LBP值得中心点的灰度值	
    	unsigned center_lbp = 0;     //计算center处的LBP值 	
    	//计算LBP图像	
    	for (int row = 1; row < Image.rows - 1; row++)	
    	{		
    		for (int col = 1; col < Image.cols - 1; col++)		
    		{			
    			center = Image.at<uchar>(row, col);			
    			center_lbp = 0;			
    			if (center <= Image.at<uchar>(row - 1, col - 1))				
    				center_lbp += 1;	//8位二进制数第0位置1		
    			if (center <= Image.at<uchar>(row - 1, col))				
    				center_lbp += 2;	//8位二进制数第1位置1 		
    			if (center <= Image.at<uchar>(row - 1, col + 1))				
    				center_lbp += 4;	//8位二进制数第2位置1 		
    			if (center <= Image.at<uchar>(row, col - 1))				
    				center_lbp += 8;	//8位二进制数第3位置1 		
    			if (center <= Image.at<uchar>(row, col + 1))				
    				center_lbp += 16;	//8位二进制数第4位置1 		
    			if (center <= Image.at<uchar>(row + 1, col - 1))				
    				center_lbp += 32;	//8位二进制数第5位置1 		
    			if (center <= Image.at<uchar>(row + 1, col))				
    				center_lbp += 64;	//8位二进制数第6位置1 		
    			if (center <= Image.at<uchar>(row + 1, col + 1))				
    				center_lbp += 128;	 //8位二进制数第7位置1 		
    			//把center处计算好的LBP值存放在lbp图像的相应位置
    			lbp.at<uchar>(row, col) = center_lbp;         		
    		}	
    	}	
    	cv::imshow("LBP纹理图", lbp);	
    	waitKey(10);	
    	cv::imshow("灰度图", Image);	
    	waitKey(10);	
    	return lbp;
    }

四、项目结果

原图:

在这里插入图片描述

灰度图:

在这里插入图片描述

纹理特征图:

在这里插入图片描述

全部评论 (0)

还没有任何评论哟~