1

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

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()

自定义功能:

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

如何在函数内部修改它以使返回的形状符合需要?

4

2 回答 2

2

看起来你需要给 prewitt 一个灰度图像。prewitt 变换应用带有二维内核的卷积,因此您需要二维图像(而您的图像是 3-d,因为您有颜色(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 图像。

于 2020-11-08T23:00:46.487 回答
0

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

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

于 2020-11-08T22:56:03.213 回答