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.

enter image description here

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)

enter image description here

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

enter image description here

image de l'oiseau réelle peut être prise de oiseau lien

19
demandé sur Sumeet 2018-09-03 20:14:10

2 réponses

  1. identifiez les bords imageSobel edge map

  2. Binarizez l'image par battage automatiquebinarized edge map

  3. 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) Mockup of the merged mask

  4. utilisez l'image créée comme masque pour colorer le fond et le colorier final image 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:

  1. masque Érodé

eroded mask

  1. image finale

Final image with eroded mask

21
répondu SilverMonkey 2018-09-06 16:58:44

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)
7
répondu ElConrado 2018-09-07 16:36:07