web-dev-qa-db-fra.com

Extraction de fonctionnalités et prise d'un histogramme de couleurs

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.

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(),'image\image_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

L'image réelle de l'oiseau peut être prise à partir de lien oisea

20
Sumeet
  1. Identifiez les bords de votre image Sobel Edge map

  2. Binariser l'image via seuillage automatique binarized Edge map

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

  4. Utilisez l'image créée comme masque pour colorer l'arrière-plan et coloriez-le final image 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:

  1. Masque érodé

eroded mask

  1. Image finale

Final image with eroded mask

22
SilverMonkey

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)
7
ElConrado