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 1
está en 0
‘arena 0
está 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.