【问题标题】:Why when I "write" the image, values change? [closed]为什么当我“写”图像时,值会发生变化? [关闭]
【发布时间】:2013-07-30 18:07:03
【问题描述】:

我已根据某些标准将图像转换为binary (0 & 1) 图像。而且,对于某些像素,我为它们分配了值-1 作为标志。当我运行我的程序时,结果符合预期。但是,当我 imwrite 结果(图像)时,我得到的值是(0 和 255),并且具有值 -1 的像素不再存在。这与imwrite 有关吗?在编写图像时如何保持我的价值观?

谢谢。

【问题讨论】:

    标签: matlab image-processing binary


    【解决方案1】:

    当您imwrite 时,每个像素都转换为 8 位(取决于文件格式,但通常是这种情况)。这 8 位是 unsigned int8,因此任何负值都会被截断为 0。

    要解决此问题,您可能只想使用范围 [0..255] 的像素,选择 此范围中的特定值 作为您的“标志”。

    【讨论】:

    • @hai。感谢您的回复。我这样做了,并分配了例如值33。当我做imwrite时,也没有出现这样的值。所以,我只带着0255 值回来了。这是为什么呢?
    • @Med-SWEng 听起来很奇怪。您可以在您的问题中添加 代码 sn-p 吗?
    • 逻辑数组中没有“负值”
    【解决方案2】:

    您不能将 -1 放入逻辑数组。 假设我们创建逻辑数组

    x = true(2,2);
    

    任务

    x(1) = -1;
    

    等于

    x(1) = (-1 ~= 0);
    

    因此任何非零值都会转换为true

    至于解决方法,在设置flags之前,先将逻辑数组转换成uint8。

    img = uint8(255 * img_logical);
    img(3,10) = 254; % secret flag
    imwrite(img, 'img.jpg');
    

    【讨论】:

    • 那么为什么“当我运行我的程序时,结果符合预期”?如果问题如您描述的那样,那么在程序运行时应该很明显......
    • imwrite() 将逻辑 {false, true} 转换为 uint8 {0, 255}。如果将-15 设置为逻辑数组,它将转换为true,然后转换为255=white
    • @Serg.感谢您的回复。 img(3,10) 指的是什么?为什么是`(3,10)'?
    • @Med-SWEng, img(3,10) = 254 只是一个如何将标志设置为像素3x10 的示例。
    • @Med-SWEng,没有unit8。是uint8
    【解决方案3】:

    您没有提及imwrite 使用的参数或您使用的文件格式,但我怀疑它是单位格式。这意味着每个像素可以具有的唯一值是01。当您回读图像时,1 将转换为255,但您仍然只有两种可能性。当图像在内存中时,您可以根据需要设置值,但是在写入文件时它们都会再次转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-15
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      相关资源
      最近更新 更多