【发布时间】:2014-11-03 07:34:31
【问题描述】:
我想将真彩色图像转换为双精度,据我所知有两种方法可以做到这一点:
double(rgb_img);im2double(rgb_img);
哪个效率更高?
谢谢!
【问题讨论】:
-
请不要专注于哪个效率更高。您需要知道它们有不同的用途。
-
是的,你是对的。我以为他们做同样的事情。这就是为什么我想知道他们之间的效率。谢谢。
我想将真彩色图像转换为双精度,据我所知有两种方法可以做到这一点:
double(rgb_img);im2double(rgb_img);哪个效率更高?
谢谢!
【问题讨论】:
他们都是不同的。
如果数据类型是uint8 或uint16,im2double 将在0-1 之间转换图像的范围。如果数据类型是single 或logical,im2double 调用double(并且不缩放图像范围)。对于double 数据类型,它保持不变(精度不变,图像范围也不变)。
如果您已经有一个双精度图像,那么您不应该调用im2double,它不会重新调整您的数据。您可以输入edit im2double 并查看代码。如果您只是想要转换为双精度(不更改图像范围),那么您应该调用double。否则请致电im2double,但请确保您的数据不是single、double 或logical 类型。
例子:
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
【讨论】:
这是一个基准代码,用于比较 double 和 im2double,即使它们不一定会产生与其他解决方案中解释的结果相同的结果 -
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;
那么剧情结果是-
所以,现在看来差别不大了。
【讨论】: