Выделение объектов и получение цветовой гистограммы
Я работаю над извлечением функции обработки изображений. У меня есть фотография птицы, в которой я должен извлечь птицу и рассказать, какой цвет у птицы. Я использовал метод извлечения полезных функций, чтобы получить края птицы.
Как извлечь только область птиц и сделать фон синим цветом?
Решение openCv также должно быть прекрасным.
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)
from skimage import feature
edges = feature.canny(bird,sigma=1)
plt.imshow(edges )
Фактическое изображение птицы можно взять с птичьей ссылки
Ответы
Ответ 1
-
Определите края вашего изображения
-
Binarize изображение через автоматическое пороговое значение
-
Используйте определение контура для определения черных областей, находящихся внутри белого региона, и объедините их с белой областью. (Макет, изображение может немного изменяться)
-
Используйте созданное изображение в качестве маски, чтобы покрасить фон и покрасить его . Это можно сделать, просто установив каждый фоновый пиксель (черный) на соответствующий цвет.
Как вы можете видеть, подход далеко не идеальный, но должен дать вам общее представление о том, как выполнить свою задачу. Конечное качество изображения может быть улучшено путем незначительного размывания карты, чтобы затянуть ее до контуров птицы. Затем вы также используете маску для вычисления гистограммы цвета, только принимая во внимание пиксели переднего плана. Редактировать: Смотрите здесь:
- Разрушенная маска
- Окончательное изображение
Ответ 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)