Cree un patrón binario local de una imagen usando OpenCV-Python

En este artículo, discutiremos la imagen y cómo encontrar un patrón binario utilizando el valor de píxel de la imagen.

Como todos sabemos, la imagen también se conoce como un conjunto de píxeles. Cuando almacenamos una imagen en computadoras o digitalmente, se almacenan sus valores de píxel correspondientes. Entonces, cuando leemos una imagen a una variable usando OpenCV en Python, la variable almacena los valores de píxel de la imagen.

Como podemos ver en el siguiente ejemplo:

import cv2
image = cv2.imread("GFG.jpg")
  
# Now, the variable 'image' stores the pixel values of image
print(image)

Ejemplos:

Entrada :

Salida :

[[[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 ...

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]]

Los valores de píxeles de la imagen se almacenarán en la variable y debajo hay una parte de la array NumPy que almacena los valores.

Patrón binario local

Hay muchos tipos diferentes de descriptores de textura que se utilizan para extraer características de una imagen. El patrón binario local, también conocido como LBP, es una medida de descripción de textura simple e invariable en escala de grises para la clasificación. En LBP, se genera un código binario en cada píxel mediante el umbral de los píxeles vecinos a 0 o 1 según el valor del píxel central.

La regla para encontrar LBP de una imagen es la siguiente:

  1. Establezca un valor de píxel como píxel central.
  2. Recopile los píxeles de su vecindario (aquí estoy tomando una array de 3 x 3; el número total de píxeles del vecindario es 8)
  3. Umbral el valor del píxel de la vecindad a 1 si su valor es mayor o igual al valor del píxel central; de lo contrario, el umbral a 0.
  4. Después de establecer el umbral, recopile todos los valores de umbral de la vecindad, ya sea en el sentido de las agujas del reloj o en sentido contrario. La colección le dará un código binario de 8 dígitos. Convierte el código binario en decimal.
  5. Reemplace el valor del píxel central con el resultado decimal y realice el mismo proceso para todos los valores de píxel presentes en la imagen.

Pongamos un ejemplo para entenderlo correctamente.

Tomemos un valor de píxel de la salida anterior para encontrar su patrón binario de su vecindario local. Entonces, estoy tomando un valor ‘149’ (presente en la fila 15 y la columna 19) y sus 8 píxeles vecinos para formar una array de 3 x 3.

Recopile los valores de umbral en sentido horario o antihorario. Aquí, los estoy recopilando en el sentido de las agujas del reloj desde la parte superior izquierda. Entonces, después de recopilar, el valor binario será el siguiente:

Luego, convierta el código binario en decimal y colóquelo en el centro de la array.

1 x 27 + 1 x 26 + 1 x 25 + 0 x 24 + 0 x 23 + 0 x 22 + 0 x 21 +1 x 20 
= 128 + 64 + 32 + 0 + 0 + 0 + 0 + 1
= 225

Ahora, la array resultante se verá como,

Ahora, hagámoslo usando python

import cv2
import numpy as np
from matplotlib import pyplot as plt
   
      
def get_pixel(img, center, x, y):
      
    new_value = 0
      
    try:
        # If local neighbourhood pixel 
        # value is greater than or equal
        # to center pixel values then 
        # set it to 1
        if img[x][y] >= center:
            new_value = 1
              
    except:
        # Exception is required when 
        # neighbourhood value of a center
        # pixel value is null i.e. values
        # present at boundaries.
        pass
      
    return new_value
   
# Function for calculating LBP
def lbp_calculated_pixel(img, x, y):
   
    center = img[x][y]
   
    val_ar = []
      
    # top_left
    val_ar.append(get_pixel(img, center, x-1, y-1))
      
    # top
    val_ar.append(get_pixel(img, center, x-1, y))
      
    # top_right
    val_ar.append(get_pixel(img, center, x-1, y + 1))
      
    # right
    val_ar.append(get_pixel(img, center, x, y + 1))
      
    # bottom_right
    val_ar.append(get_pixel(img, center, x + 1, y + 1))
      
    # bottom
    val_ar.append(get_pixel(img, center, x + 1, y))
      
    # bottom_left
    val_ar.append(get_pixel(img, center, x + 1, y-1))
      
    # left
    val_ar.append(get_pixel(img, center, x, y-1))
       
    # Now, we need to convert binary
    # values to decimal
    power_val = [1, 2, 4, 8, 16, 32, 64, 128]
   
    val = 0
      
    for i in range(len(val_ar)):
        val += val_ar[i] * power_val[i]
          
    return val
   
path = 'GFG.png'
img_bgr = cv2.imread(path, 1)
   
height, width, _ = img_bgr.shape
   
# We need to convert RGB image 
# into gray one because gray 
# image has one channel only.
img_gray = cv2.cvtColor(img_bgr,
                        cv2.COLOR_BGR2GRAY)
   
# Create a numpy array as 
# the same height and width 
# of RGB image
img_lbp = np.zeros((height, width),
                   np.uint8)
   
for i in range(0, height):
    for j in range(0, width):
        img_lbp[i, j] = lbp_calculated_pixel(img_gray, i, j)
  
plt.imshow(img_bgr)
plt.show()
   
plt.imshow(img_lbp, cmap ="gray")
plt.show()
   
print("LBP Program is finished")

Producción:

python-lbp

La salida que se muestra en los ejemplos contiene algunos valores en su eje X y eje Y que se refieren al ancho y alto de la imagen de entrada respectivamente.

Publicación traducida automáticamente

Artículo escrito por pankajpatra1998 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *