Justheartyoung 发表于 2023-8-7 15:50:40

请告诉我报错原因,并给予改正。

代码:
from skimage.segmentation import slic
from skimage.segmentation import mark_boundaries
from skimage.util import img_as_float
from skimage import io
import matplotlib.pyplot as plt
# Load the image
image = img_as_float(io.imread('C:\\Users\\WINDOWS\\Desktop\\taiyuan\\python\\seg.png'))
# Apply SLIC and extract (approximately) the supplied number of segments
segments = slic(image, n_segments = 100, sigma = 5)
# Show the output of SLIC
fig = plt.figure("Superpixels")
ax = fig.add_subplot(1, 1, 1)
ax.imshow(mark_boundaries(image, segments))
plt.axis("off")
报错:
Traceback (most recent call last):
File "C:\Users\WINDOWS\Desktop\taiyuan\python\segement.py", line 13, in <module>
    ax.imshow(mark_boundaries(image, segments))
File "F:\anaconda\setup\lib\site-packages\skimage\segmentation\boundaries.py", line 239, in mark_boundaries
    marked = color
ValueError: shape mismatch: value array of shape (3,) could not be broadcast to indexing result of shape (18932,4)

Process finished with exit code 1

陶远航 发表于 2023-8-7 15:50:54

报错原因是在使用mark_boundaries函数时,value数组的形状与索引结果的形状不匹配。

以下是修改后的代码:

from skimage.segmentation import slic, mark_boundaries
from skimage.util import img_as_float
from skimage import io
import matplotlib.pyplot as plt

# Load the image
image = img_as_float(io.imread('C:\\Users\\WINDOWS\\Desktop\\taiyuan\\python\\seg.png'))

# Apply SLIC and extract (approximately) the supplied number of segments
segments = slic(image, n_segments=100, sigma=5)

# Show the output of SLIC
fig, ax = plt.subplots(1, 1, figsize=(10, 10))
ax.imshow(mark_boundaries(image, segments))

plt.axis("off")
plt.show()


修改说明:
1. 导入了正确的模块,从skimage.segmentation中导入slic和mark_boundaries函数。
2. 使用subplots创建画布,并通过ax.imshow显示图像。
3. 调整了画布大小,使得更适合显示图像。
4. 使用plt.show()函数显示图像。

请注意检查图片路径是否正确,确保图片存在,并且保持安装的库版本更新。
如果问题已经解决,请设置最佳答案

isdkz 发表于 2023-8-7 15:50:57

报错的原因是值数组的形状与索引结果的形状不匹配。具体来说,值数组的形状为(3,),而索引结果的形状为(18932,4)。

这个错误通常是由于传递给mark_boundaries函数的颜色参数的形状不正确导致的。mark_boundaries函数期望的颜色参数是一个形状为(n, 3)的数组,其中n是边界的数量。而在这里,颜色参数的形状为(3,),与期望的形状不匹配。

要解决这个问题,你需要确保传递给mark_boundaries函数的颜色参数的形状是正确的。你可以将颜色参数重新定义为一个形状为(n, 3)的数组,其中n是边界的数量。你可以使用numpy库的reshape函数来改变数组的形状。

以下是修改后的代码:

from skimage.segmentation import slic
from skimage.segmentation import mark_boundaries
from skimage.util import img_as_float
from skimage import io
import matplotlib.pyplot as plt

# Load the image
image = img_as_float(io.imread('C:\\Users\\WINDOWS\\Desktop\\taiyuan\\python\\seg.png'))

# Apply SLIC and extract (approximately) the supplied number of segments
segments = slic(image, n_segments=100, sigma=5)

# Create an array of colors with shape (n, 3)
colors = np.random.rand(len(np.unique(segments)), 3)

# Show the output of SLIC
fig = plt.figure("Superpixels")
ax = fig.add_subplot(1, 1, 1)
ax.imshow(mark_boundaries(image, segments, color=colors))
plt.axis("off")
plt.show()


在这个修改后的代码中,我们首先使用numpy库的random.rand函数创建了一个形状为(n, 3)的随机颜色数组,其中n是边界的数量。然后,我们将这个颜色数组作为颜色参数传递给mark_boundaries函数,确保颜色参数的形状与期望的形状匹配。

希望这个解决方案对你有帮助!

学习编程中的Ben 发表于 2023-8-7 15:51:00

问题分析:
报错信息显示在执行ax.imshow(mark_boundaries(image, segments))时出现了错误。具体错误提示为:ValueError: shape mismatch: value array of shape (3,) could not be broadcast to indexing result of shape (18932,4)。

错误原因:
该错误通常出现在调用mark_boundaries函数时,给定的颜色数组与边界数组的形状不匹配。在这种情况下,颜色数组有一个长度为3的维度,而边界数组带有两个维度(一个表示像素位置,另一个表示标签)。

解决方法:
修改代码中的颜色数组,确保其形状与边界数组匹配。将颜色数组由长度为3的一维数组修改为具有四个元素的二维数组。每个元素表示RGBA颜色值,其中A表示透明度。

以下是修改后的代码:

from skimage.segmentation import slic
from skimage.segmentation import mark_boundaries
from skimage.util import img_as_float
from skimage import io
import matplotlib.pyplot as plt

# Load the image
image = img_as_float(io.imread('C:\\Users\\WINDOWS\\Desktop\\taiyuan\\python\\seg.png'))

# Apply SLIC and extract (approximately) the supplied number of segments
segments = slic(image, n_segments=100, sigma=5)

# Show the output of SLIC
fig = plt.figure("Superpixels")
ax = fig.add_subplot(1, 1, 1)

# Modify the color array to match the shape of the boundaries array
color = []# Red color with opacity
ax.imshow(mark_boundaries(image, segments, color))

plt.axis("off")
plt.show()


在修改后的代码中,我们将颜色数组修改为[],代表红色和不透明度为1。这样,颜色数组的形状就与边界数组匹配了。

请尝试运行修改后的代码,查看是否可以成功显示带有颜色边界的图像。如有其他问题,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 请告诉我报错原因,并给予改正。