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
Identifica los bordes de tu imagen.
Binariza la imagen mediante umbral automático.
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)
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í:
- 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)