【问题标题】:Write image with more than 256 labels使用超过 256 个标签写入图像
【发布时间】:2018-09-26 13:39:34
【问题描述】:

我有一个来自bwlabel 的二维标记矩阵,但它可能有索引大于 4000 的标签。通过imshow 显示超过 256 种颜色很简单:

img = zeros(1000, 1000);
%Put 4000 seeds
for numCentroid = 1:4000
    x = randi([1 size(img, 1)]);
    y = randi([1 size(img, 2)]);
    img(x, y) = 1;
end
D = bwdist(img);
% Create the 'cell' regions
L_img = watershed(D); % We obtain a labelled image
imshow(L_img, repmat(colorcube(256), 20, 1));

但是,当我们做同样的事情,但使用imwrite

imwrite(L_img, repmat(colorcube(256), 20, 1), 'p.tif');

并得到这个错误:

使用 wtifc 时出错
8 位图像的颜色图无效,尺寸必须为 n X 3 (n

它也可以用其他格式重现,例如 png:

 imwrite(uint16(randi([0 4000], 200)), colorcube(4001), 'p.png')

使用 writepng 时出错(第 76 行)
索引图像的位深度无效;必须是 1、2、4 或 8。

这是我们要保存的图像示例:

我们想要的是获得一个带有标签的每个分离区域的索引图像。我们如何保存这张图片?

由于我们知道这是imwrite 本身的问题,因为它将双矩阵转换为uint8,我们尝试将相同的矩阵放入uint16。这也不起作用。

编辑 1:

在Matlab中显示图像的位深度是正确的16位。

imfinfo('p.tif')

但是,如果您检查相同的内容,但在 Windows 中:right click on the file -> Properties -> Details,它具有 8 位深度。这与:

help imwrite

TIFF 文件的 BitDepth 允许值
灰度图像:1、2、4、8 或 16
带有 Alpha 通道的灰度图像:8 或 16
索引图像:1、2、4 或 8
真彩色图像:8 或 16

【问题讨论】:

  • 您可以使用哪些图像格式?是否需要 .tiff 或 .png?
  • 你真的要写indexed图片吗?如果您首先将其转换为 RGB 图像,它似乎可以工作:x = uint16(randi([0 4000], 200)); cmap = colorcube(4001); cmap1 = cmap(:,1); cmap2 = cmap(:,2); cmap3 = cmap(:,3); x_rgb = cat(3, cmap1(x+1), cmap2(x+1), cmap3(x+1)); imwrite(x_rgb, 'p.png')
  • @gnovice 不,任何常规格式都不会丢失信息
  • @LuisMendo 谢谢,它确实可以正确导出,但是当您打开图像时,它是 RGB 文件,而不是索引图像。

标签: image matlab image-processing


【解决方案1】:

作为Adriaan pointed out in his answer,您可以编写 16 位 TIFF 文件。如果文件需要被索引(即有一个单独的颜色图),并且有 16 位索引,那么 TIFF 是我所知道的唯一可以完成这项工作的标准文件格式。

给定 16 位索引图像和 4001 个元素的颜色图:

data = uint16(randi([0 4000], 200));
cm = colorcube(4001);

然后:

imwrite(data,cm,'p.tif')

会将其正确写入文件:

cris@paella> tiffinfo p.tif 
TIFF Directory at offset 0x13ba0 (80800)
  Image Width: 200 Image Length: 200
  Resolution: 72, 72 pixels/inch
  Bits/Sample: 16
  Compression Scheme: PackBits
  Photometric Interpretation: palette color (RGB from colormap)
  Orientation: row 0 top, col 0 lhs
  Samples/Pixel: 1
  Rows/Strip: 40
  Planar Configuration: single image plane
  Color Map: (present)

tiffinfo 是 LibTIFF 附带的一个程序,通常默认安装在 Unix 发行版上,我在我的 Mac 上使用 Homebrew 安装了 LibTIFF)。

注意“位/样本:16”行和“光度解释:调色板颜色(来自颜色图的 RGB)”。此 TIFF 文件现在有一个包含 65536 个条目的颜色映射。

我们也可以读回文件:

[data2,cm2] = imread('p.tif');

