Notas de estudio de OpenCV 03--operación de imagen--operación de adición de imagen, operación de bit de imagen, máscara de imagen

contenido

(1), operación de adición de imagen

(2), operación lógica de bits

(3) Máscara

(4) Otras operaciones de lógica de bits

(5) Descomposición de mapa de bits en el procesamiento de imágenes


Introducción: En el procesamiento de imágenes digitales, cambiar los píxeles de una imagen implica algunos problemas operativos. El enfoque de este artículo está en las operaciones lógicas de bits. A través de las operaciones lógicas de bits, podemos encontrar algo de magia. Usando operaciones de bits, podemos realizar la adición de las marcas de agua, el cifrado y descifrado de imágenes y las imágenes parciales de las imágenes que nos interesan también se pueden extraer mediante operaciones lógicas. Introduzca el tema a continuación.

(1), operación de adición de imagen

La operación de adición de la imagen se puede operar con el signo '+' o la función cv2.add() en la biblioteca opencv, pero los resultados de la operación de las imágenes obtenidas por estos dos métodos son diferentes. Además, presentemos el uso de la función cv2.addWeighted().

Supongamos que operamos sobre una imagen de 8 bits. Es decir, el valor de cada píxel está entre [0, 255].

Si se utiliza el signo '+' para realizar la operación de suma de píxeles de la imagen, si el resultado después de la suma es superior a 255, el cálculo se reinicia desde 0, es decir, la operación restante se realiza en 255.

Si se usa la función cv2.add() para la operación de suma, si el resultado después de la suma es mayor que 255, la asignación uniforme es 255.

Echemos un vistazo al programa.

import cv2
import numpy as np
# 声明两个随机数组,大小为4*4
img1 = np.random.randint(0, 255, (4, 4), dtype=np.uint8)
img2 = np.random.randint(0, 255, (4, 4), dtype=np.uint8)

# 打印一下生成的随机数组
print('img1=\n', img1)
print('img2=\n', img2)

# 利用运算符+进行像素的加法运算
img3 = img1 + img2
print('img1 + img2 = \n', img3)
img4 = cv2.add(img1, img2)
print('cv2.add(img1, img2)=\n', img4)

El funcionamiento y los resultados se muestran a continuación, si hay píxeles y más de 255, los resultados obtenidos por los dos métodos son diferentes:

 Sugerencia: Lo mejor es usar la función cv2.add(), porque si se usa el signo '+', si la suma de píxeles es 256, el resultado es 1, que cambia de más brillante a más oscuro, lo cual no hacemos. t quiero obtener Con cv2.add(), si excede 255, por defecto tiene el valor máximo de 255. No se puede pasar del píxel más brillante al píxel más oscuro.

La operación de suma que tenemos delante es sumar los píxeles directa y bruscamente. La función cv2.addWeighted() se puede implementar multiplicando el valor de píxel de la imagen por un número, es decir, participando en la operación de suma en una determinada proporción. El uso específico es el siguiente

cv2.addPonderado(img1, x1, img2, x2, b)

img1 e img2 representan dos matrices de imágenes, x1 es el número a multiplicar por cada píxel de la imagen img1, x2 es el número a multiplicar por cada píxel de la imagen img2, b es el resultado de la suma de img1 e img2 plus el valor de b.

Veámoslo con un ejemplo, primero declare dos arreglos, uno lleno de 10, otro lleno de 100, multiplicado por diferentes coeficientes 0.6, 0.4, más a b=1.

import numpy as np
import cv2
# 利用加权值对像素进行处理cv2.addWeighted(x, a, y, b, c)
img5 = np.ones((4, 4), dtype=np.uint8) * 10
img6 = np.ones((4, 4), dtype=np.uint8) * 100
img7 = cv2.addWeighted(img5, 0.6, img6, 0.4, 1)
print('img5=\n', img5)
print('img6=\n', img6)
print('cv2.addWeighted(img5, 0.6, img6, 0.4)=\n', img7)

