OpenCV - método de cálculo de LBP básico

1. Principio del algoritmo

1. Resumen de principios

  LBP es la abreviatura de Local Binary Pattern (Patrón Binario Local), propuesta por TimoOjala et al., en la Universidad de Oulu, Finlandia.Es un operador que describe las características locales de textura de una imagen basada en escala de grises. La idea básica es utilizar la relación entre el valor central y el valor de vecindad para cuantificar y expresar las características de textura locales de la imagen.
Este operador se genera en base al análisis de varios operadores de textura. Comparado con otros operadores de la misma categoría, LBP tiene las siguientes ventajas: (1) El
principio es profundo, fácil de entender y fácil de expandir y mejorar;
(2) Escala de grises La robustez de la escala es buena, es decir, la influencia de la luz es débil;
(3) La operación es conveniente y el cálculo se realiza en la vecindad local, lo que brinda la posibilidad de análisis en tiempo real de imágenes en complejos situaciones
  Basado en las ventajas anteriores, LBP se usa ampliamente en los campos de procesamiento de imágenes y reconocimiento de patrones, como clasificación de texturas, reconocimiento de rostros o expresiones, detección de objetos como peatones y automóviles, discriminación de comportamiento y clasificación de imágenes de detección remota.
  El LBP básico toma 3 × 3 3\times33×La cuadrícula 3 es la ventana, y hay nueve píxeles en la ventana, y el valor es el valor gris. El valor de umbral del píxel central se compara con el valor de píxel vecino. Si el valor de píxel vecino es mayor o igual que el valor de píxel central, el valor de umbral del píxel es 1, de lo contrario es 0, y el 8- bit número binario se convierte en un número decimal El valor LBP de la unidad central. La fórmula de cálculo del umbral de vecindad es la siguiente:
si = { 1 , pi − pc ≥ 0 0 , pi − pc < 0 (1) s_i= \begin{cases} 1,\quad p_i-p_c\geq 0\\ 0 , \quad p_i-p_c<0 \end{casos} \tag{1}syo={ 1 ,pagyopagdo00 ,pagyopagdo<0( 1 )
  dondesi s_isyoes el valor umbral de los píxeles vecinos en la ventana, pc p_cpagdoes el valor de gris del píxel central, pt p_tpagtes el valor de gris de los píxeles vecinos.
El proceso de cálculo del valor LBP se muestra en la Figura 1. El valor del píxel central es 6, dispuesto en el sentido de las agujas del reloj, comenzando desde la esquina superior izquierda, los valores del píxel del vecindario son 6, 5, 2, 1, 7, 3, 9, 7 y Los umbrales de dominio son 1, 0, 0, 0, 1, 0, 1, 1 respectivamente, el valor binario de LBP es 110110001 y el valor de LBP del píxel central es 209 después de convertirlo a decimal .
inserte la descripción de la imagen aquí

Cálculo del valor LBP

2. Referencias

[1] Ma Xinjiang. Extracción de límites de carreteras en la nube de puntos láser de vehículos basada en características LBP multivariadas [D]. Universidad de Ciencia y Tecnología de Shandong, 2019.

2. Implementación del código

#include<iostream>
#include<opencv2/opencv.hpp>

using namespace std;
// 基本LBP的计算方法
cv::Mat LocalBinaryPattern(cv::Mat& orignImg)
{
    
    
	cv::Mat grayImg;
	cvtColor(orignImg, grayImg, cv::COLOR_BGR2GRAY);

	int width = orignImg.cols - 2;
	int hight = orignImg.rows - 2;

	cv::Mat lbpImg = cv::Mat::zeros(hight, width, CV_8UC1);
	for (int row = 1; row < orignImg.rows - 1; row++)
	{
    
    
		for (int col = 1; col < orignImg.cols - 1; col++)
		{
    
    
			uchar c = grayImg.at<uchar>(row, col);
			uchar code = 0;
			code |= (grayImg.at<uchar>(row - 1, col - 1) > c) << 7;
			code |= (grayImg.at<uchar>(row - 1, col) > c) << 6;
			code |= (grayImg.at<uchar>(row - 1, col + 1) > c) << 5;
			code |= (grayImg.at<uchar>(row, col + 1) > c) << 4;
			code |= (grayImg.at<uchar>(row + 1, col + 1) > c) << 3;
			code |= (grayImg.at<uchar>(row + 1, col) > c) << 2;
			code |= (grayImg.at<uchar>(row + 1, col - 1) > c) << 1;
			code |= (grayImg.at<uchar>(row, col) > c) << 0;
			lbpImg.at<uchar>(row - 1, col - 1) = code;

		}
	}
	return lbpImg;
};


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 = LocalBinaryPattern(img);

	imshow("LBP", lbpImg);
	cv::waitKey(0);

	return 0;

}

3. Visualización de resultados

  Se puede ver que el operador LBP puede preservar mejor los detalles tales como contornos de edificios, ojos, narices, bocas y plumas de sombreros.

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_36686437/article/details/130980985
Recomendado
Clasificación