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

时间:2018-05-14 03:11:44

标签: image octave

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

旁白:关于上面对rgb2gray的引用,我并没有做到这一点。它是来自彩色RGB的转换的默认值。通过网络搜索,我找到了旧的Octave 4.0(无im=imread('rgb.jpeg'); [imInd,Ind]=rgb2ind(im); imGray16=ind2gray(imInd,Ind); imwrite(imGray16,'gray16b.png'); imGray8=uint8(imGray16/256); imwrite(imGray8,'gray8b.png'); )的转换方法:

/std:c++latest /permissive-

我使用的是Octg安装,它是Cygwin的一部分。但是,我使用的笔记本电脑的用户权限有限,升级Octave需要非常大的时间。

1 个答案:

答案 0 :(得分:3)

在回答您的问题时,您无法在致电BitDepth时设置imwrite。该函数将使用变量的数据类型编写图像(假设图像文件类型支持它)。

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

但是,您的评论还有一些内容:

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

  2. rgb2ind默认情况下也不转换为uint16。它会转换为uint8uint16,具体取决于图片中唯一颜色的数量。

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