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:
- Establezca un valor de píxel como píxel central.
- 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)
- 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.
- 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.
- 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:
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