Извлечение признаков и получение цветовой гистограммы - PullRequest
0 голосов
/ 03 сентября 2018

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

Как выделить только птичий участок и сделать фон синим цветом?

решение 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

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

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Согласно этой статье 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)
0 голосов
/ 04 сентября 2018
  1. Определите края вашего изображения Sobel edge map

  2. Бинаризация изображения с помощью автоматической установки порога binarized edge map

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

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

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

  1. Эрозированная маска

eroded mask

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

Final image with eroded mask

...