【问题标题】:The efficient way to convert datatype in Matlab (double vs. im2double)在 Matlab 中转换数据类型的有效方法(double vs. im2double)
【发布时间】:2014-11-03 07:34:31
【问题描述】:

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

  1. double(rgb_img);
  2. im2double(rgb_img);

哪个效率更高?

谢谢!

【问题讨论】:

  • 请不要专注于哪个效率更高。您需要知道它们有不同的用途。
  • 是的,你是对的。我以为他们做同样的事情。这就是为什么我想知道他们之间的效率。谢谢。

标签: matlab type-conversion


【解决方案1】:

他们都是不同的。

如果数据类型是uint8uint16im2double 将在0-1 之间转换图像的范围。如果数据类型是singlelogicalim2double 调用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

【讨论】:

  • 谢谢,兄弟。你的回答给了我比我认为我需要知道的更多。非常感谢。
  • 我猜当您要求进行基准测试时,您不会知道这两者之间的区别。由于 im2double 调用 double,后者通常会更快,在适当的情况下
【解决方案2】:

这是一个基准代码,用于比较 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) ->')

结果 -

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

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

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

那么剧情结果是-

所以,现在看来差别不大了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多