Basado en combate real OpenCV (conocimientos básicos 2)

Tabla de contenido

Introducción

1.Área de retorno de la inversión

2.Relleno de límites

3. Cálculo numérico

4.Fusión de imágenes


Introducción

OpenCV es una popular biblioteca de visión por computadora de código abierto desarrollada por Intel Corporation. Proporciona más de 2500 algoritmos de optimización y muchos conjuntos de herramientas para procesamiento de imágenes y aplicaciones de visión por computadora, como escala de grises, color, profundidad, seguimiento de movimiento y basado en funciones. OpenCV está escrito principalmente en lenguaje C++, pero también es compatible con Python, Java, C y otros lenguajes. Debido a su código abierto y sus características ampliamente utilizadas, se ha utilizado ampliamente en los campos de la visión por computadora y el aprendizaje automático.

1.Área de retorno de la inversión

Interceptar el área de interés: en una imagen, es posible que solo necesitemos una parte, entonces, ¿cómo interceptamos esta parte?

En el artículo anterior mencionamos que la esencia de una imagen se puede representar mediante un conjunto de matrices.

Entonces, ¿podemos utilizar el corte para seleccionar el área que queremos?

import cv2

image = cv2.imread('image/1.jpg')
cat = image[250:500, 250:500]
cv2.imshow('IMG', cat)
cv2.waitKey(0)
cv2.destroyAllWindows()

Sabemos que una imagen es un conjunto de datos tridimensionales, dado que cortamos en un plano para obtener el área que queremos, ¿podemos segmentar sus canales?

import cv2
import numpy as np

image = cv2.imread('image/1.jpg')


# cat = image[250:500, 250:500]
# cv2.imshow('IMG', cat)
b,g,r = cv2.split(image)
cat = np.hstack((b,g,r))
cv2.imshow('IMG',cat)


cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.split()Es una función en OpenCV que se utiliza para dividir imágenes multicanal en imágenes individuales de un solo canal.

¿Por qué son todas grises? Porque las imágenes extraídas son esencialmente de un solo canal.

Entonces, ¿qué debo hacer si quiero la imagen roja?

La primera idea: extraiga los tres canales por separado, luego cree una matriz vacía similar a los datos de la imagen y finalmente rellénela con el canal que desee.

La segunda idea: volver a copiar los valores de los otros dos canales a 0, manteniendo solo el canal de color deseado.

import cv2
import numpy as np

image = cv2.imread('image/1.jpg')

img = image.copy()
b, g, r = cv2.split(img)
arr = np.zeros_like(image)
arr[:, :, 2] = r
print(arr)
cv2.imshow('IMG',arr)
cv2.waitKey(0)
cv2.destroyAllWindows()

import cv2

image = cv2.imread('image/1.jpg')

img = image.copy()
img[:,:,0] = 0
img[:,:,1] = 0


