[OpenCV-Python] 9 operaciones básicas de imágenes

OpenCV-Python: operaciones centrales

9 Operaciones básicas de imágenes

Objetivos
  • Obtener valores de píxeles y modificarlos
  • Obtener atributos de imagen (información)
  • ROI de imagen ()
  • División y fusión de canales de imagen
Casi todas estas operaciones tienen una relación más estrecha con Numpy que con OpenCV, por lo que puede familiarizarse con la ayuda de Numpy escribimos código de mejor rendimiento.
(Los ejemplos se mostrarán en la terminal de Python, porque la mayoría de ellos tienen solo una línea de código)

9.1 Obtener y modificar el valor de los píxeles

Primero necesitamos leer en una imagen:

import cv2
import numpy as np
img=cv2.imread('messi5.jpg')

Puede obtener el valor de píxel en función de las coordenadas de fila y columna del píxel. Para las imágenes BGR, el valor de retorno es el valor de B, G, R. Para imágenes en escala de grises, devolverá su valor de escala de grises (brillo? Intensidad)

import cv2
import numpy as np
img=cv2.imread('messi5.jpg')
px=img[100,100]
print(px)
blue=img[100,100,0]
print(blue)

Puede modificar el valor de los píxeles de forma similar.

import cv2
import numpy as np
img=cv2.imread('messi5.jpg')
img[100,100]=[255,255,255]
print(img[100,100])
# [255 255 255]

Advertencia: Numpy es un paquete de software optimizado para operaciones matriciales rápidas. Por lo tanto, no recomendamos obtener los valores de los píxeles uno por uno y modificarlos uno por uno. Esto será muy lento. No use bucles si puede tener operaciones matriciales.
Nota: El método mencionado anteriormente se utiliza para seleccionar una región de la matriz, por ejemplo, las primeras 5 filas y las últimas 3 columnas. Para obtener el valor de cada píxel, quizás sea mejor usar array.item () y array.itemset () de Numpy. Pero el valor de retorno es un escalar. Si desea obtener todos los
valores de B, G, R , debe usar array.item () para dividirlos.

Una mejor forma de obtener valores de píxeles y modificarlos.

import cv2
import numpy as np
img=cv2.imread('messi5.jpg')
print(img.item(10,10,2))
img.itemset((10,10,2),100)
print(img.item(10,10,2))

# 59

# 100

9.2 Obtener atributos de imagen

Los atributos de la imagen incluyen: fila, columna, canal, tipo de datos de la imagen, número de píxeles, etc. img.shape puede obtener la forma de la imagen. Su valor de retorno es una tupla que contiene el número de filas, columnas y canales.

import cv2
import numpy as np
img=cv2.imread('messi5.jpg')
print(img.shape)

#(342, 548, 3)

Nota: Si la imagen es una imagen en escala de grises, el valor de retorno es solo el número de filas y columnas. Entonces, al verificar este valor de retorno, puede saber si la imagen cargada es una imagen en escala de grises o una imagen en color.
img.size puede devolver el número de píxeles de la imagen:

import cv2
import numpy as np
img=cv2.imread('messi5.jpg')
print(img.size, img.dtype) # 返回的是图像的数据类型.

# 562248 uint8

# uint8*

Nota: img.dtype es muy importante al depurar. Porque a menudo hay inconsistencias en los tipos de datos en el código Python de OpenCV.

9.3 ROI de la imagen

A veces es necesario operar en un área específica de una imagen. Por ejemplo, si queremos detectar la posición de los ojos en una imagen, primero debemos buscar el rostro en la imagen y luego buscar los ojos en el área del rostro, en lugar de buscar directamente en una imagen. Esto mejorará la precisión y el rendimiento del programa.
El ROI también se obtiene mediante la indexación de Numpy. Ahora seleccionamos la parte de la bola y la copiamos a otras áreas de la imagen.

import cv2
import numpy as np
img=cv2.imread('messi5.jpg')
ball=img[280:340,330:390]
img[273:333,100:160]=ball
img=cv2.imshow('test', img)
cv2.waitKey(0)

Eche un vistazo a los resultados:

img

9.4 Dividir y fusionar canales de imágenes

A veces necesitamos operar los tres canales BGR por separado. Esto es lo que necesita para dividir el BGR en un solo canal. A veces es necesario fusionar las imágenes de canales independientes en una imagen BGR. Puedes hacerlo:

import cv2
import numpy as np
img=cv2.imread('/home/duan/workspace/opencv/images/roi.jpg')
b,g,r=cv2.split(img)
img=cv2.merge(b,g,r)

o:

import cv2
import numpy as np
img=cv2.imread('/home/duan/workspace/opencv/images/roi.jpg')
b=img[:,:,0]

Si desea que el valor del canal rojo de todos los píxeles sea 0, no es necesario dividir y luego asignar valores. Puede usar la indexación de Numpy directamente, que será más rápido.

import cv2
import numpy as np
img=cv2.imread('/home/duan/workspace/opencv/images/roi.jpg')
img[:,:,2]=0

Advertencia: cv2.split () es una operación que requiere mucho tiempo. Úselo solo cuando realmente lo necesite, e intente usarlo si puede usar la indexación Numpy.

9.5 Ampliación (relleno) de la imagen

Si desea crear un borde alrededor de la imagen, como un marco de fotos, puede usar la función cv2.copyMakeBorder (). Esto se usa a menudo en operaciones de convolución o relleno de ceros. Esta función incluye los siguientes parámetros:
  • imagen de entrada src
  • arriba, abajo, izquierda, derecha el número de píxeles correspondientes al borde.
  • borderType para agregar ese tipo de borde, el tipo es el siguiente:
    -cv2.BORDER_CONSTANT para agregar un borde de valor constante con un color, y se requiere el siguiente parámetro (valor).
    - Cv2.BORDER_REFLECT La imagen especular del elemento de límite. Por ejemplo: fedcba | abcde-fgh | hgfedcb
    - cv2.BORDER_REFLECT_101 o cv2.BORDER_DEFAULT es el mismo que el anterior, pero ligeramente modificado. Por ejemplo: gfedcb | abcdefgh | gfedcba
    - cv2.BORDER_REPLICATE repite el último elemento. Por ejemplo: aaaaaa | abcdefgh | hhhhhhh
    - cv2.BORDER_WRAP No sé qué decir, simplemente así: cdefgh | abcdefgh | abcdefg
  • valor del color del borde, si el tipo de borde es cv2.BORDER_CONSTANT

Para comprender mejor estos tipos, consulte el programa de demostración a continuación.

import cv2
import numpy as np
from matplotlib import pyplot as plt
BLUE=[255,0,0]
img1=cv2.imread('opencv_logo.png')
replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)
plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
plt.show()

Los resultados son los siguientes (dado que matplotlib se usa para dibujar, se intercambian las posiciones de R y B. En OpenCV, está organizado por BGR, y en matplotlib, está organizado por RGB):

img
Para obtener más información, preste atención a la cuenta oficial:
img

Supongo que te gusta

Origin blog.csdn.net/yegeli/article/details/113405701
Recomendado
Clasificación