isequal(data,data2) 返回trueclass(data2) 返回'uint16'cm2cm 不同,因为它包含更多条目(全为 0)。但cm2(1:4001,:)cm 几乎相同,区别在于cm 是浮点值,乘以65535 并四舍五入以保存到文件。

正如我在 Adriaan 的回答下面的 cmets 中所表达的那样,问题是大多数软件不会读取 16 位索引 TIFF 文件。例如,Photoshop Elements 不会打开我们在此处创建的p.tif 文件,Apple 的 Preview 程序也不会。原因是基线 TIFF(所有 TIFF 阅读器必须遵守的最低公分母标准)仅指定 4 位和 8 位索引图像。 16 位索引图像是一个扩展。

因此,如果要保存 16 位索引图像,首先要确保目标软件能够读取它。

【讨论】:

  • 谢谢。那么,你知道任何可以读取 16 位索引图像的程序吗?
  • @Pablo:好吧,MATLAB 正确读取了文件……你想对图像做什么?最终目标是什么?照片软件往往专注于照片,每像素有一个 RGB 三元组。在过去,索引图像是一种节省内存的方法,但如今这已变得无关紧要。所以索引图像在某种程度上已经成为一个小众市场,支持起来并不那么重要。
  • 是的,我们在 Matlab 中有生成的标记图像,但有时,我们需要手动管理它们。因此,我们需要在 Matlab 之外(例如 Photoshop)修改这些图像。索引图像非常有用,因为我们可以导出图像,更改错误区域的索引,并返回在 Matlab 中修改过的图像。提前致谢。
  • @Pablo:那你还需要彩色图吗?没有颜色图你能做到吗? 16 位灰度图像应该在 Photoshop 中没有问题,但我不知道你是否可以选择 0-255 范围之外的颜色进行绘制。
  • @Pablo:另外,您是否意识到,如果 img 是您的带有 4000 多个标签的图像,您可以通过 img(img==105)=108 将标签为 105 的区域更改为 108?在 MATLAB 中完成整个事情可能会更容易。
【解决方案2】:

根据文档,输入uint16 文件会写入uint16 文件,前提是文件格式支持:

如果 A 的数据类型为 uint16,并且输出文件格式支持 16 位数据(JPEG、PNG 和 TIFF),则 imwrite 输出 16 位值。如果输出文件格式不支持 16 位数据,则​​imwrite 返回错误。

来自documentation on imwrite

img = rand(1e3);
L_img = bwlabel(img);
imshow(L_img, repmat(colorcube(256), 20, 1));
Warning: Image is too big to fit on screen; displaying at 67% 
> In images.internal.initSize (line 71)
  In imshow (line 305) 

imwrite(L_img, repmat(colorcube(256), 20, 1), 'p.tif');
Error using wtifc
Invalid colormap for 8 bit image, must have dimensions n X 3 (n<=256).

Error in writetif (line 118)
wtifc(data, map, filename, writemode, colorspace, required_tags);

Error in imwrite (line 472)
        feval(fmt_s.write, data, map, filename, paramPairs{:});

tmp = uint16(L_img);
imwrite(tmp, repmat(colorcube(256), 20, 1), 'p.tif'); %Writes the file to my disk

【讨论】:

  • 很多软件不支持除 8 位无符号整数以外的 TIFF 文件。很遗憾,因为 TIFF 可以包含更多像素类型。
  • @Pablo:但这是 Photoshop 无法打开文件的问题,而不是 MATLAB 无法编写文件的问题。如果你需要一个有4000个索引的文件,你需要写一个16位的类型。 Photoshop 将无法读取。
  • @Pablo:但 Adriaan 展示了如何编写这样的文件,并且他可以在 MATLAB 中将其读回。你说 Photoshop 无法打开那个文件。
  • 大多数图像格式根本不支持超过 256 种索引颜色。
  • @obchardon:TIFF 实际上确实支持 16 位索引和 65k 元素颜色表。如果它必须包含一个颜色表,TIFF 是我所知道的唯一方法。
猜你喜欢
  • 2021-08-18
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 2019-05-25
  • 2012-02-10
相关资源
最近更新 更多