Los resultados son los siguientes:

 (2), operación lógica de bits

Hemos aprendido binario en matemáticas e introducción a la informática.La operación lógica de bits es una operación basada en binario. Las principales operaciones son AND, OR, NOT y XOR. Estas operaciones de bits tienen sus ventajas, y sus funciones opencv correspondientes se muestran en la siguiente tabla.

Nombre de la función significado básico
cv2.bitwise_and() poco y
cv2.bitwise_or() poco o
cv2.bitwise_xor() XOR
cv2.bitwise_not() negar (no)

cv2.bitwise_and(img1, img2, máscara=)

Los parámetros de las cuatro funciones anteriores son los mismos excepto por la negación de bits, aquí explicaremos con uno de ellos.

img1 e img2: estas dos son matrices de matriz, que pueden ser la matriz de matriz correspondiente a la imagen o la matriz de matriz definida por usted mismo.

máscara: Indica una máscara. Es un parámetro opcional, no un parámetro obligatorio. Se puede configurar de acuerdo con los requisitos. La explicación detallada de la máscara se dará más adelante.

A continuación, echemos un vistazo a las disposiciones teóricas de estas operaciones de bits.

Bit AND: 1 si todos son 1, 0 en caso contrario.

Bit OR: 0 si todos son 0, 1 en caso contrario.

Bit XOR: 0 si son iguales, 1 si no lo son.

Bit no: es tomar lo contrario. Si es 0, toma 1, si es 1, toma 0.

Como se muestra abajo:

 Aplicación de la operación bit AND

Mencionamos el principio de operación bit AND antes, si el mismo es 1, es 1, de lo contrario es cero. Entonces pensemos, si ahora hay un valor de píxel de 6, su valor binario correspondiente es 0000 0110, ahora establecemos otro valor de píxel de 255, el valor binario correspondiente es: 1111 1111, y el binario de 6 y 255 es bit-anded El resultado es: 0000 0110. Es decir, el resultado sigue siendo 6. Puede probar la operación AND binaria con otros valores x y 255, y el resultado sigue siendo x.

Puedo sacar las siguientes conclusiones:

Realizamos una operación de bit binario en cualquier número x con el número 255, y el resultado es el bit en sí.

Asimismo, si realizamos una operación binaria sobre cualquier valor x con el valor 0, el resultado siempre es 0.

Usando las conclusiones anteriores, podemos extraer la parte de la imagen que nos interesa. Por ejemplo, tenemos una imagen y queremos extraer información de la cara. Primero leemos una imagen gris, luego generamos una matriz de matriz del mismo tamaño que la imagen, y luego establecemos algunos valores en 255 para obtener la información de la imagen original, y algunos valores se establecen en 0 para mostrar los lugares no deseados en negro. Implementarlo con el siguiente código.

import numpy as np
import cv2
# 读取一幅图像
filename = r'C:\Users\LBS\Desktop\lena.jpg'
f = cv2.imread(filename, 0)
cv2.imshow('01', f)
# 用位与操作,获取我们感兴趣的部分,利用全1则为1,否则为0的特点
Mat = np.zeros(np.shape(f), dtype=np.uint8)
Mat[100:400, 100:400] = 255
Mat[400: 500, 100:200] = 255
# 将定义的矩阵Mat和图像f进行位与操作
img8 = cv2.bitwise_and(f, Mat)
cv2.imshow('02', Mat)
cv2.imshow('03', img8)
cv2.waitKey()
cv2.destroyAllWindows()

El resultado de ejecución es el siguiente: la posición de píxel de la imagen correspondiente al valor de píxel de matriz de 255 se muestra como el contenido de la imagen original, y los otros lugares se muestran en negro.

(3) Máscara

