Ria*_*rge 7 matlab image-processing wavelet
我偶然发现了这个令人惊讶的反应,我已经idwt2多次应用MATLAB来自己理解它.但是,我无法使用与RGB图像一起使用相同的方法.所以,我有3个问题.
如何将代码应用于RGB图像,只有输出中显示的变换图像以及沿行和列的高频和低频分量,是否可以将所有组件的融合视为单个图像?我知道我必须把猫操作员,但我不明白如何去做.
其次,我也得到了一个迷宫般的形象!我很困惑,因为我似乎无法遵循原因.我还在声明如何生成此图像的语句中附加了相同的代码.
3. db1函数签名中的术语含义是什么dwt?
码:
load woman; % Load image data
%startImage=imread('pic_rgb.jpg'); % IF I WANT TO WORK WITH RGB IMAGE
nLevel = 3; % Number of decompositions
nColors = size(map,1); % Number of colors in colormap
cA = cell(1,nLevel); % Approximation coefficients
cH = cell(1,nLevel); % Horizontal detail coefficients
cV = cell(1,nLevel); % Vertical detail coefficients
cD = cell(1,nLevel); % Diagonal detail coefficients
startImage = X;
for iLevel = 1:nLevel,
[cA{iLevel},cH{iLevel},cV{iLevel},cD{iLevel}] = dwt2(startImage,'db1');
startImage = cA{iLevel};
end
figure;colormap(map);
imagesc(dwt2(startImage,'db1')); %THIS GIVES THE MAZED IMAGE INSTEAD OF THE TRANSFORMED IMAGE
figure;
tiledImage = wcodemat(cA{nLevel},nColors);
for iLevel = nLevel:-1:1,
tiledImage = [tiledImage wcodemat(cH{iLevel},nColors); ...
wcodemat(cV{iLevel},nColors) wcodemat(cD{iLevel},nColors)];
end
figure;
imshow(tiledImage,map);
%reconstruct
fullRecon = cA{nLevel};
for iLevel = nLevel:-1:1,
fullRecon = idwt2(fullRecon,cH{iLevel},cV{iLevel},cD{iLevel},'db1');
end
partialRecon = cA{nLevel};
for iLevel = nLevel:-1:1,
partialRecon = idwt2(partialRecon,[],[],[],'db1');
end
figure;
imshow([X fullRecon; partialRecon zeros(size(X))],map,...
'InitialMagnification',50);
Run Code Online (Sandbox Code Playgroud)
我对其他问题的回答中使用的示例图像是索引图像,因此需要进行一些更改才能使该代码适用于RGB图像.
我将首先解决有关'db1'传递给DWT2的参数的问题.这指定了用于分解的小波类型(在本例中为Daubechies小波).有关可用小波的更多信息,请参见WFILTERS和WAVEINFO函数的文档.
我将通过向您展示如何修改我的其他答案中的代码来处理RGB图像来解决前两个问题.我将使用示例'peppers.png'图像.您首先要加载图像并定义每个颜色分量所具有的值的数量.由于样本图像是无符号的8位整数类型(最常见的情况),因此nColors将为256:
X = imread('peppers.png'); %# Load sample image
nColors = 256; %# Number of values per color component
Run Code Online (Sandbox Code Playgroud)
如果您的图像是较大的无符号整数类型(例如'uint16'),找到颜色值的一般方法是使用函数INTMAX,如下所示:
nColors = double(intmax(class(X)))+1;
Run Code Online (Sandbox Code Playgroud)
对于随后的代码,'uint8'假设图像类型.
应用分解与索引图像情况没有什么不同.系数矩阵将简单地是M×by-by-3矩阵而不是M-by-N矩阵:
nLevel = 3; %# Number of decompositions
cA = cell(1,nLevel); %# Approximation coefficient storage
cH = cell(1,nLevel); %# Horizontal detail coefficient storage
cV = cell(1,nLevel); %# Vertical detail coefficient storage
cD = cell(1,nLevel); %# Diagonal detail coefficient storage
startImage = X;
for iLevel = 1:nLevel, %# Apply nLevel decompositions
[cA{iLevel},cH{iLevel},cV{iLevel},cD{iLevel}] = dwt2(startImage,'db1');
startImage = cA{iLevel};
end
Run Code Online (Sandbox Code Playgroud)
创建平铺图像以显示每个分解的水平,垂直和对角线分量的代码将会改变,因为我们现在正在使用3-D矩阵,并且必须使用CAT函数而不是连接运算符[]:
tiledImage = wcodemat(cA{nLevel},nColors);
for iLevel = nLevel:-1:1
tiledImage = cat(1,cat(2,tiledImage,...
wcodemat(cH{iLevel},nColors)),...
cat(2,wcodemat(cV{iLevel},nColors),...
wcodemat(cD{iLevel},nColors)));
end
figure;
imshow(uint8(tiledImage-1)); %# Convert to unsigned 8-bit integer to display
Run Code Online (Sandbox Code Playgroud)
这将给出以下图像,显示每个分解步骤的水平(右上),垂直(左下)和对角(右下)组件,以及缩小的图像(左上):

重建步骤与其他答案没有变化.只需要修改显示最终图像的代码:
fullRecon = cA{nLevel};
for iLevel = nLevel:-1:1,
fullRecon = idwt2(fullRecon,cH{iLevel},cV{iLevel},cD{iLevel},'db1');
end
partialRecon = cA{nLevel};
for iLevel = nLevel:-1:1,
partialRecon = idwt2(partialRecon,[],[],[],'db1');
end
figure;
tiledImage = cat(1,cat(2,X,uint8(fullRecon)),...
cat(2,uint8(partialRecon),zeros(size(X),'uint8')));
imshow(tiledImage,'InitialMagnification',50);
Run Code Online (Sandbox Code Playgroud)
并且您将获得显示原始RGB图像(左上)的图像,使用所有存储的细节系数矩阵(右上)的完全重建图像,以及使用没有存储的细节系数矩阵的部分重建图像(底部)剩下):
