这是上学期数字图像处理的作业,老师要我们比较dft,wht,dct种变换进行压缩后的效果比较,鄙人熬了两夜做了些小东西,为方便后人做的更好,也为了尽少周折,特上传程序至此,程序质量很低,欢迎各位提出宝贵意见。
首先是图片分割程序,有人用mat2cell之类的,因为cell概念还不是很清楚,我就用了很笨的方法做循环,将一个大的图片处理后变成4维的数组,4维数组中前2维是图片的横纵左边,后两维是子图片在大图片的位置,由此实现图片的分割。是不是很笨啊。
- function sub_image=div_image(scr_image,SUBSIZE)
- % 功能:将scr_image按SUBSIZE*SUBSIZE大小分割
- % 输入:scr_image:待处理的图片,SUBSIZE子图片大小
- % 输出:sub_image:子图片集合,p,q为序号
- % 注意:仅能处理二维图片,即灰度级图片
- %
- % Edit by lineter
- % QQ:542375845
- % Ningxia daxue
- %
- % 示例:
- %
- % a=imread('jinbo.bmp');
- % a=rgb2gray(a);
- % b=div_image(a,16);
- % size(b)
- %
- % ans =
- %
- % 16 16 32 32
- %
- if(ndims(scr_image)==3)
- scr_image=rgb2gray(scr_image);
- end
- [x,y]=size(scr_image);
- for p=1:round(x/SUBSIZE)
- for q=1:round(y/SUBSIZE)
- sub_image(:,:,p,q)= ...
- scr_image(SUBSIZE*(p-1)+1:SUBSIZE*p,SUBSIZE*(q-1)+1:SUBSIZE*q);
- end
- end
- if(mod(x,SUBSIZE)~=0 || mod(y,SUBSIZE)~=0)
- disp('警告,图片边缘可能丢失!');
- end
function sub_image=div_image(scr_image,SUBSIZE)
% 功能:将scr_image按SUBSIZE*SUBSIZE大小分割
% 输入:scr_image:待处理的图片,SUBSIZE子图片大小
% 输出:sub_image:子图片集合,p,q为序号
% 注意:仅能处理二维图片,即灰度级图片
%
% Edit by lineter
% QQ:542375845
% Ningxia daxue
%
% 示例:
%
% a=imread('jinbo.bmp');
% a=rgb2gray(a);
% b=div_image(a,16);
% size(b)
%
% ans =
%
% 16 16 32 32
%
if(ndims(scr_image)==3)
scr_image=rgb2gray(scr_image);
end
[x,y]=size(scr_image);
for p=1:round(x/SUBSIZE)
for q=1:round(y/SUBSIZE)
sub_image(:,:,p,q)= ...
scr_image(SUBSIZE*(p-1)+1:SUBSIZE*p,SUBSIZE*(q-1)+1:SUBSIZE*q);
end
end
if(mod(x,SUBSIZE)~=0 || mod(y,SUBSIZE)~=0)
disp('警告,图片边缘可能丢失!');
end
很笨很笨的方法,有用自带函数实现分割的请告诉我,非常感谢。
对应的合并图片方法如下:
- function image=sum_image(div_image)
- % 功能:将scr_image合并成一张图片
- % 输入:scr_image:待处理的图片集合
- % 输出:sub_image:生成图片
- % 注意:仅能处理二维图片,即灰度级图片
- %
- % Edit by lineter
- % QQ:542375845
- % Ningxia daxue
- %
- % 示例:
- %
- % a=imread('jinbo.bmp');
- % a=rgb2gray(a);
- % b=div_image(a,16);
- % size(b)
- %
- % ans =
- %
- % 16 16 32 32
- %
- if(ndims(div_image)~=4)
- disp('图像格式错误,不是图像集合');
- end
- [x,y,m,n]=size(div_image);
- if(x~=y || m~=n)
- disp('图像大小不正确');
- end
- image=[];
- for p=1:m
- for q=1:m
- image((x.*(p-1)+1):(x.*p),(x.*(q-1)+1):(x.*q)) = uint8( div_image(:,:,p,q));
- end
- end
- image=uint8(image);
function image=sum_image(div_image)
% 功能:将scr_image合并成一张图片
% 输入:scr_image:待处理的图片集合
% 输出:sub_image:生成图片
% 注意:仅能处理二维图片,即灰度级图片
%
% Edit by lineter
% QQ:542375845
% Ningxia daxue
%
% 示例:
%
% a=imread('jinbo.bmp');
% a=rgb2gray(a);
% b=div_image(a,16);
% size(b)
%
% ans =
%
% 16 16 32 32
%
if(ndims(div_image)~=4)
disp('图像格式错误,不是图像集合');
end
[x,y,m,n]=size(div_image);
if(x~=y || m~=n)
disp('图像大小不正确');
end
image=[];
for p=1:m
for q=1:m
image((x.*(p-1)+1):(x.*p),(x.*(q-1)+1):(x.*q)) = uint8( div_image(:,:,p,q));
end
end
image=uint8(image);
这样处理后就把图片合并出来了,在这两个函数中间就可以做些变换压缩之类的,恢复后和原图比较就可以知道压缩效果的好坏了。