Je travaille sur une extraction de fonctionnalité de traitement d'image. J'ai une photo d'un oiseau dans lequel je dois extraire la zone de l'oiseau et dire de quelle couleur l'oiseau a. J'ai utilisé une méthode d'extraction des fonctionnalités pour obtenir les bords d'un oiseau.
Comment extraire uniquement la zone des oiseaux et rendre l'arrière-plan de couleur bleue?
La solution openCv devrait également convenir.
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 )
L'image réelle de l'oiseau peut être prise à partir de lien oisea
Identifiez les bords de votre image
Binariser l'image via seuillage automatique
Utilisez détection de contour pour identifier les régions noires qui se trouvent à l'intérieur d'une région blanche et les fusionner avec la région blanche. (Maquette, l'image peut légèrement varier)
Utilisez l'image créée comme masque pour colorer l'arrière-plan et coloriez-le Pour ce faire, il suffit de définir chaque pixel d'arrière-plan (noir) sur sa couleur respective.
Comme vous pouvez le voir, l'approche est loin d'être parfaite, mais devrait vous donner une idée générale de la façon d'accomplir votre tâche. La qualité d'image finale pourrait être améliorée en érodant légèrement la carte pour la resserrer aux contours de l'oiseau. Vous utilisez ensuite également le masque pour calculer votre histogramme des couleurs en ne prenant en compte que les pixels de premier plan. Edit: Regardez ici:
Selon cet article https://www.pyimagesearch.com/2016/04/11/finding-extreme-points-in-contours-with-opencv/ et cette question CV - Extraire les différences entre deux images
J'ai écrit du code python comme ci-dessous. Comme mon prédécesseur l'a dit, il est également loin d'être parfait. Les principaux inconvénients de ce code sont les constantes de valeur à définir manuellement: minThres (50), maxThres (100) , dilater le nombre d'itérations et éroder le nombre d'itérations.
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)