matplotlib 如何将1通道阵列保存为具有适当颜色限制的图像

jutyujz0  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(83)

我试图保存一个序列的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)
piv4azn7

piv4azn71#

首先是一些提示…

  • 分类数据不能使用JPEG格式。JPEG是一种有损格式,用于照片,并允许更改像素,以获得 “看起来非常相似” 但当您重新阅读时会有所不同的内容。类数据使用无损PNG格式。参见答案末尾的演示。
  • 你的类在每个像素位置都由一个数字表示-这意味着你需要一个单通道图像,也就是说。这意味着在画圆时,你应该将颜色指定为一个数字,而不是两个数字的元组。
  • 引入不必要的依赖是没有意义的--你已经在使用OpenCV,所以用它来读写你的图像。

这意味着你的代码应该看起来更像这样:

#!/usr/bin/env python3

import numpy as np
import cv2 as cv

image = np.zeros(shape=[256, 256], dtype=np.uint8)

cv.circle(image, center=(50, 50), radius=10, color=2, thickness= -1)
cv.circle(image, center=(100, 100), radius=10, color=3, thickness= -1)
cv.circle(image, center=(150, 150), radius=10, color=4, thickness= -1)
cv.circle(image, center=(75, 200), radius=10, color=5, thickness= -1)
cv.circle(image, center=(200, 89), radius=10, color=6, thickness= -1)

# additional circles (they are part of Image #2)
cv.circle(image, center=(21, 230), radius=5, color=7, thickness= -1)
cv.circle(image, center=(149, 250), radius=5, color=12, thickness= -1)

cv.imwrite('classes.png', image)

这将以非常低的对比度保存您的图像-所有像素将在0..255范围内的0..12范围内,因此它们将是暗的,但仍然包含您需要的信息。

为了实现可视化,您需要对比拉伸,或将数据归一化为全范围。你可以使用ImageMagick非常简单:

magick classes.png -normalize classes-norm.png

如果你不想使用ImageMagick进行规范化,OpenCV中的等价操作是:

normalizedImg = cv.normalize(img, None, 0, 255, cv.NORM_MINMAX)

如果您想将自己的颜色Map应用到数据上,可以使用LUT “Lookup Table” 来实现,如下所示:

#!/usr/bin/env python3

import sys
import cv2 as cv
import numpy as np

if __name__ == "__main__":

   # Check filename supplied
   if len(sys.argv) != 2:
      sys.exit('Usage: argv[0] filename')

   # Read greyscale class image
   image = cv.imread(sys.argv[1], cv.IMREAD_GRAYSCALE)

   # Create a 256 entry palette each with 3 (RGB) entries, initially looking like greyscale
   pal = np.fromfunction(lambda i,j: i, (256,3), dtype=np.uint8)

   # Overwrite any desired colours from grey to new colour
   pal[0] = [0,0,0]      # 0 maps to black
   pal[1] = [255,0,0]    # 1 maps to red
   pal[2] = [0,255,0]    # 2 maps to green
   pal[3] = [0,0,255]    # 3 maps to blue
   pal[4] = [255,255,0]  # 4 maps to yellow
   pal[5] = [0,255,255]  # 5 maps to cyan
   pal[6] = [255,0,255]  # 6 maps to magenta
   pal[7] = [128,0,0]    # 7 maps to dark red
   pal[8] = [0,128,0]    # 8 maps to dark green
   pal[9] = [0,0,128]    # 9 maps to dark blue

   # Convert LUT to BGR order for OpenCV
   pal = pal[:,::-1]

   # Look up each pixel in the LUT
   result = pal[image]

   # Save result
   cv.imwrite('result.png', result)

显然,您可以同样地将LUT存储在JSON或CSV中,然后从那里加载,而不是将其放入Python代码中。
请注意,对应于类12的圆圈没有显示出来,因为我太懒了,没有将其从默认LUT(12,12,12)中设置的深灰色重新Map。
请注意,上面着色的图像现在是3通道RGB图像,而不是单通道灰度classes.png
请注意,如果超过255个类并使用np.uint16等,则需要重新访问代码。
这里有一个小演示JPEG对数据的作用。首先,我们生成一个100 x100的图像,并用随机噪声填充它,即随机的颜色然后将颜色数量减少到64,并首先将结果保存为PNG,然后再次将相同的数据保存为JPEG:

magick -size 100x100 xc: +noise random -colors 64 -write a.png a.jpg

**PNG

*JPEG

他们看起来一样,不是吗。现在让我们来计算每种颜色的唯一数量:

magick a.png a.jpg -format "%f: %k\n" info:

结果

a.png: 64
a.jpg: 9682     # OOPS! Look what JPEG did.

JPEG为什么要这样做?因为文件小了60%,但图像看起来是一样的:

-rw-r--r--@    1 mark  staff     46256  9 Jun 11:04 a.png
-rw-r--r--@    1 mark  staff     18991  9 Jun 11:04 a.jpg

相关问题