在Python中读取图像文件并计算Canny边缘过滤器

Sim*_*ger 1 python arrays numpy scikit-image canny-operator

我想使用Python读取图像文件并应用skimage的Canny边缘过滤器。但是我不知道用于特征计算的正确数组格式。那就是我所拥有的:

from PIL import Image
from skimage import feature

PATH = '/foo/bar.jpg'

import numpy
img = numpy.asarray(Image.open(PATH).convert('LA'))

# apply Canny Edge filters
edges1 = feature.canny(img)
edges2 = feature.canny(img, sigma=3)
Run Code Online (Sandbox Code Playgroud)

该功能调用会引发以下错误:“参数image必须为二维数组”。如何将numpy数组转换为必要的形式?

kma*_*o23 5

从问题的描述来看,您似乎正在处理RGB图像(即彩色图像)。对于此类图像,我们必须首先将其转换为灰度图像,然后才可以将它们传递给Canny Edge Detector,因为参数图像必须是2D数组

image:2D阵列
灰度输入图像以检测边缘;可以是任何dtype。

这是一个例子:

# load color image
In [12]: img_rgb = 'model.jpg'
In [13]: img_arr = np.array(Image.open(img_rgb), dtype=np.uint8)

In [14]: img_arr.shape
Out[14]: (1005, 740, 3)

# convert to grayscale image
In [15]: from skimage.color import rgb2gray
In [16]: img_gray = rgb2gray(img_arr)

In [17]: img_gray.shape
Out[17]: (1005, 740)

In [18]: edges1 = feature.canny(img_gray)
    ...: edges2 = feature.canny(img_gray, sigma=3)

In [19]: edges1.shape
Out[19]: (1005, 740)

In [20]: edges2.shape
Out[20]: (1005, 740)

# display    
In [21]: plt.imshow(edges1)
Run Code Online (Sandbox Code Playgroud)

我得到的结果如下图所示:

模特形象