我想将真彩色图像转换为双精度,据我所知,有两种方法可以做到:
double(rgb_img);
im2double(rgb_img);
哪一个更有效率?
谢谢!
答案 0 :(得分:4)
他们俩都不一样。
如果数据类型为im2double
或0-1
, uint8
会在uint16
之间转换图片范围。如果数据类型为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
答案 1 :(得分:3)
以下是将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;
情节结果是 -
所以,现在显然差别不大。