Saltar al contenido

¿Qué hace exactamente el operador bitwise_and en openCV?

Tenemos la mejor respuesta que hallamos online. Nuestro deseo es que te sea de ayuda y si puedes aportar cualquier detalle que nos pueda ayudar a crecer hazlo libremente.

Solución:

El uso general es que desea obtener un subconjunto de una imagen definida por otra imagen, generalmente denominada “máscara”.

Así que suponga que quiere “tomar” el cuadrante superior izquierdo de una imagen de 8×8. Podrías formar una máscara que se vea así:

1 1 1 1 0 0 0 0
1 1 1 1 0 0 0 0
1 1 1 1 0 0 0 0
1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

Podría producir la imagen de arriba con Python con:

import numpy as np

mask = np.zeros(shape=(8,8), dtype=bool)
mask[0:4,0:4] = True

Entonces suponga que tiene una imagen como:

1 0 1 0 1 1 1 1
0 1 0 1 0 0 0 0
1 0 1 0 1 1 1 1
0 1 0 1 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0

Para ser concretos, imagine que la imagen de arriba es una representación simplificada de la bandera de EE. UU.: estrellas en la parte superior izquierda, barras en todas partes. Suponga que desea formar la imagen de arriba. Podrías usar la máscara, y bitwise_and y bitwise_or para ayudarte.

imageStars = np.ones(shape=(8,8), dtype=bool)
for r, row in enumerate(imageStars):
    for c, col in enumerate(row):
        if r % 2 != c % 2: # even row, odd column, or odd row, even column
            imageStars[r,c] = False

imageBars = np.zeros(shape=(8,8), dtype=bool)
for r, row in enumerate(imageStars):
    if r % 2 == 0:
        imageBars[r,:] = True

Ahora tienes una imagen de estrellas:

1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1    
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1    
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1    
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1

Y una imagen de barras:

1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0

Y quieres combinarlos de una manera particular, para formar la bandera, con las estrellas en el cuadrante superior izquierdo y las barras en todos los demás.

imageStarsCropped = cv2.bitwise_and(imageStars, mask)

imageStarsCropped se vera como:

1 0 1 0 0 0 0 0
0 1 0 1 0 0 0 0    
1 0 1 0 0 0 0 0
0 1 0 1 0 0 0 0  
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

¿Ves cómo se formó? Él bitwise_and devoluciones 1 en cada píxel donde imageStars es 1 Y mask es 1; de lo contrario, vuelve 0.

Ahora vamos a conseguir imageBarsCropped. Primero, invirtamos la máscara:

maskReversed = cv2.bitwise_not(mask)

bitwise_not vueltas 1está en 0‘arena 0está en 1‘s. Se “voltea los bits”. maskReversed se vera como:

0 0 0 0 1 1 1 1
0 0 0 0 1 1 1 1
0 0 0 0 1 1 1 1
0 0 0 0 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1

Ahora, usaremos maskReversed para “agarrar” la porción de imageBars que queremos

imageBarsCropped = cv2.bitwise_and(imageBars, maskReversed)

imageBarsCropped se vera como:

0 0 0 0 1 1 1 1
0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0

¡Ahora, combinemos las dos imágenes “recortadas” para formar la bandera!

imageFlag = cv2.bitwise_or(imageStarsCropped, imageBarsCropped)

imageFlag se vera como:

1 0 1 0 1 1 1 1
0 1 0 1 0 0 0 0
1 0 1 0 1 1 1 1
0 1 0 1 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0

¿Ves por qué? bitwise_or devoluciones 1 en cualquier momento imageStarsCropped[r,c]==1 O imageBarsCropped[r,c]==1.

Bueno, espero que esto te ayude a comprender las operaciones bit a bit en OpenCV. Estas propiedades tienen una correspondencia uno a uno con las operaciones bit a bit con números binarios que la computadora hace para hacer aritmética.

Puntuaciones y comentarios

Tienes la opción de avalar nuestra labor poniendo un comentario y dejando una puntuación te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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