【问题标题】:Octave 4.0 `imwrite` png: `BitDepth` 4?Octave 4.0`imwrite` png:`BitDepth` 4?
【发布时间】:2018-10-23 15:51:53
【问题描述】:

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

【问题讨论】:

    标签: image octave


    【解决方案1】:

    回答您的问题,拨打imwrite时不能设置BitDepth。该函数将使用变量的数据类型写入图像(前提是图像文件类型支持)。

    如果你在写文件的时候确实需要任意位深控制,你就需要直接和libpng交互,也就是自己写一个oct函数。

    但是,关于您的 cmets 有几点:

    1. 从 uint16 -> uint8 转换并得到一半以上大小的问题,我猜是因为图像被压缩了。

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

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

    【讨论】:

    • 谢谢,carandraug。我是包新手(而且对 Octave 来说相对较新),但我四处搜索安装。我收到错误“无法找到 mkoctfile 命令,Octave 安装不完整”。我没有构建 Octave,它来自旧的 Cygwin 安装。 which mkoctfile 给出了 mkoctfile.m 的完整路径,我可以通过 less 进行管道传输。在某个时候(可能在将来),我将不得不更新我的 Cygwin 以查看问题是否仍然存在。
    • @user36800 是否有理由不使用 scipt cygwin 而使用 MXE 安装程序?我认为也可以在没有管理员权限的情况下安装它,并且有 AFAIK 甚至是便携式版本,您可以将其安装在外部介质上
    • 为了得到 cygwin,我不得不移动天地。在我的店里,获得批准安装任何东西都是一件大事。在这一点上,批准 cygwin 更新 CD 比关注新事物更容易。但那是“好的”(在某种程度上它可以是好的),因为我非常喜欢 linux 环境及其所有的小便利。
    猜你喜欢
    • 2014-06-18
    • 1970-01-01
    • 2012-08-26
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2018-03-21
    相关资源
    最近更新 更多