Operaciones de imagen de uso común de OpenCV-Python: suma, resta, multiplicación, división y operaciones de bit y logaritmo de extracción de potencia

Ir al blog de LaoYuanPython https://blog.csdn.net/LaoYuanPython

I. Introducción

Antes de escribir este artículo, Lao Yuan ya había publicado algunos cálculos sobre la imagen mientras aprendía. En el proceso de redacción de estos artículos, descubrí que estas funciones de cálculo tienen muchas cosas en común. Por ejemplo, la mayoría de los parámetros son los mismos, algunos de los métodos de procesamiento son los mismos, etc. También existen algunas funciones que pueden lograr efectos iguales o similares, por lo que en base a los artículos anteriores, se integran en un todo para publicar, que es más conveniente para todos de leer.

En OpenCV, las imágenes se almacenan como matrices, por lo que las operaciones de imagen son en realidad operaciones de matriz. Las operaciones de imágenes incluyen principalmente operaciones aritméticas básicas de imágenes, operaciones de ponderación de imágenes (también llamadas fusión de imágenes) y operaciones bit a bit. Estas operaciones se pueden realizar directamente a través de matrices numpy, o mediante los métodos dedicados de opencv, pero las operaciones de matriz de opencv y las operaciones de matriz numpy siguen siendo algo diferentes. Por ejemplo, además del procesamiento, la adición de OpenCV es una operación de saturación (si excede 255, presione 255), mientras que la adición de Numpy es una operación de módulo (más de 255, el resultado es módulo 256 como resultado). Además, cuanto mayor sea el valor del color, mejor será el resultado de OpenCV, por lo que se recomienda utilizar OpenCV para operaciones aritméticas. Todo el contenido de este artículo se basa en el método OpenCV.

Dos, sintaxis de operación de imágenes OpenCV

2.1, lista de funciones de operación de imagen

Las operaciones de imagen OpenCV incluyen las siguientes funciones:

  1. Operación de adición:add(src1, src2, dst=None, mask=None, dtype=None)
  2. Operación de resta:subtract(src1, src2, dst=None, mask=None, dtype=None)
  3. Operación de multiplicación:multiply(src1, src2, dst=None, scale=None, dtype=None)
  4. Operación de división:divide(src1, src2, dst=None, scale=None, dtype=None)
  5. Exponenciación:pow(src, power, dst=None)
  6. Operación de raíz cuadrada:sqrt(src, dst=None)
  7. Función exponencial con constante natural e como base:exp(src, dst=None)
  8. Operación logarítmica:log(src, dst=None)
  9. Adición de peso de fusión:addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None)
  10. Bit y operación:bitwise_and(src1, src2, dst=None, mask=None)
  11. Operación OR bit a bit:bitwise_or(src1, src2, dst=None, mask=None)
  12. Operación XOR bit a bit:bitwise_xor(src1, src2, dst=None, mask=None)
  13. Operación Bit NOT:bitwise_not(src, dst=None, mask=None)

2.2. Descripción de los parámetros comunes del funcionamiento de la imagen

  • src: matriz de imagen de entrada
  • src1, src2: dos imágenes de entrada de igual tamaño y número de canales o una imagen de entrada y un escalar (para escalar, consulte " Qué es escalar en OpenCV-Python ")
  • dst: La salida de la imagen de destino, que requiere el mismo tamaño que la imagen de entrada. Si se pasa el valor, el parámetro real se puede usar directamente como la variable de almacenamiento de la imagen de destino; de lo contrario, el valor de retorno de la función se puede usar como la variable de almacenamiento de la imagen de destino. Cuando el parámetro real no es Ninguno pasado en , El valor de retorno es el mismo que el valor real del parámetro
  • scale: factor de escala, al realizar operaciones de imagen, primero ejecute src1 * scale y luego use el producto para operaciones posteriores
  • máscara: máscara de imagen, parámetro opcional, imagen en escala de grises de un solo canal de 8 bits, utilizada para especificar los elementos de la matriz de imágenes de salida que se van a cambiar, es decir, los píxeles de la imagen de salida se emiten solo cuando el elemento de posición correspondiente de la máscara no es 0, de lo contrario Todos los componentes de canal del píxel en esta posición se establecen en 0. Para obtener más información sobre las máscaras, consulte " Operación de máscara de matriz 02 de OpenCV Learning " o " Máscara de máscara detallada de procesamiento de imágenes de OpenCV "
  • dtype: parámetro opcional, la profundidad de la matriz de imagen de salida, es decir, el número de bits de un solo valor de píxel de la imagen (si RGB está representado por tres bytes, es 24 bits). En el documento de ayuda, los parámetros src1 y src2 pueden tener diferentes profundidades de imagen (es decir, el número de píxeles de la imagen, como 8 bits, 16 bits, 24 bits y 32 bits). Por ejemplo, se pueden agregar una imagen de 16 bits y una imagen de 8 bits Guarde el resultado de salida en una matriz de salida de 32 bits. La investigación sobre este parámetro puede llevar mucho tiempo porque creo que si la profundidad de la imagen es diferente, significa que el número de canales de la imagen es diferente y el número de canales es diferente, lo que significa que el tamaño de la matriz es diferente y no se pueden operar esas dos matrices. Más tarde, por casualidad, pensé haber entendido. La profundidad de imagen que se menciona aquí no es el número de canales * 8, sino el número de bits representados por un valor de canal único. Es decir, un canal único no es necesariamente de 8 bits, pero también puede ser de 16 bits, 24 bits o 32 bits. Poco. Mira el siguiente código para entenderlo:
