opencv foundation 48 - dibuja el contorno de la imagen y corta el ejemplo - cv2.drawContours()

Dibujo de contornos de imagen: función drawContours

En OpenCV, los contornos de la imagen se pueden dibujar usando la función cv2.drawContours(). La sintaxis de esta función es:

image=cv2.drawContours( imagen, contornos, contornoIdx, color[,
grosor[, tipo de línea[, jerarquía[, maxLevel[, desplazamiento]]]]] )

Entre ellos, el valor de retorno de la función es imagen, que representa la imagen de destino, es decir, la imagen original con el borde dibujado.
Esta función tiene los siguientes parámetros:

  1. imagen: La imagen para dibujar el contorno. Cabe señalar que la función cv2.drawContours() dibujará directamente el contorno en la imagen de la imagen. Es decir, después de ejecutar la función, la imagen ya no es la imagen original, sino la imagen que contiene el contorno. Por lo tanto, si la imagen de la imagen tiene otros usos, debe hacer una copia por adelantado y pasar la imagen copiada a la función cv2.drawContours() para su uso.

  2. contornos: los contornos a dibujar. El tipo de este parámetro es el mismo que los contornos de salida de la función cv2.findContours(), los cuales son tipos de lista.

  3. contourIdx: el índice del borde que se va a dibujar, que le dice a la función cv2.drawContours() si dibujar un contorno determinado o todos los contornos. Si el parámetro es un número entero o cero, significa dibujar el contorno correspondiente al número de índice; si el valor
    es negativo (generalmente "-1"), significa dibujar todos los contornos.

  4. color: el color a dibujar, expresado en formato BGR.

  5. grosor: un parámetro opcional, que indica el grosor del pincel utilizado al dibujar el contorno. Si el valor se establece en "-1", significa
    dibujar un contorno sólido.

  6. lineType: parámetro opcional, que indica el tipo de línea utilizada al dibujar el contorno.

  7. jerarquía: corresponde a la salida de información jerárquica por la función cv2.findContours().

  8. maxLevel: controla la profundidad de la jerarquía del contorno dibujado. Si el valor es 0, significa que solo se dibuja el contorno de la capa 0; si el valor son otros números positivos distintos de cero, significa que se dibuja el contorno del nivel más alto y el mismo número de niveles por debajo.

  9. desplazamiento: parámetro de desplazamiento. Este parámetro desplaza el contorno a una posición diferente para la visualización.

La imagen del parámetro y la imagen del valor de retorno de la función cv2.drawContours() tienen el mismo valor después de la operación de la función. Por lo tanto, la función cv2.drawContours() también se puede escribir en forma de valor sin retorno:

cv2.drawContours( imagen, contornos, contornoIdx, color[, grosor[,
tipo de línea[, jerarquía[, maxLevel[, desplazamiento]]]]] )

Ejemplo de código: dibujar todos los contornos de una imagen.

Si desea dibujar todos los contornos de la imagen, debe establecer el valor del parámetro contourIdx de la función cv2.drawContours() en "-1". El código descargable en la sección anterior de
la imagen experimental original es el siguiente:

import cv2
o = cv2.imread('contours.bmp')
cv2.imshow("original",o)
#将原图像转换为灰度图像
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
#将灰度图像转换为二值图像
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
#寻找轮廓,返回的contours是轮廓的列表,hierarchy是每个轮廓对应的属性
contours, hierarchy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
#绘制轮廓,contours是轮廓的列表,-1表示绘制所有轮廓,(0,0,255)表示轮廓颜色为红色,5表示轮廓宽度为5
o=cv2.drawContours(o,contours,-1,(0,0,255),5)
cv2.imshow("result",o)
cv2.waitKey()
cv2.destroyAllWindows()

El efecto de ejecución es el siguiente:

inserte la descripción de la imagen aquí
En este programa, el color del contorno se establece en rojo (debido a la impresión en blanco y negro, se muestra en gris en los libros de papel), es decir, (0, 0, 255
) y el parámetro grosor (el grosor de la línea de contorno) se establece en " 5".

Ejemplo 2 Cortar la información de los bordes de una imagen uno por uno.

import cv2
import numpy as np
o = cv2.imread('contours.bmp')
#显示原始图像
cv2.imshow("original",o)
#将原图像转换为灰度图像
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
#将灰度图像转换为二值图像
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
#寻找轮廓,返回的contours是轮廓的列表,hierarchy是每个轮廓对应的属性
contours, hierarchy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
#获取轮廓的数量
n=len(contours)
#对每个轮廓进行绘制
contoursImg=[]
for i in range(n):
    #创建空白画布
 temp=np.zeros(o.shape,np.uint8)
 contoursImg.append(temp)
 #绘制轮廓,contours是轮廓的列表,i表示绘制第i个轮廓,(255,255,255)表示轮廓颜色为白色,5表示轮廓宽度为5
 contoursImg[i]=cv2.drawContours(contoursImg[i],contours,i,(255,255,255),5)
 cv2.imshow("contours[" + str(i)+"]",contoursImg[i])
cv2.waitKey()
cv2.destroyAllWindows()

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Ejemplo 3: uso de la función de dibujo de contornos para extraer objetos en primer plano.

Establezca el valor del parámetro grosor de la función cv2.drawContours() en "-1" para dibujar el contorno sólido del objeto en primer plano. El objeto de primer plano se puede extraer de la imagen original realizando una operación "Y bit a bit" en el contorno sólido y la imagen original.

el código se muestra a continuación:

import cv2
import numpy as np
o = cv2.imread('loc3.jpg')
cv2.imshow("original",o)
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
#创建空白画布
mask=np.zeros(o.shape,np.uint8)
#绘制轮廓,contours是轮廓的列表,-1表示绘制所有轮廓,(255,255,255)表示轮廓颜色为白色,-1表示轮廓宽度为-1,表示对轮廓进行填充
mask=cv2.drawContours(mask,contours,-1,(255,255,255),-1)
#显示掩膜
cv2.imshow("mask" ,mask)
#将原图像和掩膜进行位运算
loc=cv2.bitwise_and(o,mask)
cv2.imshow("location" ,loc)
cv2.waitKey()
cv2.destroyAllWindows()

En este ejemplo, el grosor del parámetro de la función cv2.drawContours() se establece en "-1", y se obtiene la máscara de contorno sólido del objeto en primer plano
. A continuación, utilice la declaración "cv2.bitwise_and(o, mask)" para realizar la operación "bitwise AND" en la imagen original o y la máscara de contorno sólido
para obtener el objeto de primer plano de la imagen original.

resultado de la operación:

  • La imagen de la izquierda es la imagen original con una pequeña flor como objeto de primer plano.
  • La imagen del medio es el contorno sólido del florete obtenido de la imagen original.
  • La imagen de la derecha es el florete del objeto de primer plano extraído.
    inserte la descripción de la imagen aquí
    inserte la descripción de la imagen aquí

La imagen original del experimento.
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/hai411741962/article/details/132169044
Recomendado
Clasificación