特征提取和拍摄颜色直方图

Sum*_*eet 20 python opencv image-processing scikit-learn scikit-image

我正在进行图像处理特征提取.我有一张鸟的照片,我必须在那里提取鸟类区域并告诉它鸟的颜色.我使用canny特征提取方法来获取鸟的边缘.

如何只提取鸟类区域,使背景为蓝色?

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

from skimage import feature
edges = feature.canny(bird,sigma=1)
plt.imshow(edges )
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

实际鸟类图像可以从鸟类链接中获取

Sil*_*key 22

  1. 识别图像的边缘索贝尔边缘地图

  2. 通过自动阈值化对图像进行二值化二值化边缘图

  3. 使用轮廓检测识别白色区域内的黑色区域并将其与白色区域合并.(样机,图像可能略有不同)合并掩码的样机

  4. 使用创建的图像作为遮罩为背景着色并为其着色 最终形象 这可以通过简单地将每个背景像素(黑色)设置为其相应的颜色来完成.

正如您所看到的,这种方法远非完美,但应该让您对如何完成任务有一个大概的了解.通过略微侵蚀地图以将其收紧到鸟的轮廓,可以改善最终的图像质量.然后,您还可以使用蒙版来计算颜色直方图,只考虑前景像素.编辑:看这里:

  1. 被侵蚀的面具

被侵蚀的面具

  1. 最终图片

最终图像与侵蚀面具


ElC*_*ado 7

根据这篇文章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)
Run Code Online (Sandbox Code Playgroud)