guia español descargar python opencv image-processing scikit-learn scikit-image

python - español - Extracción de características y histograma de color de toma.



qgis español (2)

Estoy trabajando en una extracción de características de procesamiento de imágenes. Tengo una foto de un ave en la que tengo que extraer el área y decir qué color tiene el ave. Utilicé un método de extracción de características para obtener los bordes de un ave.

¿Cómo extraer solo el área de las aves y hacer el fondo a color azul?

La solución openCv también debería estar bien.

import skimage import numpy as np %matplotlib inline import matplotlib.pyplot as plt import os filename = os.path.join(os.getcwd(),''image/image_bird.jpeg'') from skimage import io bird =io.imread(filename,as_grey=True) plt.imshow(bird)

from skimage import feature edges = feature.canny(bird,sigma=1) plt.imshow(edges )

La imagen real del pájaro se puede tomar del enlace del pájaro


  1. Identifica los bordes de tu imagen.

  2. Binariza la imagen mediante umbral automático.

  3. Utilice la detección de contornos para identificar las regiones negras que están dentro de una región blanca y fusionarlas con la región blanca. (Maqueta, la imagen puede variar ligeramente)

  4. Usa la imagen creada como máscara para colorear el fondo y colorearlo. Esto se puede hacer simplemente estableciendo cada píxel de fondo (negro) a su color respectivo.

Como puede ver, el enfoque está lejos de ser perfecto, pero debería darle una idea general sobre cómo llevar a cabo su tarea. La calidad final de la imagen podría mejorarse erosionando ligeramente el mapa para ajustarlo a los contornos del ave. Luego, también usa la máscara para calcular su histograma de color teniendo en cuenta únicamente los píxeles del primer plano. Editar: Mira aquí:

  1. Mascara erosionada

  1. Imagen final


Según este artículo https://www.pyimagesearch.com/2016/04/11/finding-extreme-points-in-contours-with-opencv/ y esta pregunta CV - Extraiga las diferencias entre dos imágenes

Escribí un código python como abajo. Como dijo mi predecesor, también está lejos de ser perfecto. Las principales desventajas de este código son las constantes que deben configurarse manualmente: minThres (50), maxThres (100), dilatar el recuento de iteraciones y erosionar el recuento de iteraciones.

import cv2 import numpy as np windowName = "Edges" pictureRaw = cv2.imread("bird.jpg") ## set to gray pictureGray = cv2.cvtColor(pictureRaw, cv2.COLOR_BGR2GRAY) ## blur pictureGaussian = cv2.GaussianBlur(pictureGray, (7,7), 0) ## canny edge detector - you must specify threshold values pictureCanny = cv2.Canny(pictureGaussian, 50, 100) ## perform a series of erosions + dilations to remove any small regions of noise pictureDilate = cv2.dilate(pictureCanny, None, iterations=20) pictureErode = cv2.erode(pictureDilate, None, iterations=5) ## find the nozero regions in the erode imask2 = pictureErode>0 ## create a Mat like pictureRaw canvas = np.full_like(pictureRaw, np.array([255,0,0]), dtype=np.uint8) ## set mask canvas[imask2] = pictureRaw[imask2] cv2.imwrite("result.png", canvas)