Tabla de contenido
1.Área de retorno de la inversión
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:
-
src
: La imagen original, es decir, la imagen que se va a rellenar con bordes. -
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. -
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.
-
value
:borderType=cv2.BORDER_CONSTANT
Só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. Representasrc1
la 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. Representasrc2
la 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()