def main():
    img1 = cv2.imread(r'F:\pic\shape1.png').astype(np.float32)
    img2 = cv2.imread(r'F:\pic\shape2.png')
    img = cv2.add(img1,img2,dtype=24)

El código anterior leerá dos imágenes en dos métodos de representación diferentes: la primera imagen usa float32 para representar el valor de un solo canal de la imagen, y la segunda imagen usa el valor predeterminado uint8 para representar el valor de un solo canal de la imagen. Diferente, pero después de la adición, se convierte en una imagen de 24 bits, es decir, un solo canal es una imagen de 8 bytes.

2.3 Explicación detallada de algunas funciones de operación de imágenes

Para algunas operaciones de imagen importantes, el viejo simio se introdujo por separado en el anterior, que incluye:

  1. Operación de adición de imágenes OpenCV-Python función cv2.add explicación detallada
  2. Operación de resta de imágenes OpenCV-Python función cv2.subtract explicación detallada y comparación con la resta de matrices
  3. Operación de multiplicación de imágenes OpenCV-Python función cv2.multiply explicación detallada y procesamiento de normalización de desbordamiento de valor de píxel
  4. Operación de división de imágenes OpenCV-Python cv2.divide función y procesamiento de división de imágenes
  5. Fusión de imágenes OpenCV-Python cv2.add Explicación detallada de la función de adición de peso ponderado
  6. Bit de imagen OpenCV-Python y operación bitwise_and explicación detallada de la función

2.4 Introducción a otras funciones de operación de imágenes

  1. Operación de potencia: pow(src, power, dst=None)Calcule la potencia correspondiente al parámetro de potencia para cada valor de canal de la imagen como el valor de canal de la imagen de resultado. Si la potencia es un número entero, calcule directamente el valor de potencia, si la potencia es un número de punto flotante, tome el valor absoluto del valor del canal para participar en el cálculo ,cual es:Inserte la descripción de la imagen aquí

  2. Operación de raíz cuadrada: tome la raíz cuadrada sqrt(src, dst=None)de cada valor de canal de la imagen como el valor de canal de la imagen de resultado, a saber:dst(I)=sqrt(src1(I))

  3. Función exponencial con constante natural e como base: exp(src, dst=None)tome cada valor de canal de la imagen como base e como valor de canal de la imagen de resultado del cálculo del valor de potencia, a saber:Inserte la descripción de la imagen aquí

  4. Operación logarítmica: log(src, dst=None)Calcule el logaritmo natural de cada valor de canal de la imagen como el valor de canal de la imagen de resultado, a saber:dst(I)=ln(src(I))

  5. Operación OR bitwise_or(src1, src2, dst=None, mask=None)bit a bit : Calcule el resultado de OR bit a bit de cada valor de canal de dos imágenes o un valor de canal de imagen y un escalar como valor de canal de la imagen de resultado

  6. Operación XOR bit a bit: bitwise_xor(src1, src2, dst=None, mask=None)Calcule el resultado XOR bit a bit de cada valor de canal de dos imágenes o un valor de canal de imagen y un escalar como valor de canal de la imagen de resultado

  7. Operación bit-not: el bitwise_not(src, dst=None, mask=None)valor de cada canal de la imagen src se invierte bit a bit como el valor de la imagen resultante.

Tres, el papel del análisis de la función de correlación.

  1. La resta de imagen, la división y el OR exclusivo se pueden utilizar para analizar la diferencia de la imagen, pero la resta y el OR exclusivo son más precisos;
  2. La suma, la adición de peso y la imagen u operación se pueden usar para fusionar imágenes, pero debido a las diferencias en los métodos de operación y las diferencias, el efecto será diferente. El método que se elija para la fusión de diferentes imágenes está relacionado con los datos de la imagen y los objetivos de la aplicación;
  3. Tanto la multiplicación como la exponenciación de la imagen se pueden utilizar para ajustar el contraste de la imagen;
  4. La no operación y la operación XOR pueden mejorar el efecto visual de parte de la imagen;
  5. La multiplicación de imágenes y el bit AND se pueden utilizar para extraer la parte interesante de la imagen o blindar algunas partes La función en este sentido es la misma que el efecto de la máscara de imagen, pero la implementación es diferente;
  6. A través del procesamiento de umbral, la negación de la imagen y el procesamiento, se pueden extraer las características estructurales de la imagen.

