Выделение объектов и получение цветовой гистограммы

Я работаю над извлечением функции обработки изображений. У меня есть фотография птицы, в которой я должен извлечь птицу и рассказать, какой цвет у птицы. Я использовал метод извлечения полезных функций, чтобы получить края птицы.

Как извлечь только область птиц и сделать фон синим цветом?

Решение openCv также должно быть прекрасным.

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

Фактическое изображение птицы можно взять с птичьей ссылки

Ответ 1

  1. Определите края вашего изображения Sobel edge map

  2. Binarize изображение через автоматическое пороговое значение binarized edge map

  3. Используйте определение контура для определения черных областей, находящихся внутри белого региона, и объедините их с белой областью. (Макет, изображение может немного изменяться) Mockup of the merged mask

  4. Используйте созданное изображение в качестве маски, чтобы покрасить фон и покрасить его final image. Это можно сделать, просто установив каждый фоновый пиксель (черный) на соответствующий цвет.

Как вы можете видеть, подход далеко не идеальный, но должен дать вам общее представление о том, как выполнить свою задачу. Конечное качество изображения может быть улучшено путем незначительного размывания карты, чтобы затянуть ее до контуров птицы. Затем вы также используете маску для вычисления гистограммы цвета, только принимая во внимание пиксели переднего плана. Редактировать: Смотрите здесь:

  1. Разрушенная маска

eroded mask

  1. Окончательное изображение

Final image with eroded mask

Ответ 2

Согласно этой статье https://www.pyimagesearch.com/2016/04/11/finding-extreme-points-in-contours-with-opencv/ и этот вопрос CV - Извлеките различия между двумя изображениями

Я написал код python, как показано ниже. Как сказал мой предшественник, он также далек от совершенства. Основными недостатками этого кода являются значения констант, заданные вручную: minThres (50), maxThres (100), увеличение итераций и уменьшение количества итераций.

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)