2019.4.6
1、为什么图像要从uint8类型转为double类型?
因为imread()读入的图像是uint8类型,将原图像的灰度值转换成double的作用主要是考虑计算过程中的精度的问题,double 的数据是有小数点的,而uint8是0-255的整数,如果直接用uint8计算,会在计算过程中产生舍入误差,这种误差在图像的数据中是比较大的误差。显示的时候是因为我们的显示系统采用的颜色模式大多为RGB模式,其每一种颜色分量的取值只能在0-255,所以显示时要用uint8数据。
2、为什么要把图像转为灰度图进行处理?
我们识别物体,最关键的因素是梯度(现在很多的特征提取,SIFT,HOG等等本质都是梯度的统计信息),梯度意味着边缘,这是最本质的部分,而计算梯度,自然就用到灰度图像了。颜色本身,非常容易受到光照等因素的影响,同类的物体颜色有很多变化。所以颜色本身难以提供关键信息。
链接:https://www.zhihu.com/question/24453478/answer/35874118
3、double与im2double的区别?
double只做数据类型转换,(可以认为)不会修改数值本身。
im2double除了做数据类型转换还要对数据做线性缩放。下面的代码可以看出区别。
a = uint8(250);
b = double(a);
c = im2double(a);
2019.4.7
经过阅读小波变换图像融合的代码,大致了解了代码的意思;为了以后再次使用时方便,我现在对代码进行注释,可能有的地方不太准确,慢慢学习吧!
clc;
clear all;
[imA,map1] = imread('c01_1.tif');%读入图片
M1 = double(imA) / 256; % 归一化处理
[imB,map2] = imread('c01_2.tif');
M2 = double(imB) / 256;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 小波分解说明 %
zt= 3;
wtype = 'haar';
% 对参数进行说明
% M1 - input image A
% M2 - input image B
% wtype使用的小波类型
% Y - fused image
% 多尺度二维小波分解 对图像进行三层分解,c0和c1都等于 1*65536;s0和s1都等于5*2;
% c0和c1是对应的整幅图数据的向量;是1*65536的矩阵,由于是两幅图,所以他们的数据时不一样的;
% s0和s1是分解的层数的矩阵:
% 32 32
% 32 32
% 64 64
% 128 128
% 256 256
[c0,s0] = wavedec2(M1, zt, wtype);
[c1,s1] = wavedec2(M2, zt, wtype);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 小波变换图像融合系数的处理 %
% 高频部分:由于小波变换的绝对值大的小波系数,对应着显著的亮度变化,也就是图像中的显著特征。所
% 以,选择绝对值大的小波系数作为我们需要的小波系数。【注意,前面取的是绝对值大小,而不是实际数值 % 大小】
% 低频部分:系数采用二者求平均的方法
KK = size(c1);%KK得到的值是C1的行值和列值;
Coef_Fusion = zeros(1,KK(2));%生成一个1*65536的全零矩阵
Temp = zeros(1,2);%创建一个1*2的全零矩阵
%低频系数的处理 是将1-32个低频数据进行求平均操作;
Coef_Fusion(1:s1(1,1)) = (c0(1:s1(1,1))+c1(1:s1(1,1)))/2;
%处理高频系数
MM1 = c0(s1(1,1)+1:KK(2));% 将 33-65536 个数据分别赋值给MM1和MM2;
MM2 = c1(s1(1,1)+1:KK(2));
mm = (abs(MM1)) > (abs(MM2));%比较两个矩阵的绝对值(注意,比较两个矩阵绝对值的大小是对应的元素
%进行相比较的)得到一个mm 矩阵,这个矩阵是一个只有0和1的矩阵当
%(abs(MM1)) > (abs(MM2)) 这个条件满足时就在对应的矩阵的位置赋值
%1 ,如果不满足就在对应位置赋值 0;这样得到的mm 矩阵是一个和 MM1
%和MM2 相同维数的矩阵,
Y = (mm.*MM1) + ((~mm).*MM2); % 点乘要求参与运算的两个量必须是维数相同,对应的元素相乘;这样
%得到的Y 矩阵也是和MM1和MM2同维数的矩阵;运算结果相当于是取
%MM1和MM2 两个矩阵的对应的位置的最大值,这样得到的Y矩阵是一个由
%MM1和MM2矩阵的最大值组成的一个矩阵;
Coef_Fusion(s1(1,1)+1:KK(2)) = Y;%将得到的Y矩阵赋值给Coef_Fusion()的第33-65536 数据的位置;
%处理高频系数end
%小波融合重构
Y = waverec2(Coef_Fusion,s0,wtype);%在重构时,层数和小波基函数类型不变;
%显示图像
subplot(2,2,1);imshow(M1);
colormap(gray); %为什么显示的时候要使用这个我还没有弄的很明白,从显示的结果来说这个语句似乎没有
%多大的影响;
title('input1');
axis square
subplot(2,2,2);imshow(M2);
colormap(gray);
title('input2');
axis square
subplot(223);imshow(Y,[]);
colormap(gray);
title('融合图像');
axis square;
%% 说明:
这里说明下 axis square和axis equal 的区别:
axis square 当前坐标系图形设置为方形;axis square刻度范围不一定一样,但是一定是方形的。
axis equal 将横轴纵轴的定标系数设成相同值 ,即单位长度相同;axis equal刻度是等长的,但也不一定是方形的。
用代码图形进行解释:
%% axis square和axis equal 的区别
x = 1:0.1:10;
y = x;
subplot(121);plot(y);
axis square;
x1 = 1:0.1:10;
y1 = x1;
subplot(122);plot(y1);
axis equal;

本文探讨了图像处理中将图像从uint8类型转换为double类型的原因,以及为何通常选择处理灰度图像。还讨论了double与im2double的区别,并介绍了在图像显示时axis square和axis equal的差异。
1万+