Cuarto, un caso simple de operaciones bit a bit

La parte anterior de la explicación detallada de las funciones de operación de imágenes dio un ejemplo de funciones de suma, resta, multiplicación, división, suma de peso y funciones relacionadas con bits. el código se muestra a continuación:

import numpy as np
import cv2
def main():
    img1 = cv2.imread(r'F:\pic\shape1.png').astype(np.float32)
    img2 = cv2.imread(r'F:\pic\shape2.png')

    resultImgAnd = cv2.bitwise_and(img1, img2)
    resultImgOr = cv2.bitwise_or(img1, img2)
    resultImgXor = cv2.bitwise_xor(img1, img2)
    resultImgNot = cv2.bitwise_not(img1)
    resultImgXorScalar = cv2.bitwise_xor(img1, (255,255,255,255))

    cv2.imshow('img1',img1)
    cv2.imshow('img2', img2)
    cv2.imshow('resultImgAnd', resultImgAnd)
    cv2.imshow('resultImgOr', resultImgOr)
    cv2.imshow('resultImgXor', resultImgXor)
    cv2.imshow('resultImgNot', resultImgNot)
    cv2.imshow('resultImgXorScalar', resultImgXorScalar)
    cv2.waitKey(0)

main()

Ejecute la captura de pantalla de la imagen mostrada:
Inserte la descripción de la imagen aquí

V. Resumen

Este artículo presenta en detalle las funciones y sintaxis relacionadas con el logaritmo y la operación de bits de la suma, resta, multiplicación y división de imágenes de OpenCV-Python, y resume las funciones de funciones relacionadas. En OpenCV, las imágenes se almacenan como matrices, por lo que las operaciones de imagen son en realidad operaciones de matriz. Las operaciones de imágenes incluyen principalmente operaciones aritméticas básicas de imágenes, operaciones de ponderación de imágenes (también llamadas fusión de imágenes) y operaciones bit a bit. Estas operaciones se pueden realizar directamente a través de matrices numpy, o mediante los métodos dedicados de opencv, pero las operaciones matriciales de opencv son operaciones saturadas y sus resultados son mejores que las operaciones matriciales puras.

Si crees que este artículo puede ser útil para ti, por favor ayúdame a dar me gusta y agregar un favorito, ¡gracias!

Para obtener más información sobre OpenCV-Python, consulte la columna "Procesamiento de imágenes de gráficos OpenCV-Python"
URL de la columna : https://blog.csdn.net/laoyuanpython/category_9979286.html

Columna pagada sobre el viejo simio

La columna de pago de Lao Yuan "Uso de PyQt para desarrollar aplicaciones de interfaz gráfica Python" ( https://blog.csdn.net/laoyuanpython/category_9607725.html ) presenta específicamente el tutorial básico de desarrollo de interfaz gráfica PyQt basado en Python, columna de pago "desarrollo de audio y video de película Column "( https://blog.csdn.net/laoyuanpython/category_10232926.html ) presenta en detalle los métodos relacionados de edición y síntesis de audio y video de Moviepy y el uso de métodos relacionados para procesar escenas de edición y síntesis relacionadas. Ambas columnas son adecuadas para ciertas Aprenderán los lectores novatos que tengan un Python básico pero que no tengan conocimientos relevantes.

Directorio de artículos de columnas pagadas : "directorio de artículos de columnas de desarrollo de audio y video de moviepy" ( https://blog.csdn.net/LaoYuanPython/article/details/107574583 ), "Use PyQt para desarrollar la interfaz gráfica del directorio de columnas de aplicaciones Python" ( https: // blog.csdn.net/LaoYuanPython/article/details/107580932 ).

Para aquellos que carecen de la base de Python, pueden aprender Python desde cero a través de la columna gratuita de Lao Yuan "Columna: Directorio de tutoriales básicos de Python" ( https://blog.csdn.net/laoyuanpython/category_9831699.html ).

Si está interesado y dispuesto a apoyar a los lectores de Old Ape, bienvenido a comprar columnas pagas.

¡Aprenda Python y OpenCV del viejo simio!

Vaya al directorio de publicaciones del blog de LaoYuanPython https://blog.csdn.net/LaoYuanPython .

Supongo que te gusta

Origin blog.csdn.net/LaoYuanPython/article/details/108879397
Recomendado
Clasificación