如何用奇异值分解(SVD)在Matlab中实现图像压缩的代码示例?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1111个文字,预计阅读时间需要5分钟。
1. 简介 基于奇异性值分割的基本原理及其特性,本文介绍了运用奇异性值分割进行图像压缩的方法。通过简单的示例说明了该方法进行图像压缩的基本过程,并给出了压缩流程。
2. 奇异性值分割原理 奇异性值分割是一种基于图像局部特征差异的分割方法。它通过分析图像中像素值的奇异性,将图像分割成若干区域,每个区域具有相似的特征。
3. 图像压缩方法 运用奇异性值分割进行图像压缩的基本步骤如下: - 对图像进行预处理,如去噪、灰度化等。 - 计算图像中每个像素的奇异性值。 - 根据奇异性值将图像分割成若干区域。 - 对每个区域进行压缩,如采用小波变换、JPEG等压缩算法。 - 将压缩后的图像区域重新组合成完整的图像。
4. 示例说明 以一幅256x256的灰度图像为例,说明运用奇异性值分割进行图像压缩的过程: - 预处理:对图像进行去噪、灰度化等操作。 - 计算奇异性值:对图像中每个像素计算其奇异性值。 - 分割:根据奇异性值将图像分割成若干区域。 - 压缩:对每个区域进行压缩,如采用JPEG算法。 - 重组:将压缩后的图像区域重新组合成完整的图像。
5. 压缩流程 压缩流程如下: - 输入图像 - 预处理 - 计算奇异性值 - 分割 - 压缩 - 重组 - 输出压缩后的图像
6. MATLAB编程实现 通过MATLAB编程实现奇异性值分割图像压缩,具体步骤如下: - 读取图像 - 预处理 - 计算奇异性值 - 分割 - 压缩 - 重组 - 显示压缩后的图像
1 简介
根据奇异值分解的基本原理及其特点,给出了运用奇异值分解进行图像压缩的方法.通过简单的例子说明了该方法进行图像压缩的基本过程,给出了压缩流程.并通过MAT-LAB编程对实际图像进行处理,表明了该方法的有效性.
编辑
编辑
2 完整代码
% Read the image into A as a matrix of uint8clc
clear all
close all
[X,map] = imread('witchhead.jpg');
Im = X;
% Convert image from uint8 to doubles for svd
X = im2double(X);
% Seperate
[U_r,S_r,V_r] = svd(X(:,:,1));
[U_g,S_g,V_g] = svd(X(:,:,2));
[U_b,S_b,V_b] = svd(X(:,:,3));
%=============================
% Test Scripts
%=============================
%confirmation checking for red
out_red = U_r*S_r*V_r';
red = X(:,:,1);
%-----------------------------
% S_r has size 640x1138, thus 640 diagonal values
size(S_r)
% Find the largest k singular values
k = 30;
redk = zeros(k,1);
greenk = zeros(k,1);
bluek = zeros(k,1);
% Discovered that the diagonal of the sum matrix is in order
for i = 1:k
redk(i) = S_r(i,i);
greenk(i) = S_g(i,i);
bluek(i) = S_b(i,i);
end
%-----------------------------
% Storage Analysis
initialStorage = 640*1138;
currentStorage = (640+1138)*k+k;
%-----------------------------
% Error Analysis
sume = 0;
for i = 1:640
sume = sume + S_r(i,i) + S_g(i,i) + S_b(i,i);
end
error = sum(redk+greenk+bluek) / sume;
%-----------------------------
NewImage_r = zeros(640,1138);
NewImage_g = zeros(640,1138);
NewImage_b = zeros(640,1138);
for i = 1:k
NewImage_r = NewImage_r + redk(i)* U_r(:,i)*V_r(:,i)';
NewImage_g = NewImage_g + greenk(i) * U_g(:,i)*V_g(:,i)';
NewImage_b = NewImage_b + bluek(i) * U_b(:,i)*V_b(:,i)';
end
%-----------------------------
% Normalize the matrices to fit the rgb format
for i = 1:640
for j = 1:1138
if(NewImage_r(i,j) < 0)
NewImage_r(i,j) = 0;
end
if(NewImage_g(i,j) < 0)
NewImage_g(i,j) = 0;
end
if(NewImage_b(i,j) < 0)
NewImage_b(i,j) = 0;
end
end
end
%-----------------------------
rgbImage = cat(3, NewImage_r, NewImage_g, NewImage_b);
% image(rgbImage);
% image(X);
difference = rgbImasge-X
figure
subplot(121)
imshow(X,[]);title('原图')
subplot(122)
imshow(NewImage_b,[]);title('压缩后的图')
%-----------------------------
3 仿真结果
编辑
4 参考文献
[1]胡乡峰, 卫金茂. 基于奇异值分解(SVD)的图像压缩[J]. 东北师大学报:自然科学版, 2006, 38(3):4.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。
本文共计1111个文字,预计阅读时间需要5分钟。
1. 简介 基于奇异性值分割的基本原理及其特性,本文介绍了运用奇异性值分割进行图像压缩的方法。通过简单的示例说明了该方法进行图像压缩的基本过程,并给出了压缩流程。
2. 奇异性值分割原理 奇异性值分割是一种基于图像局部特征差异的分割方法。它通过分析图像中像素值的奇异性,将图像分割成若干区域,每个区域具有相似的特征。
3. 图像压缩方法 运用奇异性值分割进行图像压缩的基本步骤如下: - 对图像进行预处理,如去噪、灰度化等。 - 计算图像中每个像素的奇异性值。 - 根据奇异性值将图像分割成若干区域。 - 对每个区域进行压缩,如采用小波变换、JPEG等压缩算法。 - 将压缩后的图像区域重新组合成完整的图像。
4. 示例说明 以一幅256x256的灰度图像为例,说明运用奇异性值分割进行图像压缩的过程: - 预处理:对图像进行去噪、灰度化等操作。 - 计算奇异性值:对图像中每个像素计算其奇异性值。 - 分割:根据奇异性值将图像分割成若干区域。 - 压缩:对每个区域进行压缩,如采用JPEG算法。 - 重组:将压缩后的图像区域重新组合成完整的图像。
5. 压缩流程 压缩流程如下: - 输入图像 - 预处理 - 计算奇异性值 - 分割 - 压缩 - 重组 - 输出压缩后的图像
6. MATLAB编程实现 通过MATLAB编程实现奇异性值分割图像压缩,具体步骤如下: - 读取图像 - 预处理 - 计算奇异性值 - 分割 - 压缩 - 重组 - 显示压缩后的图像
1 简介
根据奇异值分解的基本原理及其特点,给出了运用奇异值分解进行图像压缩的方法.通过简单的例子说明了该方法进行图像压缩的基本过程,给出了压缩流程.并通过MAT-LAB编程对实际图像进行处理,表明了该方法的有效性.
编辑
编辑
2 完整代码
% Read the image into A as a matrix of uint8clc
clear all
close all
[X,map] = imread('witchhead.jpg');
Im = X;
% Convert image from uint8 to doubles for svd
X = im2double(X);
% Seperate
[U_r,S_r,V_r] = svd(X(:,:,1));
[U_g,S_g,V_g] = svd(X(:,:,2));
[U_b,S_b,V_b] = svd(X(:,:,3));
%=============================
% Test Scripts
%=============================
%confirmation checking for red
out_red = U_r*S_r*V_r';
red = X(:,:,1);
%-----------------------------
% S_r has size 640x1138, thus 640 diagonal values
size(S_r)
% Find the largest k singular values
k = 30;
redk = zeros(k,1);
greenk = zeros(k,1);
bluek = zeros(k,1);
% Discovered that the diagonal of the sum matrix is in order
for i = 1:k
redk(i) = S_r(i,i);
greenk(i) = S_g(i,i);
bluek(i) = S_b(i,i);
end
%-----------------------------
% Storage Analysis
initialStorage = 640*1138;
currentStorage = (640+1138)*k+k;
%-----------------------------
% Error Analysis
sume = 0;
for i = 1:640
sume = sume + S_r(i,i) + S_g(i,i) + S_b(i,i);
end
error = sum(redk+greenk+bluek) / sume;
%-----------------------------
NewImage_r = zeros(640,1138);
NewImage_g = zeros(640,1138);
NewImage_b = zeros(640,1138);
for i = 1:k
NewImage_r = NewImage_r + redk(i)* U_r(:,i)*V_r(:,i)';
NewImage_g = NewImage_g + greenk(i) * U_g(:,i)*V_g(:,i)';
NewImage_b = NewImage_b + bluek(i) * U_b(:,i)*V_b(:,i)';
end
%-----------------------------
% Normalize the matrices to fit the rgb format
for i = 1:640
for j = 1:1138
if(NewImage_r(i,j) < 0)
NewImage_r(i,j) = 0;
end
if(NewImage_g(i,j) < 0)
NewImage_g(i,j) = 0;
end
if(NewImage_b(i,j) < 0)
NewImage_b(i,j) = 0;
end
end
end
%-----------------------------
rgbImage = cat(3, NewImage_r, NewImage_g, NewImage_b);
% image(rgbImage);
% image(X);
difference = rgbImasge-X
figure
subplot(121)
imshow(X,[]);title('原图')
subplot(122)
imshow(NewImage_b,[]);title('压缩后的图')
%-----------------------------
3 仿真结果
编辑
4 参考文献
[1]胡乡峰, 卫金茂. 基于奇异值分解(SVD)的图像压缩[J]. 东北师大学报:自然科学版, 2006, 38(3):4.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。

