Fonction extraction et prise histogramme couleur
je travaille sur une extraction de fonction de traitement d'image. J'ai une photo d'un oiseau dans laquelle je dois extraire la zone de l'oiseau et dire de quelle couleur l'oiseau a. J'ai utilisé une méthode d'extraction rusée pour obtenir les bords d'un oiseau.
comment extraire seulement la zone de l'oiseau et faire le fond à la couleur bleue?
openCv solution doit également être fin.
import skimage
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
import os
filename = os.path.join(os.getcwd(),'imageimage_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 )
image de l'oiseau réelle peut être prise de oiseau lien
2 réponses
identifiez les bords image
Binarizez l'image par battage automatique
Utiliser détection de contour pour identifier les régions noires qui sont à l'intérieur d'une zone 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 le fond et le colorier Cela peut être fait simplement en définissant chaque pixel d'arrière-plan (noir) à sa couleur.
Comme vous pouvez le voir, l'approche est loin d'être parfait, mais devrait vous donner une idée générale sur 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 les contours de l'oiseau. Vous utilisez ensuite le masque pour calculer votre histogramme de couleur en ne prenant en compte que les pixels de premier plan. Edit: Regarde ici:
- image finale
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 l'a dit mon prédécesseur, elle est également loin d'être parfaite. Les principaux inconvénients de ce code sont les constantes à régler manuellement: minThres (50), maxThres(100), le nombre d'itérations dilatées et le nombre d'itérations d'érosion.
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)