opencv learning six: ROI y relleno de inundaciones

Qué es el ROI:
ROI (región de interés), que es la región de interés, si establece el ROI de la imagen, entonces, al usar las funciones de OpenCV, solo operará en la región de ROI e ignorará otras regiones

1. Corte y fusión de imágenes

El principio es obtener o fusionar las imágenes en la posición especificada operando la matriz de imágenes. El
código es el siguiente:

import cv2 as cv
import numpy as np

src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/lena.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)

face = src[100:200, 100:200] #高度 宽度
cv.imshow("face", face) #显示截取到的面部
gray = cv.cvtColor(face, cv.COLOR_BGR2GRAY) #把截取到的面部进行灰值处理
cv.imshow("face2", gray) #显示灰值处理后的面部
backface = cv.cvtColor(gray, cv.COLOR_GRAY2BGR) #将灰值的面部转换为BGR格式
cv.imshow("face3", backface)
src[100:200, 100:200] = backface #把已经转换为BGR格式的面部填充到原来的图像中
cv.imshow("face4", src)
print(src.shape)
cv.waitKey(0)
cv.destroyAllWindows()  #释放所有的内存

Ejecutar captura de pantalla:

Inserte la descripción de la imagen aquíSe encontró un problema durante el funcionamiento de la función cv.COLOR_GRAY2BGR. Pensé que la imagen se volvería colorida después de la conversión BGR, pero el resultado de salida sigue siendo gris. ¿Qué está pasando?
Respuesta: El
gris es un solo canal, la restauración solo se puede restaurar en tres canales, el color permanece sin cambios y sigue siendo gris. (Aluvión de fuentes) La
imagen en escala de grises se convierte en una imagen en color. No sé la relación proporcional entre RGB y la escala de grises. Solo puedo establecer un poco R = G = B = escala de grises;
incluso si la conversión es exitosa, se ve gris.

O no quiere lidiar con imágenes que se cortan y fusionan directamente de forma violenta, el código es el siguiente:

import cv2 as cv
import numpy as np
 
 
#截取图片中的指定区域或在指定区域添加某一图片
def jie_image(src1):
    src2 = src1[5:89, 500:630]#截取第5行到89行的第500列到630列的区域
    cv.imshow("jiequ", src2)
    src1[105:189, 300:430] = src2#指定位置填充,大小要一样才能填充
    cv.imshow("hecheng", src1)
 
src = cv.imread("C://1.jpg")
cv.imshow("image", src)
jie_image(src)
cv.waitKey(0)
cv.destroyAllWindows()

¿Cómo determinar la posición del avatar a interceptar?
El portal está aquí: use Python para realizar la salida de coordenadas de los marcadores de imagen

Dos, función de llenado floodFill

¡Este blog es genial! ROI y expansión de inundaciones

2.1 llenado FLOODFILL_FIXED_RANGE

el código se muestra a continuación:

import cv2 as cv
import numpy as np


def fill_color_demo(image):
    copyImg = image.copy()#复制原图像,不复制原图会修改原图
    h, w = image.shape[:2]#读取图像的高和宽
    mask = np.zeros([h+2, w+2], np.uint8)#新建图像矩阵  +2是官方函数要求
    cv.floodFill(copyImg, mask, (30, 30), (0, 255, 255), (100, 100, 100), (50, 50, 50), cv.FLOODFILL_FIXED_RANGE)#(30, 30)代表起始点;(0, 255, 255)代表填充颜色;loDiff=(100, 100, 100)代表只能填充比填充颜色小对应数值的点,upDiff同理
    cv.imshow("fill_color_demo", copyImg)


src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/lena.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
fill_color_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()  #释放所有的内存

