【问题标题】:Matlab. Can't merge double arrays into RGB imageMATLAB。无法将双数组合并到 RGB 图像中
【发布时间】:2017-04-19 22:00:39
【问题描述】:

我在 Matlab (m,n,3)[double] 中有一个彩色 rgb 图像。我分别在每个通道上执行线性扩散过程。 LinearDiffusion 输出的第一个元素是一个双精度数组 (m,n,1)。

[m,n,j]=size(noisy_image)
rgb_im=zeros(m,n,3);
for chn=1:3        
    noisy_chn=noisy_image(:,:,chn);    
    [rgb_im(:,:,chn), diff_un]=LinearDiffusion2016(noisy_chn, 0, dt, maxnl);
end    

我想显示 rgb_im,即 (m,n,3)[double]。但无论我做什么,总是得到一个空白方块,即使图像值没有饱和。我对灰度(uint8)图像没有任何问题。有什么想法吗?

更新:源图像是 (m,n,3)[unit8],但我将每个通道变成双通道以将其馈送到 LinearDiffusion。

谢谢。

【问题讨论】:

  • 得到一个空白方块意味着当您使用imshow 绘制它时看起来是白色的?如果您的图像是双倍的,则必须将其标准化为 [0..1]。尝试使用imshow(yourimage,[]),您应该可以正确看到图像。
  • rgb_im 实际上是 uint。是我对图像进行了修补,将其变成了双重图像以将其提供给 LinearDiffusion。我的错,对不起。

标签: arrays image matlab rgb data-conversion


【解决方案1】:

原因是 MATLAB 将图像中的浮点数解释为 0 到 1(含)之间的分数,而整数被解释为 0 到 255(含)之间的位值。您已将整数值转换为双精度值,对它们进行了数学运算,然后将它们直接通过管道传输回imshow。 MATLAB 认为它们是双精度值,并将所有大于 1 的值钳制为 1,因此您看到的都是白色,除非您碰巧有一些纯黑色像素。您有两个选择:按照您在自我回答中所做的那样转换回整数,或者除以 255 以重新调整值。

如果在imshow 帮助文件中提供此信息会很有帮助,但您必须深入到低级别的CData 图像属性才能获取此信息:

图像颜色数据,以下列形式之一指定:

  • RGB 三元组的 3-D 数组 — 此格式使用 RGB 三元组值定义真彩色图像数据。每个 RGB 三元组为图像的一个像素定义一种颜色。 RGB 三元组是一个三元素向量,用于指定颜色的红色、绿色和蓝色分量的强度。 3-D 数组的第一页包含红色分量,第二页包含绿色分量,第三页包含蓝色分量。由于图像使用真彩色而不是颜色图颜色,因此 CDataMapping 属性无效。

    • 如果 CData 是 double 类型,则 [0 0 0] 的 RGB 三元组值对应黑色,[1 1 1] 对应白色。

    • 如果 CData 是整数类型,则图像使用整个数据范围来确定颜色。例如,如果 CData 是 uint8 类型,则 [0 0 0] 对应于黑色,而 [255 255 255] 对应于白色。如果 CData 是 int8 类型,则 [-128 -128 -128] 对应黑色,[127 127 127] 对应白色。

    • 如果 CData 是逻辑类型,则 [0 0 0] 对应黑色,[1 1 1] 对应白色。

【讨论】:

    【解决方案2】:

    前提是 rgb 图像的每个通道都必须是 uint8(不是双精度!!)。这条线成功了:

    imshow(uint8(rgb_im));
    

    问候

    【讨论】:

      猜你喜欢
      • 2020-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多