单通道图像标注

Single channel Image annotation

我正在研究语义分割问题的掩码(标签)生成

我有一个 250x321 的 NumPy 数组。这是一个单通道图像。我必须注释这张图片。但由于这是一张单通道图像,当试图以 matplotlib.pyplot 的正常模式保存它时,尺寸会随着通道 (4) 的变化而变化。当以png格式存储单通道图像时,图像全黑,因此无法对图像进行注释。

所以我无法注释png格式图像(全黑),也无法使用正常的matplotlib.pyplot保存功能(Dim随通道改变)

谁能建议我如何完成这份工作!

我使用了下面给出的代码

plt.imshow(data[:, 400:650].T)
plt.tight_layout()
plt.xticks([])
plt.yticks([])
plt.axis('off')
plt.savefig('/content/new.png',bbox_inches='tight', pad_inches=0.0)

上面的代码生成一个形状为 245x315x4 的数组,当使用 plt.imread 时,原始数组的形状为 250x321x1

首先,如果您只想保存图像,请避免使用 plt.savefig,而是使用 plt.imsave(或其他库的替代品,例如 opencv 的 imwrite,或来自 PIL 的工具,等等)。这样做的原因是实现 plt.savefig 是为了保存整个图形,这意味着保存轴、标签、文本等。此外,它需要一个布尔参数 Transparent 来处理第四个通道。因此,在不知道 plt.savefig 的内部工作原理和确切实现的情况下,可以肯定地说它不应该用于保存灰度图像。

然而,在你的情况下,由于你没有使用 plt.savefig 来绘制除图像本身之外的任何东西,所以有一个简单的解决方法,我将在解决你的问题中的两点之后得出。首先,你的代码是

plt.imshow(data[:, 400:650].T)

但是既然你想要一个灰度图像,你应该设置 cmap="gray"。二、关于这部分

When storing just a single-channel image in png format, the image is all black

您的问题中没有任何关于 data 中值范围的信息,但我猜这只是“float”与“uint8”数据类型的问题。尝试设置 data.astype(float64) 或者如果使用 uint8,请确保将其标准化为 [0,255] 而不是 [0,1].

现在关于简单的解决方法,一旦您弄清楚如何更正上述问题并保存您的图形,您会注意到在使用 plt.imread 加载图像时您的所有四个通道都具有相同的值(假设您已设置 cmap=gray),因此您可以只 select 四个通道中的任何一个并丢弃其他通道。

但同样,使用 plt.imsave 或 opencv 是更好的主意。