1. 程式人生 > >matlab影象的代數運算

matlab影象的代數運算

影象的加法運算

影象相加可以得到影象的疊加效果。也可以把同一景物的多重影像加起來求平均,以便減少影象的隨機噪聲。

Z=imadd(X,Y),對X 和Y陣列中對應元素相加,返回值Z和X,Y大小一致。如果Y為標量,則X陣列中每個元素加上這個變數。該函式類似矩陣的加法運算,但要注意型別的處理。

%利用imadd函式實現兩幅影象的疊加
I=imread('rice.png');
J=imread('cameraman.tif');
K=imadd(I,J,'uint16');
subplot(131);imshow(I);
title('原始影象1');
subplot(132);imshow(J);
title('原始影象2');
subplot(133);imshow(K,[]);
title('兩幅圖疊加');

結果:

 

J = imnoise(I,type)

向亮度圖I中新增指定型別的噪聲。type是字串,可以是以下值。

 ''gaussian''(高斯噪聲);''localvar''(均值為零,且一個變數與影象亮度有關);''poisson''(泊松噪聲);''salt&pepper''(椒鹽噪聲);''speckle''(乘性噪聲)

J = imnoise(I,type,parameters) 《Simulink與訊號處理》

根據噪聲型別,可以確定該函式的其它引數。所有的數值引數都進行歸一化處理,它們對應於亮度從0到1的影象操作。

J = imnoise(I,'gaussian',m,v)

將均值為m,方差為v的高斯噪聲新增到影象I中。預設值為均值是0,方差是0.01的噪聲。 《Simulink與訊號處理》

J = imnoise(I,'localvar',V)

將均值為0,區域性方差為v的高斯噪聲新增到影象I上。其中V是與f大小相同的一個數組,它包含了每個點的理想方差值。

J = imnoise(I,'localvar',image_intensity,var)

將均值為0的高斯噪聲新增到影象I上,其中噪聲的區域性方差var是影象I的亮度值的函式。參量image_intensity和var是大小相同的向量,plot(image_intensity,var)繪製出噪聲方差和影象亮度的函式關係。向量image_intensity必須包含範圍在[0,1]內的歸一化亮度值。

J = imnoise(I,'poisson')

從資料中生成泊松噪聲,而不是將人工的噪聲新增到資料中。為了遵守泊松統計,uint8類和uint16類影象的亮度必須和光子的數量相符合。每當畫素的光子數大於65535(但小於10e12)時,就要使用雙精度影象。亮度值在0和1之間變化,並且對應於光子的數量除以10e12

J = imnoise(I,'salt & pepper',d)

 用椒鹽噪聲汙染影象I,其中d是噪聲密度。因此,大約有d*numel(f)個畫素受到了影響。預設的噪聲密度為0.05.

 J = imnoise(I,'speckle',v)

 用方程g=f+n*f將乘性噪聲新增到影象I上,其中n是均值為0,方差為v的均勻分佈的隨機噪聲。v的預設值為0.04.

%利用imnoise函式為影象新增椒鹽噪聲
I=imread('eight.tif');
J=imnoise(I,'salt & pepper',0.04);
subplot(121);imshow(I);
title('原始影象');
subplot(122);imshow(J);
title('新增椒鹽噪音的影象');

結果:

%利用imadd函式對加噪聲的影象進行噪聲抑制
I=imread('eight.tif');
J1=imnoise(I,'gaussian',0,0.006);
J2=imnoise(I,'gaussian',0,0.006);
J3=imnoise(I,'gaussian',0,0.006);
J4=imnoise(I,'gaussian',0,0.006);
K=imlincomb(0.3,J1,0.3,J2,0.3,J3,0.3,J4);
figure;
subplot(131);imshow(I);
title('原始影象');
subplot(132);imshow(J1);
title('新增高斯噪聲的影象');
subplot(133);imshow(K,[])
title('抑制高斯噪聲的影象');

結果:

影象減法運算 

影象相減常用於檢測變化及運動的物體,影象相減運算又稱影象差分運算。差分方法可以分為可控制環境下的簡單差分方法和基於背景模型的差分方法。在可控制環境下,或者很短的時間間隔內,可認為背景是不變的,可以直接使用差分運算檢測變化或韻達物體。

消除背景法:

%利用imsubtract函式去除影象的背景
I=imread('rice.png');
background=imopen(I,strel('disk',15));
Ip=imsubtract(I,background);
figure;
subplot(131);imshow(I)
title('原始影象');
subplot(132);imshow(background);
title('背景圖');
subplot(133);imshow(Ip,[]);
title('去除背景圖');

結果:

 

 絕對值函式imabsdiff

%利用imabsdiff進行影象減法運算
I=imread('cameraman.tif');
J=uint8(filter2(fspecial('gaussian'),I));
K=imabsdiff(I,J);
subplot(131);imshow(I);
title('原始影象');
subplot(132);imshow(J)
title('含噪影象');
subplot(133);imshow(K,[]);
title('兩幅圖相減');

結果:
 

影象乘法運算 

%對影象進行自乘和與一個常數相乘
I=imread('eight.tif');
subplot(221);imshow(I);
title('原始影象');
I16=uint16(I);
J=immultiply(I16,I16);
subplot(222);imshow(J);
title('影象自乘效果');
J2=immultiply(I,0.5);
subplot(223);imshow(J2);
title('與常數相乘');

結果:

 

影象除法運算 

%利用imdivide函式對影象進行除法運算
I=imread('office_1.jpg');
J=imread('office_2.jpg');
Ip=imdivide(J,I);
K=imdivide(J,0.45);
subplot(221);imshow(I);
title('office1影象');
subplot(222);imshow(J);
title('office2影象');
subplot(223);imshow(Ip);
title('兩副影象相除');
subplot(224);imshow(K);
title('影象與常數相除');

結果: