我是Python的新手,我试图在下图中检测到一个椭圆:https://i.stack.imgur.com/5ybMh.jpg
但是当我使用这段代码时:
import matplotlib.pyplot as plt
from skimage import io
from skimage import data, color, img_as_ubyte
from skimage.feature import canny
from skimage.transform import hough_ellipse
image_rgb = io.imread('5ybMh.jpg',)
image_gray = color.rgb2gray(image_rgb)
edges = canny(image_gray, sigma=2.0,
low_threshold=0.55, high_threshold=0.8)
result = hough_ellipse(edges, accuracy=20, threshold=250,
min_size=0, max_size=0)
result.sort(order='accumulator')
我得到了ValueError:
缓冲区和内存视图在同一维度上不是连续的。
我使用scikit-image版本0.12.3。我认为min_size = 0和max_size = 0存在问题,但我不确定这两个参数的错误是否存在上下文。在文档中,我找不到有关参数的非常有用的信息。 (http://scikit-image.org/docs/dev/api/skimage.transform.html?highlight=transform#skimage.transform.hough_ellipse)
那么任何人都可以解释这个错误意味着什么,如果我必须更改参数,它们应该具有哪个值?
我终于在你的代码中发现了这个问题! :)
使用您在图像的canny
函数中设置的参数,edges
图像为空! (全黑)
这似乎是hough_ellipse
函数的问题,您可以通过尝试运行以下内容来查看:
import numpy as np
from skimage.transform import hough_ellipse
result = hough_ellipse(np.zeros((100, 100)))
如果更改canny
函数中的参数以获得至少几个轮廓,则不再引发错误。我相信这种行为是一个错误(它应该只返回一个空列表),我将报告它。
以下是我可以无误地运行的代码。 Canny算法和椭圆的参数是随机获得的。
from skimage import io
from skimage import data, color
from skimage.feature import canny
from skimage.transform import hough_ellipse
image_rgb = io.imread('5ybMh.jpg',)
image_gray = color.rgb2gray(image_rgb)
edges = canny(image_gray, low_threshold=.4, high_threshold=.9)
result = hough_ellipse(edges, threshold=20, min_size=10)
在旁注中,我发现hough_ellipse
函数对于一些不那么“拥挤”的边缘地图来说非常慢。如果您遇到同样的问题,可能需要某种工件清理(例如删除非常短的边缘)。
在第二方面,skimage
版本0.13.0
已经出局,使用库的最新版本总是好的;)
注意:此错误在库的0.14.x
版本中得到修复。