Octave 4.0 `imwrite` png: `BitDepth` 4?

Octave 4.0 `imwrite` png: `BitDepth` 4?

Matlab 的 imwrite 允许我在将 2D uint16 数组写入文件“*.png”时指定配对参数 'BitDepth',4。我的 Octave imwrite 不接受配对参数 'BitDepth',4。我可以对位深度进行一些有限的控制,但是,如果我缩放 uint8 的数据并将其保存到二维 uint8 数组;来自 imwrite 的 '*.png' 刚好超过 uint16 数组文件大小的一半。我通过查看 imread 得到了这样做的想法,源图像文件的位深度决定了目标变量的 uint 类型。假设源 2D 图像数组的 uint 类型类似地确定了 imwrite 目标文件的位深度,uint8 产生的位深度为 8。但是,我发现有点对于手写笔记的 100 dpi 灰度扫描,深度 2 通常就足够了。 有没有一种简单的方法可以对 imwrite 进行这种任意位深度控制?

旁白: 关于上面提到的 uint16,我可不是瞎编的。这是从颜色 RGB 转换而来的默认设置。通过网络搜索,我找到了我的旧 Octave 4.0 的转换方法(没有rgb2gray):

im=imread('rgb.jpeg');
[imInd,Ind]=rgb2ind(im);
imGray16=ind2gray(imInd,Ind); imwrite(imGray16,'gray16b.png');
imGray8=uint8(imGray16/256); imwrite(imGray8,'gray8b.png');

我正在使用作为 Cygwin 一部分的 Octave 安装。然而,我使用的笔记本电脑用户权限有限,升级Octave需要大量时间。

回答你的问题,调用imwrite时不能设置BitDepth。该函数将写入一个具有变量数据类型的图像(前提是图像文件类型支持它)。

如果写文件时确实需要任意位深控制,需要直接与libpng交互,即自己编写oct函数。

但是,关于您的评论有几点:

  1. 从 uint16 转换为 uint8 并获得超过一半大小的问题,我猜是因为图像被压缩了。

  2. 默认情况下,
  3. rgb2ind 不会转换为 uint16。它将根据图像中独特颜色的数量转换为 uint8uint16

  4. 函数 rgb2gray 是图像包的一部分。如果您需要该功能,请加载该包。