代码之家  ›  专栏  ›  技术社区  ›  momo

为什么需要用255除法归一化以及与对数变换有关的其他疑问

  •  0
  • momo  · 技术社区  · 6 年前

    clc
    clear all
    image = imread('image.jpg')
    imaged = double(image) / 255
    new_image = log(1 + imaged)
    subplot(1, 2, 1)
    imshow(image)
    title('Before log transformation');
    subplot(1, 2, 2) 
    %new_image = uint8(new_image)
    imshow(new_image)
    title('After log transformation');
    
    • 我们为什么要改变信仰 uint8 double ? (不这样做似乎不起作用)

    • 如果我将图像转换回 单位8 ? (和上面一样,它在不同的操作中工作得很好。事实上,如果我不改回去的话,它就会失灵 )

    clear all
    close all
    clc
    image = imread('city.jpg');
    imaged = double(image);
    maxI = max(max(max(imaged)));
    minI = min(min(min(imaged)));
    new_image = ((imaged - minI) ./ max(imaged - minI)) * 255;
    subplot(1, 2, 1)
    imshow(image)
    title('Before min-max transformation');
    subplot(1, 2, 2) 
    new_image = uint8(new_image);
    imshow(new_image)
    title('After min-max transformation');
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Mad Physicist    6 年前

    @anonymous's answer 是优秀的,至少应该被提升,我想仔细看看你做的一些具体的事情,这样你就知道下次去哪里看。

    从你第一个关心的转变到 double 在里面 imaged = double(image)/255 uint8 值,该值介于0和255×255之间?当然,你会得到一个介于0和1之间的值。但是如果输出仍然是一个 单位8 ,例如,因为输入数组 单位8 之间 任何一个 一个(当然也是),通过适当的动态范围调整,你会看到一个纯粹的黑白图像。转换为 双重的 可以得到介于0和1之间的值。

    几乎所有其他问题都围绕着这样一个事实:MATLAB理解两种可显示的图像格式: s在[0,1]范围内,并且 单位8 在[0255]范围内。

    imaged = (e-1) * double(image)/255
    

    或同等地

    new_image = log(1 + (e-1) * imaged)
    

    new_image = log2(1 + imaged)
    

    如果您仍然想知道为什么需要按255进行规范化,请查看在通过转换传递未规范化的255时,255会发生什么情况。

    你的转换回到 单位8 失败是因为您没有以与“其他”代码中相同的方式执行。另一个代码正确地将范围[0,1]映射到[0,255]。您当前的代码只是转换值。如前所述 单位8 一个,不是介于两者之间。

    new_image = ((imaged-minI)./max(imaged-minI))*255; . 记得吗 imaged 是一个 双重的 new_image . 但是,double仅在[0,1]范围内正确显示。一旦你皈依 ,范围[0,255]变得适合显示。

        2
  •  3
  •   user366312    6 年前

    以达到更高的计算精度。整数值有除法和舍入实值的问题。例如,5/2等于2。但是,5.0/2.0等于2.5。

    -为什么需要用255除法归一化?(我以前写过一个代码,没有这样的规范化,它工作得很好,但在这里它出现了故障)

    将它们置于0-255范围内,这是RGB值的有效范围。

    它失去了精确性。例如,7/8是0。但是,7.0/8.0是0.875。