我正在尝试提取这样的边缘特征:
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)
直接读取灰度图像。