matlab圖像壓縮演算法
Ⅰ 在matlab中怎樣將1024×1024的圖片隔一個像素點抽取一個像素點壓縮成512×512的圖片
您好,matlab可將圖片處理成為二維矩陣,矩陣大小為1024x1024,然後你需要編寫演算法實現隔一行提取一個像素點,將這些新的像素點保存到新矩陣中,再轉換為圖像就可以了,演算法不要指望別人幫你去編寫,自己想要提高,就要攻克演算法這一關,而且不同的人有不同的方法與理念去實現,謝謝。。。
Ⅱ 請教,MATLAB壓縮演算法效率比較
一般情況下小波的效果是比較好的,基本不涉及信噪比
Ⅲ 常用的matlab圖像壓縮有哪些
常用的matlab圖像壓縮有哪些
法對圖像進行壓縮,得到一組壓縮編碼,然後解碼這組編碼,得到一幅解壓縮圖像.對解碼圖像與原始圖像求差值,得到一差值圖像,然後對該差值圖像進行適當的編碼.對差值圖像的編碼與初級編碼共同構成對原始圖像的編碼.
Ⅳ 如何用MATLAB進行圖像壓縮
I=imread('cameraman.tif');%輸入圖像
I=im2double(I);%數據類型轉換
T=dctmtx(8);%計算二維離散DCT矩陣
dct=@(x)T*x*T';%設置函數句柄
B=blkproc(I,[88],dct);%圖像塊處理
mask=[11110000%掩膜
11100000
11000000
10000000
00000000
00000000
00000000
00000000];
B2=blkproc(B,[88],@(x)mask.*x);%圖像塊處理
invdct=@(x)T'*x*T;%設置函數句柄
I2=blkproc(B2,[88],invdct);%圖像塊處理
imshow(I),figure,imshow(I2)%顯示原始圖像和壓縮重構圖像
Ⅳ MATLAB--數字圖像處理 頻域圖像分析
頻域圖像分析
1.熟悉MATLAB軟體的使用。
2.掌握頻域圖像分析的原理及數學運算。
1.自選一幅圖像,並對其分別添加一定強度的周期雜訊和高斯雜訊,然後分別採用高斯模板、中值濾波的時域方法以及傅里葉變換和小波變換的頻率濾波方法對該含噪圖像進行去噪處理,並基於PSNR值和視覺效果這兩個指標來比較這四種濾波方法對兩種不同雜訊的去噪能力。
2.編寫一個程序,要求實現下列演算法:首先將閣像分割為8x8的子圖像,對每個予圖像進行FFT.對每個了圖像中的64個系數。按照每個系數的方差來排序後,捨去小的變換系數,只保留16個系數,實現4: I的圖像壓縮。
3.給定一幅行和列都為2的整數次幕圖像,用Haar小波基函數對其進行二維小波變換,試著將最低尺度近似分量置零再反變換,結果是什麼?如果把垂直方向的細節分量置零,反變換後結果又是什麼呢?試解釋一下原因。
4.基於小波變換對圖像進行不同壓縮比的壓縮。在同壓縮比情況下,對於基於小波變換和基於傅里葉變換的壓縮結果,比較=二者保留原圖像能里百分比情況。
Win10 64位電腦
MATLAB R2017a
1.傅里葉變換
從純粹的數學意義上看,傅里葉變換是將一個函數轉換為一系列周期函數來處理的。從物理效果看,傅里葉變換是將圖像從空間域轉換到頻率域,其逆變換是將圖像從頻率域轉換到空間域。換句話說,傅里葉變換的物理意義是將圖像的灰度分布函數變換為圖像的頻率分布函數。
傅里葉逆變換是將圖像的頻率分布函數變換為灰度分布函數傅里葉變換以前,圖像(未壓縮的點陣圖)是由對在連續空間(現實空間)上的采樣得到一系列點的集合,通常用一個二維矩陣表示空間上各點,記為z=f(x,y)。又因空間是三維的,圖像是二維的,因此空間中物體在另一個維度上的關系就必須由梯度來表示,這樣我們才能通過觀察圖像得知物體在三維空間中的對應關系。
2.小波變換
小波變換是時間(空間)頻率的局部化分析,它通過伸縮平移運算對信號(函數)逐步進行多尺度細化,最終達到高頻處時間細分,低頻處頻率細分,能自動適應時頻信號分析的要求,從而可聚焦到信號的任意細節帶雜訊信號經過預處理,然後利用小波變換把信號分解到各尺度中,在每一尺度下把屬於雜訊的小波系數去掉,保留並增強屬於信號的小波系數,最後再經過小波逆變換回復檢測信號。
小波變換在去除雜訊時可提取並保存對視覺起主要作用的邊緣信息,而傳統的基於傅里葉變換去除雜訊的方法在去除雜訊和邊沿保持上存在著矛盾,因為傅里葉變換方法在時域不能局部化,難以檢測到局域突變信號,在去除雜訊的同時,也損失了圖像邊沿信息。由此可知,與傅里葉變換去除雜訊的方法相比較,小波變換法去除雜訊具有明顯的性能優勢。
3.PSNR演算法
peak的中文意思是頂點。而ratio的意思是比率或比列的。整個意思就是到達噪音比率的頂點信號,psnr一般是用於最大值信號和背景噪音之間的一個工程項目。通常在經過影像壓縮之後,輸出的影像都會在某種程度與原始影像不同。為了衡量經過處理後的影像品質,我們通常會參考PSNR值來衡量某個處理程序能否令人滿意。它是原圖像與被處理圖像之間的均方誤差相對於(2 n-1) 2的對數值(信號最大值的平方,n是每個采樣值的比特數),它的單位是dB。
SNRP演算法
haar基函數進行小波變換
七、實驗結果與分析
圖 1原圖
1.加入周期雜訊、高斯雜訊
2.對添加了高斯雜訊和周期雜訊的圖像進行高斯濾波
PSNR值
1.對高斯雜訊進行高斯濾波後 23.0287
2.對周期雜訊進行高斯濾波後 23.4837
2.中值濾波
PSNR值:
1.對高斯雜訊進行中值濾波 23.9931
2.對周期雜訊進行中值濾波 24.3134
3.傅里葉變換濾波
PSNR值:
1.對添加了高斯雜訊的圖像進行傅里葉變換濾波 20.4922
2.對添加了周期雜訊的圖像進行傅里葉變換濾波 18.9736
4.小波變換濾波
PSNR值:
1.對添加了高斯雜訊的圖像進行小波變換濾波 23.4712
2.對添加了周期雜訊的圖像進行小波變換濾波 24.4525
分析:
對於高斯雜訊,高斯濾波和傅里葉變換濾波聲的除噪效果較好,中值濾波效果較差,小波變換濾波的處理效果也比較好
對於周期雜訊,中值濾波和高斯濾波效果不是很好,傅里葉變換變換濾波對雜訊的去處效果比較好,對於原圖像損壞不大,小波變換對原圖的損壞較大,但是圖片可以看出雜訊也去除的比較好。
5.圖像壓縮(4:1壓縮) 原圖-左 壓縮後-右
分析:
圖像壓縮演算法就是先將一副圖像分成很多小塊,然後分別對這些小塊進行變換,這里採用的是傅里葉變換,然後過濾掉冗餘的像素點,然後再利用反變換得到壓縮後的圖像即可。
小波變換
1.定義
小波變換是時間(空間)頻率的局部化分析,它通過伸縮平移運算對信號(函數)逐步進行多尺度細化,最終達到高頻處時間細分,低頻處頻率細分,能自動適應時頻信號分析的要求,從而可聚焦到信號的任意細節帶雜訊信號經過預處理,然後利用小波變換把信號分解到各尺度中,在每一尺度下把屬於雜訊的小波系數去掉,保留並增強屬於信號的小波系數,最後再經過小波逆變換回復檢測信號。
2.優點
小波變換在去除雜訊時可提取並保存對視覺起主要作用的邊緣信息,而傳統的基於傅里葉變換去除雜訊的方法在去除雜訊和邊沿保持上存在著矛盾,因為傅里葉變換方法在時域不能局部化,難以檢測到局域突變信號,在去除雜訊的同時,也損失了圖像邊沿信息。由此可知,與傅里葉變換去除雜訊的方法相比較,小波變換法去除雜訊具有明顯的性能優勢。
Haar基函數進行小波變換
圖 2原圖
圖 3 haar變換
圖 4 haar反變換後
圖 5 最低分量近似置零
圖 6 垂直分量置零
小波變換進行圖像壓縮與傅里葉變換壓縮對比
1.壓縮比 1:2(左-小波壓縮 右-傅里葉壓縮)
2.壓縮比 1:4(左-小波壓縮 右-傅里葉壓縮)
通過這次實驗,學到了很多。特別是在傅里葉變換和小波變換等方面,開始的時候連傅里葉變換的基礎基礎也不懂,後來在csdn上看了一篇講解傅里葉變換的文章,豁然開朗,傅里葉變換居然可以將一個時域信號轉化到頻域,而且自己還對與i有了更加深刻的理解。雖然傅里葉變換可以把信號從時域轉換到頻域,但是頻域與時域的對應關系卻無法一一對應,所以誕生了小波變換。小波變換的特別之處就是可以把一個時域上的信息轉換為時域-頻域一一對應,這對應特殊信號的提取是有很好的效果,在一定程度上比傅里葉變換更厲害。但是在傅里葉、小波等基礎概念知識方面,自己還是涉獵的比較少,原理的論證公式太復雜了。
Ⅵ matlab中如何求圖像的壓縮比 (代碼)
I為壓縮前的圖像數據,I1為壓縮後的圖像數據。
[m1
n1]=size(I1);
[m
n]=size(I);
t=m1*n1/(m*n);
那把你要求的壓縮比公式寫一下吧
Ⅶ 如何用MATLAB進行圖像壓縮
1、首先在電腦中雙擊matlab軟體,使用語句:x=0:0.2:7*pi:創建一個一維數組,表示三維離散序列圖的在x軸上的分布范圍。
Ⅷ 圖像壓縮 MATLAB實現 如何解壓縮一個被壓縮過的圖像 急急急
法對圖像進行壓縮,得到一組壓縮編碼,然後解碼這組編碼,得到一幅解壓縮圖像.對解碼圖像與原始圖像求差值,得到一差值圖像,然後對該差值圖像進行適當的編碼.對差值圖像的編碼與初級編碼共同構成對原始圖像的編碼.這種方法需要選擇合適的初級編碼方法與差值編碼方法,使得這兩者相結合,可以得到一種綜合性能較好的編碼方法。
其定義如圖。
%%%%%%%%%%%%%%
clear
tic
%Image1=imread('pic\cameraman.tif');
xianshi;
number=input(' input the number:');
Image1=suoxiao('pic\cameraman.tif',number);
[imagem imagen]=size(Image1);
Sr=4;Sd=8;
Rnum=(imagem/Sr)*(imagen/Sr);
Dnum=(imagem/Sd)*(imagen/Sd);
Image2=zeros(Dnum,Sr,Sr);
Image2=blkproc(Image1,[Sd/Sr,Sd/Sr],'mean(mean(x))');
%壓縮image1為原來1/2
% there are no eight tranformation for simpleness
RBlocks=zeros(Rnum,Sr,Sr);
DBlocks=zeros(Dnum,Sd,Sd);
DBlocksRece=zeros(Dnum*8,Sr,Sr);
%%取R塊,K記標號----------------------------------
for i=1:imagem/Sr
for j=1:imagen/Sr
k=(i-1)*imagen/Sr+j;
RBlocks(k,:,:)=Image1((i-1)*Sr+1:i*Sr,(j-1)*Sr+1:j*Sr);
end
end
%取R塊,K記標號----------------------------------
for i=1:imagem/Sd
for j=1:imagen/Sd
k=(i-1)*imagen/Sd+j;
m=Sr;n=Sr;
DBlocksRece(k,:,:)=Image2((i-1)*Sr+1:i*Sr,(j-1)*Sr+1:j*Sr);
DBlocksRece(k+Dnum,:,:)=DBlocksRece(k,m:-1:1,:); % 行上下翻轉===(x軸對稱)
DBlocksRece(k+2*Dnum,:,:)=DBlocksRece(k,:,n:-1:1); % 列左右翻轉 ==== y軸對稱
DBlocksRece(k+3*Dnum,:,:)=DBlocksRece(k,m:-1:1,n:-1:1); % 先行翻,再列翻 旋轉180度
DBlocksRece(k+4*Dnum,:,:)=reshape(DBlocksRece(k,:,:),Sr,Sr)'; % 關於y=-x對稱
A=reshape( DBlocksRece(k+3*Dnum,:,:),Sr,Sr)';
DBlocksRece(k+5*Dnum,:,:)=A(:,n:-1:1); % 關於y=x對稱
DBlocksRece(k+6*Dnum,:,:)=imrotate(reshape(DBlocksRece(k,:,:),Sr,Sr),90); % 逆時針旋轉90度
DBlocksRece(k+7*Dnum,:,:)=imrotate(reshape(DBlocksRece(k,:,:),Sr,Sr),270); % 逆時針旋轉270度
DBlocks(k,:,:)=Image1((i-1)*Sd+1:i*Sd,(j-1)*Sd+1:j*Sd);
end
end
RandDbest=zeros(Rnum,1)+256^3;
RandDbests=zeros(Rnum,1);
RandDbesto=zeros(Rnum,1);
RandDbestj=zeros(Rnum,1);
for i=1:Rnum
x=reshape(RBlocks(i,:,:),Sr*Sr,1);
meanx=mean(x);
for j=1:Dnum*8
y=reshape(DBlocksRece(j,:,:),Sr*Sr,1);
meany=mean(y);
s=(x-meanx)'*(y-meany)/((y-meany)'*(y-meany));%計算s
o=(meanx-s*meany);%計算o
c=(x-s*y-o)'*(x-s*y-o);%距離
if (RandDbest(i)>c)&(abs(s)<1)
RandDbest(i)=c;
RandDbests(i)=s;
RandDbesto(i)=o;
RandDbestj(i)=j;%可以找到對應變換和D塊
end
end
end
%iteration limit
toc
tic
m=8;%解碼迭代次數
e=mean(mean(Image1));
Image3=e*ones(imagem,imagen);%解碼初始圖象
for L=1:m
Image4=blkproc(Image3,[Sd/Sr,Sd/Sr],'mean(mean(x))');
for i=1:imagem/Sr
for j=1:imagen/Sr
m=Sr;n=Sr;
k=(i-1)*imagen/Sr+j;
l=RandDbestj(k);
k1=mod(l-1,Dnum)+1;%第幾個D
l1=(l-k1)/Dnum+1;%變換號
%R對應D在Image4的起始點
j1=mod(k1-1,imagen/Sd)+1;
i1=(k1-j1)/(imagen/Sd)+1;
%變換------------------------------------------------------------------------
DBlocksRece(k1,:,:)=Image4((i1-1)*Sr+1:i1*Sr,(j1-1)*Sr+1:j1*Sr);
switch l1-1
case 0
DBlocksRece(l,:,:)=Image4((i1-1)*Sr+1:i1*Sr,(j1-1)*Sr+1:j1*Sr);
case 1
DBlocksRece(l,:,:)=DBlocksRece(k1,m:-1:1,:);
case 2
DBlocksRece(l,:,:)=DBlocksRece(k1,:,n:-1:1);
case 3
DBlocksRece(l,:,:)=DBlocksRece(k1,m:-1:1,n:-1:1);
case 4
DBlocksRece(l,:,:)=reshape(DBlocksRece(k1,:,:),Sr,Sr)';
case 5
DBlocksRece(k1+3*Dnum,:,:)=DBlocksRece(k1,m:-1:1,n:-1:1);
A=reshape( DBlocksRece(k1+3*Dnum,:,:),Sr,Sr)';
DBlocksRece(l,:,:)=A(:,n:-1:1);
case 6
DBlocksRece(l,:,:)=imrotate(reshape(DBlocksRece(k1,:,:),Sr,Sr),90);
case 7
DBlocksRece(l,:,:)=imrotate(reshape(DBlocksRece(k1,:,:),Sr,Sr),270);
end
%變換結束--------------------------------------------------------------------
RBlocks(k,:,:)=RandDbests(k)*DBlocksRece(l,:,:)+RandDbesto(k);
%生成R---------------------------
Image3((i-1)*Sr+1:i*Sr,(j-1)*Sr+1:j*Sr)=reshape(RBlocks(k,:,:),Sr,Sr);%更新迭代圖象
end
end
wucha=double(Image1)-Image3;%誤差圖
Ps1(L)=20*log10(255/(sqrt(mean(mean(wucha.^2)))))
PSNR=psnr(wucha)
figure
imshow(uint8(Image3))
end
toc
figure
wucha=uint8(wucha);
imshow(wucha)
figure
imshow(uint8(Image1)),title('原圖');
save('sa.mat')
fangtu(wucha);%%%%分形主函數
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
子函數:1:
function b=suoxiao(filename,bili)
a=imread(filename);
a=double(a);
[m,n]=size(a);
i=1;
while i=m/bili
j=1;
while j=n/bili
k=mean(mean(a(bili*(i-1)+1:bili*(i-1)+bili,bili*(j-1)+1:bili*(j-1)+bili)));
b(i,j)=k;
j=j+1;
end
i=i+1;
end
%b=uint8(b);
size(b)
%imshow(b)
子函數2:
%clc
function fangtu(a)
J=a;
%計算灰度圖象的直方圖數據,a為如象數組
L=256; %灰度級
Ps = zeros(L,1); %統計直方圖結果數據
nk=zeros(L,1);
[row,col]=size(a);
n=row*col; %總像素個數
for i = 1:row
for j = 1:col
num = double(a(i,j))+1; %獲取像素點灰度級
nk(num) = nk(num)+1; %統計nk
end
end
%計算直方圖概率估計
for i=1:L
Ps(i)=nk(i)/n;
end
figure;
subplot(3,1,1);imshow(J),title('誤差圖');
subplot(3,1,2),plot(nk),title('直方圖(nk)');
subplot(3,1,3),plot(Ps),title('直方圖(Ps)');
子函數3:
function PSNR=psnr(a)
[m,n]=size(a);
a=uint8(a);
a=double(a);
imagesize=m*n;
MSE=sum(dot(a,a))/ imagesize;
PSNR=10*log10(255^2/MSE);
%%%%%%%%%%%%%%%%%%%%%%
說明:
1、因為本程序時間長,FX中先選擇圖片的大小
2、編碼與解碼
3、做誤差圖和只方圖
4:畫出每次迭代的解碼圖象
Ⅸ matlab中如何求圖像的壓縮比 (代碼)
I=imread('文件名');
save Idata.mat
I1=whos('-file', 'Idata');
Bytes=I1.bytes; %原圖大小
壓縮圖進行同樣的操作,只要比較兩個圖像的Bytes就可以了吧