使用 Canny edge 创建蒙版 - 更新
Posted
技术标签:
【中文标题】使用 Canny edge 创建蒙版 - 更新【英文标题】:Using Canny edge to create a mask - updated 【发布时间】:2017-09-04 19:19:01 【问题描述】:我想在提供的图片中找到卷心菜。我已经有一个使用颜色阈值的前一个问题的实现,但是它需要我手动输入 HSV 或 RGB 值,我需要一种自适应的控制方式,并考虑使用精明的边缘来查找边缘,然后创建一个蒙版。
下面是 color thesholding 的实现,它是 canny 所需的输出。
# Import the necessary packages
import numpy as np
import argparse
import cv2
import glob
def auto_canny(image, sigma=0.33):
# compute the median of the single channel pixel intensities
v = np.median(image)
# apply automatic Canny edge detection using the computed median
lower = int(max(0, (1.0 - sigma) * v))
upper = int(min(255, (1.0 + sigma) * v))
edged = cv2.Canny(image, lower, upper)
# return the edged image
return edged
# Construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required = True,
help = "Path to the image")
args = vars(ap.parse_args())
image = cv2.imread(args["image"])
cv2.imshow("Image", image)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (3, 3), 0)
auto = auto_canny(blurred)
cv2.imshow("Image", auto)
cv2.imwrite("newimage1.jpg", auto)
(_, cnts, _) = cv2.findContours(auto.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
if len(cnts) > 0:
# sort the contours and find the largest one -- we
# will assume this contour correspondes to the area
# of my phone
cnt = sorted(cnts, key = cv2.contourArea, reverse = True)[0]
cv2.drawContours(image, [cnt], -1, (0, 255, 0), 2)
cv2.imshow("Tracking", image)
cv2.imwrite("newimage2.jpg", image)
cv2.waitKey(0)
cv2.waitKey(0)
结果:
我的想法是使用 canny 找到边缘,然后使用 findcontours 获得最大的轮廓并创建一个应该是卷心菜的蒙版。但是,这似乎不起作用,因为精明输出的结果有很多边缘。
我认为我应该在应用精明边缘检测之前进行一些预处理,但我不太确定应用哪些技术进行预处理。
编辑:
阅读了一些建议并尝试了那些我知道该怎么做的建议,首先我将其转换为 HSV 并将图像拆分为相应的 H、s 和 v。实现了 2 种方法,结果如下,任何建议如何改进?
# Import the necessary packages
import numpy as np
import argparse
import cv2
import glob
def auto_canny(image, sigma=0.33):
# compute the median of the single channel pixel intensities
v = np.median(image)
# apply automatic Canny edge detection using the computed median
lower = int(max(0, (1.0 - sigma) * v))
upper = int(min(255, (1.0 + sigma) * v))
edged = cv2.Canny(image, lower, upper)
# return the edged image
return edged
# Construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required = True,
help = "Path to the image")
args = vars(ap.parse_args())
image = cv2.imread(args["image"])
cv2.imshow("Image", image)
newImage = image.copy()
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
blurred = cv2.GaussianBlur(hsv, (3, 3), 0)
#cv2.imshow("HSV image", blurred)
#now to seperate and only extract hue image
h,s,v = cv2.split(blurred)
cv2.imshow("H", h)
#cv2.imshow("S", s)
#cv2.imshow("V", v)
thresh = cv2.adaptiveThreshold(h, 255,
cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 11, 4)
cv2.imshow("adaptive1", thresh)
cv2.imwrite("adaptive1.jpg", thresh)
(_, cnts, _) = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
auto = auto_canny(h)
cv2.imshow("canny", auto)
cv2.imwrite("canny1.jpg", auto)
(_, cnts2, _) = cv2.findContours(auto.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
if len(cnts) > 0:
# sort the contours and find the largest one -- we
# will assume this contour correspondes to the area
# of my phone
cnt = sorted(cnts, key = cv2.contourArea, reverse = True)[0]
cv2.drawContours(image, [cnt], -1, (0, 255, 0), 2)
cv2.imshow("adaptive2", image)
cv2.imwrite("adaptive2.jpg", image)
if len(cnts2) > 0:
# sort the contours and find the largest one -- we
# will assume this contour correspondes to the area
# of my phone
cnt = sorted(cnts2, key = cv2.contourArea, reverse = True)[0]
cv2.drawContours(newImage, [cnt], -1, (0, 255, 0), 2)
cv2.imshow("canny2", newImage)
cv2.imwrite("canny2.jpg", newImage)
cv2.waitKey(0)
自适应:
坎尼:
【问题讨论】:
看起来像是抓取算法的案例 尝试使用 HSV 彩色图像作为基础,如:***.com/questions/29156091/… @AndreyKamaev 我假设你在谈论类似this 的东西。这与深度学习方法相比如何? IE。 this最近的细分工作 【参考方案1】:您还可以在颜色空间中设置图像的 3d 直方图,如果您知道目标是场景中的主要对象,您可以通过算法设置围绕主要颜色空间(聚类)的边界,然后使用它进行分段。这可能是我想要的。
【讨论】:
【参考方案2】:不要转换为灰度,转换为一些HSV colorspace 并尝试分割出绿色对象。
使用adaptiveThreshold而不是canny,它可以很好地在本地找到最佳边缘水平
【讨论】:
以上是关于使用 Canny edge 创建蒙版 - 更新的主要内容,如果未能解决你的问题,请参考以下文章
数字图像分析基于Python实现 Canny Edge Detection(Canny 边缘检测算法)
Python 2.7:Canny Edge detection TypeError(“图像数据无法转换为浮点数”)中的错误
Canny,先Scharr得梯度再Canny,三通道黑色背景展示结果(OpenCV案例源码edge.cpp)
Arm Compute Library - Canny Edge 从导入的 opencv 图像返回不可用的数据