我试图保存一个序列的1通道阵列到灰度图像。这些图像被认为是用于分割的掩模。
我面临的问题是不同图像中相同像素值的颜色不一致:
图片#1
当我添加额外的圆到这个图像,然后保存的图像具有不同的颜色集以前的当前圆。
图片#2
理想情况下,我希望它们在我的整个数据集中具有一致的颜色,因为每个圆圈代表一个独特的标签类别。
所以我的问题是,如何用一致的颜色代码保存这些灰度图像?
添加代码片段以生成上面的图像
import numpy as np
import cv2
import matplotlib.image as mpimg
image = np.zeros(shape=[256, 256], dtype=np.uint8)
cv2.circle(image, center=(50, 50), radius=10, color=(2, 2), thickness= -1)
cv2.circle(image, center=(100, 100), radius=10, color=(3, 3), thickness= -1)
cv2.circle(image, center=(150, 150), radius=10, color=(4, 4), thickness= -1)
cv2.circle(image, center=(75, 200), radius=10, color=(5, 5), thickness= -1)
cv2.circle(image, center=(200, 89), radius=10, color=(6, 6), thickness= -1)
# additional circles (they are part of Image #2)
cv2.circle(image, center=(21, 230), radius=5, color=(7, 7), thickness= -1)
cv2.circle(image, center=(149, 250), radius=5, color=(12, 12), thickness= -1)
mpimg.imsave('image.jpg',image)
1条答案
按热度按时间piv4azn71#
首先是一些提示…
这意味着你的代码应该看起来更像这样:
这将以非常低的对比度保存您的图像-所有像素将在0..255范围内的0..12范围内,因此它们将是暗的,但仍然包含您需要的信息。
为了实现可视化,您需要对比拉伸,或将数据归一化为全范围。你可以使用ImageMagick非常简单:
如果你不想使用ImageMagick进行规范化,OpenCV中的等价操作是:
如果您想将自己的颜色Map应用到数据上,可以使用LUT “Lookup Table” 来实现,如下所示:
显然,您可以同样地将LUT存储在JSON或CSV中,然后从那里加载,而不是将其放入Python代码中。
请注意,对应于类12的圆圈没有显示出来,因为我太懒了,没有将其从默认LUT(12,12,12)中设置的深灰色重新Map。
请注意,上面着色的图像现在是3通道RGB图像,而不是单通道灰度
classes.png
。请注意,如果超过255个类并使用
np.uint16
等,则需要重新访问代码。这里有一个小演示JPEG对数据的作用。首先,我们生成一个100 x100的图像,并用随机噪声填充它,即随机的颜色然后将颜色数量减少到64,并首先将结果保存为PNG,然后再次将相同的数据保存为JPEG:
**PNG
*JPEG
他们看起来一样,不是吗。现在让我们来计算每种颜色的唯一数量:
结果
JPEG为什么要这样做?因为文件小了60%,但图像看起来是一样的: