利用prewitt_h提取边缘特征



我正在尝试提取这样的边缘特征:

img = io.imread('pic.jpg')
H, W, C = img.shape
features = custom_features(img)
assignments = kmeans_fast(features, num_segments)
segments = assignments.reshape((H, W))
# Display segmentation
plt.imshow(segments, cmap='viridis')
plt.axis('off')
plt.show()

custom_features:

from skimage.filters import prewitt_h,prewitt_v
def custom_features(image):
""" 
Args:
img - array of shape (H, W, C)
Returns:
features - array of (H * W, C)
"""
edges_prewitt_horizontal = prewitt_h(image)
return edges_prewitt_horizontal

然而,目前我遇到了一个错误,因为图像的形状与prewitt_h函数所期望的不同。

ValueError: The parameter `image` must be a 2-dimensional array

如何在函数中修改此项,使返回的形状符合要求?

看起来你需要给prewitt一个灰度图像。prewitt变换应用了一个具有2维内核的卷积,因此您需要2维图像(而您的图像是3维的,因为您有颜色(RGB,3通道((。

你可以在你的custom_features方法中添加一个灰度转换(你正在使用的skimage已经有了一个方法,请查看(

from skimage.filters import prewitt_h,prewitt_v
from skimage.color import rgb2gray
def custom_features(image):
""" 
Args:
image - array of shape (H, W, C)
Returns:
features - array of (H * W, C)
"""
grayscale = rgb2gray(image)
edges_prewitt_horizontal = prewitt_h(grayscale)
return edges_prewitt_horizontal

这应该可以做到(我假设custom_features方法在输入中接收的图像总是RGB图像,因为您在上面定义了形状(。如果您有不同的类型,您可以添加复选框if C == 3:来仅转换RGB图像。

默认情况下,skimage.io.imread将读取的JPEG图像返回为shape-(M,N,3(数组,表示RGB彩色图像。然而,prewitt函数期望输入是单通道图像。

要解决此问题,请先使用skimage.color.rgb2gray将图像转换为灰度,然后再进行过滤。或者,您可以使用skimage.io.imread(f, as_gray=True)直接读取灰度图像。

最新更新