在Matlab中转换数据类型的有效方法(double与im2double)

时间:2014-11-03 07:34:32

标签: matlab type-conversion

我想将真彩色图像转换为双精度,据我所知,有两种方法可以做到:

  1. double(rgb_img);
  2. im2double(rgb_img);
  3. 哪一个更有效率?

    谢谢!

2 个答案:

答案 0 :(得分:4)

他们俩都不一样。

如果数据类型为im2double0-1

uint8会在uint16之间转换图片范围。如果数据类型为singlelogical,则im2double会调用double(并且不会缩放图像范围)。对于double数据类型,它只保持不变(精度变化,图像范围也不变)。

如果您已经拥有双精度图像,那么您不应该调用im2double,它不会重新调整您的数据。您可以输入edit im2double并查看代码。如果只是想要转换为双精度(不改变图像范围),那么您应该调用double。否则请致电im2double,但请确保您的数据不属于singledoublelogical类型。

示例:

img=imread('cameraman.tif'); %datatype is uint8
img1=double(img); %just converts to double precision, image range between 0-255
img2=im2double(img); %converts to double precision and scales image range between 0-1

img=double(imread('cameraman.tif')); %even single datatype will give the same results
img1=double(img); %redundant since image is already double, image range 0-255
img2=im2double(img); %redundant since image is already double, image range 0-255

答案 1 :(得分:3)

以下是将doubleim2double进行比较的基准代码,即使它们不一定产生与其他解决方案中所述相同的结果 -

N_arr = [100 200 500 1000 2000 4000]; %// datasize array
timeall = zeros(4,numel(N_arr));
for k1 = 1:numel(N_arr)

    rgb_img = uint8(randi([0 255],N_arr(k1))); %// Input to functions

    f = @() double(rgb_img);
    timeall(1,k1) = timeit(f);
    clear f

    f = @() im2double(rgb_img);
    timeall(2,k1) = timeit(f);
    clear f
end
figure,hold on,grid on
plot(N_arr,timeall(1,:),'-ro'),plot(N_arr,timeall(2,:),'-kx')
legend('DOUBLE','IM2DOUBLE'),
xlabel('Datasize ->'),ylabel('Time(sec) ->')

结果 -

enter image description here

现在,这是有道理的,因为内部im2double调用double

现在,假设您正在处理uint8图片,要与double具有相同的功能,您需要先将其缩小。所以你需要相应地编辑函数句柄 -

f = @() double(rgb_img)./255;

情节结果是 -

enter image description here

所以,现在显然差别不大。