Buffer 和 memoryview 在 python 中的同一维度中不连续

Buffer and memoryview are not contiguous in the same dimension in python

我是 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:

Buffer and memoryview are not contiguous in the same dimension.

我使用 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 函数中的参数以获得至少一些轮廓,则不会再引发错误。我认为此行为是一个错误(它应该只是 return 一个空列表),我将报告它。

以下是我可以 运行 无误的代码。 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 函数对于一些不那么 "crowded" 的边缘贴图来说非常慢。如果您遇到同样的问题,也许您需要某种工件清理(例如删除非常短的边)。

另一方面,skimage 版本 0.13.0 已经发布,使用库的最新版本总是好的 ;)

注意:此错误已在库的 0.14.x 版本中修复。