Una máscara también es una matriz de matrices, que consta de una secuencia de valores. Puede limitar el área de operación de operación de bits, es decir, operar en la posición donde el valor de la máscara no es igual a 0, y la posición donde la máscara es igual a cero, luego asignar todas las posiciones donde la máscara correspondiente a 0 de la imagen a operar se asigna a 0, 0 es decir, negro. Por ejemplo, supongamos que ahora construimos dos matrices Mat1, Mat2 y luego construimos una máscara Mat3, y luego realizamos una operación de suma en las dos matrices (lo mismo es cierto para las operaciones de bits, la suma se usa aquí para mostrar el uso de máscaras), luego la suma El área de operación se realiza en la posición donde Mat3 no es igual a 0, y otras posiciones se asignan a 0.

el código se muestra a continuación:

import numpy as np
import cv2
# 掩膜,控制计算的范围,只在掩膜不等于1的位置进行操作,其余位置置为0。
Mat1 = np.ones((4, 4), dtype=np.uint8) * 6
Mat2 = np.ones((4, 4), dtype=np.uint8) * 4
# 定义一个掩膜,操作只会在掩膜值为非空的像素点上进行,将其它的像素点的值置为0
Mat3 = np.zeros((4, 4), dtype=np.uint8)
Mat3[2:4, 2:4] = 1
print('Mat1=\n', Mat1)
print('Mat2=\n', Mat2)
print('Mat3=\n', Mat3)
#在掩膜规定的非0位置处执行加法操作,也适用执行位逻辑操作。
Mat4 = cv2.add(Mat1, Mat2, mask=Mat3)
print('Mat4=\n', Mat4)

El resultado es el siguiente:

 La máscara se aplica en la imagen de la siguiente manera:

import numpy as np
import cv2
# 读取彩色图像
filename = r'C:\Users\LBS\Desktop\lena.jpg'
f1 = cv2.imread(filename, 1)
cv2.imshow('f1', f1)
# 这里需要注意的是要提取出彩色图像的长宽,来构造掩膜的大小
w, h, c = np.shape(f1)
# 定义一个掩膜mask,操作只会在掩膜值为非空的像素点上进行,将其它的像素点的值置为0
mask = np.zeros((w, h), dtype=np.uint8)
mask[100:400, 100:400] = 255
mask[400:500, 100:200] = 255
# 执行位与运算
#f1 和 f1进行运算的结果还是f1,只不过是在mask指定的非0的区域上进行的操作
f2 = cv2.bitwise_and(f1, f1, mask=mask)
cv2.imshow('f2', f2)
cv2.waitKey()
cv2.destroyAllWindows()

El resultado de la ejecución es el siguiente:

(4) Otras operaciones de lógica de bits

Operación de bit OR y operación de bit XOR, hemos dado sus reglas de cálculo al principio, su operación y operación de bit AND son las mismas, y su operación de bit XOR puede realizar el cifrado y descifrado de imágenes. La operación Bit AND también puede lograr marcas de agua y extracción a nivel de bits. Debido al espacio limitado, los siguientes artículos los implementarán y explicarán en detalle .

(5) Descomposición de mapa de bits en el procesamiento de imágenes

 Aquí tomamos principalmente la imagen gris como ilustración. Si tenemos un píxel de imagen con 8 bits, significa que ahora tenemos un valor de píxel de 6, que se puede representar en binario, que tiene 8 bits, que es 0000 0110. Luego, pensemos si podemos desarmar estos ocho bits, luego una imagen consta de varios valores de píxeles, y luego cada valor de píxel se puede convertir en binario de 8 bits, luego convertimos cada bit del binario de cada píxel ¿Es posible extraer 8 imágenes extrayéndolas por separado? Por ejemplo, considero la imagen actual como una matriz de binarios. Para la imagen existente, extraigo el séptimo bit del binario de cada píxel, luego se extrae el valor del séptimo bit correspondiente a cada píxel para formar una imagen. Los artículos posteriores también resumirán las notas sobre la descomposición de mapas de bits en detalle.

No es fácil de escribir, por favor indique la fuente al reimprimir.

Supongo que te gusta

Origin blog.csdn.net/BaoITcore/article/details/124025061
Recomendado
Clasificación