Procesamiento de imágenes Python + OpenCV (3) -Imagen de manipulación de matrices Numpy
Ejecutar captura de pantalla:
Inserte la descripción de la imagen aquíCuando estaba aprendiendo OpenCV, encontré una función floodFill () que estaba un poco desconcertada, así que la grabaré aquí.
Permítanme hablar sobre sus parámetros
floorFill (imagen, máscara, seedPoint, newVal, loDiff, upDiff, banderas)

parámetro Descripción
imagen Objeto de procesamiento
máscara Máscara (explicado más adelante)
seedPoint Punto de partida de llenado
newVal Color de relleno
loDiff La diferencia del píxel de límite inferior al llenar
upDiff La diferencia del píxel del límite superior al llenar
banderas Método de llenado: FLOODFILL_FIXED_RANGE y FLOODFILL_MASK_ONLY

Donde no entiendo, el punto de partida del llenado es diferente, el seedPoint es diferente. ¿Cómo ves la posición de llenado? Las siguientes 4 imágenes son (30, 30) (80, 80) (100, 100) (150 , 150)

Puntos clave adicionales: cv2.floodFill (img, mask, seed, newvalue (B, G, R), (loDiff1, loDiff2, loDiff3), (upDiff1, upDiff2, upDiff3), flag)
img: imagen a procesar
máscara: general configuración Es una matriz del canal 1 con una relación de aspecto de 2 mayor que img, en la que el área que debe procesarse se establece en 0, y el área que no necesita procesarse se establece en 1
semilla: píxel inicial
newvalue: el color a rellenar
loDiff y upDiff: necesitan ser procesados ​​Píxeles similares al color de la semilla, es decir, establezca el píxel de la semilla como (B0, G0, R0). Si el valor del píxel que se va a procesar está entre (B0-loDiff, G-LoDiff, B-loDiff) a (B0 + upDiff, G0 + upDiff, R0 + upDiff), complete la
bandera de nuevo valor: cv.FLOODFILL_FIXED_RANGE: especificar relleno de color

Inserte la descripción de la imagen aquí

2.2 llenado FLOODFILL_MASK_ONLY

el código se muestra a continuación:

import cv2 as cv
import numpy as np

def fill_binary(image):
    image = np.zeros([400, 400, 3], np.uint8) #将所有像素点的各通道数值赋0,全黑
    image[100:300, 100:300, :] = 255 #把这个区域的彩色图颜色修改为白色
    cv.imshow("fill_binary", image)
    mask = np.ones([402, 402, 1], np.uint8) #二值图像mask是单通道,需要指定1。将mask设为1
    mask[100:301, 100:301] = 0 #选择白色区域,将填充的区域设为0,和mask相反
    cv.floodFill(image, mask, (200, 200), (0, 0, 255), cv.FLOODFILL_MASK_ONLY)
    cv.imshow("filled_binary", image)

src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/lena.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
fill_binary(src)
cv.waitKey(0)
cv.destroyAllWindows()  #释放所有的内存

mask = np.ones ([402, 402, 1], np.uint8) #
mask [101: 301, 101: 301] = 0 #
Padded es el punto que no es 1 en la imagen, por lo que debemos completar El área se designa como 0
(200, 200) como punto inicial, y elegí el punto central.
(100, 2, 255): Color
cv.FLOODFILL_MASK_ONLY: Complete la posición especificada.
Ejecute la captura de pantalla: No
Inserte la descripción de la imagen aquí
entendí este paso en ese momento, por qué escribirlo así.
image[100:300, 100:300, :] = 255 #把这个区域的彩色图颜色修改成黑色
Luego leí la información sobre la nota de estudio 3 de opencv: Procesamiento de píxeles , creo que es mejor

image[100:300, 100:300] = [255, 255, 255]

Artículo de referencia: OpenCV flood fill floodFill () explicación detallada
La dirección del video de esta sección: https://www.bilibili.com/video/BV1QW411F7e7?p=8

Supongo que te gusta

Origin blog.csdn.net/weixin_44145452/article/details/112440975
Recomendado
Clasificación