cv2.imshow('IMG', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

2.Relleno de límites

En el procesamiento de imágenes, los métodos de relleno de límites más utilizados son los siguientes:

Relleno constante: rellena el borde con un valor de píxel fijo. Se puede implementar mediante cv2.copyMakeBorder()funciones y especificar borderType=cv2.BORDER_CONSTANT.

Replicar relleno: copia el valor del píxel del borde al borde de la imagen. Se puede implementar mediante cv2.copyMakeBorder()funciones y especificar borderType=cv2.BORDER_REPLICATE.

Reflejar relleno: rellene los valores de píxeles del límite de forma reflejada. Se puede implementar mediante cv2.copyMakeBorder()funciones y especificar borderType=cv2.BORDER_REFLECT.

import cv2
import numpy as np

image = cv2.imread('image/1.jpg')
top_size, bottom_size, left_size, right_size = (50, 50, 50, 50)

replicate = cv2.copyMakeBorder(image, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(image, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT)
constant = cv2.copyMakeBorder(image, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_CONSTANT,
                              value=0)
# print(image)
#
result = np.hstack((constant,reflect, replicate))

cv2.imshow('IMG', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

Cuando se utilizan cv2.copyMakeBorder()funciones para rellenar límites, hay varios parámetros que deben comprenderse y configurarse:

  1. src: La imagen original, es decir, la imagen que se va a rellenar con bordes.

  2. top, bottom, left, right: Especifique el tamaño de los bordes que se agregarán arriba, abajo, izquierda y derecha de la imagen. Puede establecer un tamaño diferente para cada límite individualmente o puede establecerlos en el mismo valor.

  3. borderType: Especifique el método de relleno de límites. Las opciones de parámetros comúnmente utilizadas incluyen:

    • cv2.BORDER_CONSTANT: Relleno constante, utiliza un valor de píxel fijo para rellenar el límite.
    • cv2.BORDER_REPLICATE: Copiar relleno, copiar el valor del píxel del borde al borde de la imagen.
    • cv2.BORDER_REFLECT: Relleno de reflexión, rellenando los valores de píxeles del límite de forma reflejada.
    • cv2.BORDER_WRAP: Copiar relleno de borde, copiar el borde horizontal o vertical de la imagen al borde correspondiente.
  4. value: borderType=cv2.BORDER_CONSTANTSólo para casos, especifica el valor constante que se utilizará para rellenar el límite. Puede ser un escalar (un valor numérico único) o una tupla que contiene valores numéricos que coinciden con el número de canales de imagen.

3. Cálculo numérico

El primero es la suma en el nivel numpy. ps tomará automáticamente el resto de 255 si el valor excede 255.

import cv2
import numpy as np

image1 = cv2.imread('image/car.jpg')
image2 = cv2.imread('image/circle.jpg')

# img = np.array(image1)
image1_1= image1 + 10

print(np.array(image1[:5,:,0]))
print(np.array(image1_1[0:5,:,0]))

La segunda es la función proporcionada por opencv.

cv2.add(image1,image2) debe garantizar que el tamaño de las imágenes sea el mismo

import cv2
import numpy as np

image1 = cv2.imread('image/car.jpg')
image2 = cv2.imread('image/circle.jpg')
if image1.shape != image2.shape:
    image2 = cv2.resize(image2, (image1.shape[1], image1.shape[0]))
# img = np.array(image1)
image1_1 = image1 + 10
result = cv2.add(image1 ,image2)
print(np.array(image1[:5, :, 0]))
print(np.array(result[:5, :, 0]))

 A diferencia de numpy, su valor no excederá 255

4.Fusión de imágenes

cv2.addWeighted()La función es la función utilizada para la fusión de imágenes en OpenCV.

La sintaxis de la función es la siguiente:

dst = cv2.addWeighted(src1, alpha, src2, beta, gamma)
  • src1: La primera imagen de entrada que se fusionará.

  • alpha: El coeficiente de peso de la primera imagen de entrada. Representa src1la proporción de la imagen en el resultado de la fusión.

  • src2: La segunda imagen de entrada que se fusionará.

  • beta: El coeficiente de peso de la segunda imagen de entrada. Representa src2la proporción de la imagen en el resultado de la fusión.

  • gamma:Parámetro de ajuste de brillo. Es un parámetro opcional que se utiliza para ajustar aún más el brillo del resultado de la fusión.

  • Lo primero que hay que tener en cuenta es que las formas de las dos imágenes a fusionar deben ser coherentes, de lo contrario no se podrán fusionar.

Como sigue

import cv2

image1 = cv2.imread('image/1.jpg')
image2 = cv2.imread('image/lena.jpg')

blended_image = cv2.addWeighted(image1, 0.6, image2, 0.4, 0)

cv2.imshow('IMG', blended_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Entonces, antes de fusionar, debemos configurar la forma de la imagen para que sea consistente.

import cv2

image1 = cv2.imread('image/1.jpg')
image2 = cv2.imread('image/lena.jpg')
# 调整两个图像的大小以保持一致

image1 = cv2.resize(image1, (500, 500))
image2 = cv2.resize(image2, (500, 500))

blended_image = cv2.addWeighted(image1, 0.6, image2, 0.4, 0)

cv2.imshow('IMG', blended_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

Supongo que te gusta

Origin blog.csdn.net/weixin_45303602/article/details/132462238
Recomendado
Clasificación