一、圖像的代數運算(醫學圖像處理、圖像誤差檢測)
首先把圖像轉換成與Matlab基本代數符類型相容的雙精度浮點型,再利用Matlab的代數運算符實現圖像的代數運算。
1.圖像的加法運算
>> i=imread('rice.png');
>> j=imread('cameraman.tif');
>> k=imadd(i,j,'uint16');
>> subplot(1,3,1);imshow(i);title('原始圖像rice');
>> subplot(1,3,2);imshow(j);title('原始圖像cameraman');
>> subplot(1,3,3);imshow(k);title('兩幅圖像疊加');
>> subplot(1,3,3);imshow(k,[]);title('兩幅圖像疊加');
imshow(K)直接顯示灰度圖像K
imshow(K,[])顯示K,並將K的最大值和最小值分別作爲純白(255)和純黑(0),中間的K值映射爲0-255之間的標準灰度值。
2.添加噪聲
- 添加高斯噪聲,m,v分別爲噪聲的均值與方差,默認m=0,b=0.01
- 添加椒鹽噪聲,d分別爲噪聲的密度,默認爲0.05
- 添加噪聲,通用的格式:
>> i=imread('eight.tif');
>> j=imnoise(i,'salt & pepper',0.04);
>> subplot(1,2,1);imshow(i);title('原始圖像');
>> subplot(1,2,2);imshow(j);title('添加椒鹽噪聲的圖像');
利用多圖像的平均可以降低圖像的噪聲
對於原圖像,假設有一個噪聲圖像集:
一般噪聲滿足零期望:
如果用均值來估計噪聲分佈的期望,則有:
所以可以降低圖像的噪聲。
>> 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(1,3,1);imshow(i);title('原始圖像');
>> subplot(1,3,2);imshow(j1);title('添加高斯噪聲的圖像');
>> subplot(1,3,3);imshow(K,[]);title('抑制高斯噪聲的圖像');
3.圖像的減法(差分)運算(檢測變化及運動的物體)
- 消除背景法
>> i=imread('rice.png');
>> background=imopen(i,strel('disk',15));
>> j=imsubtract(i,background);
>> figure;
>> subplot(1,3,1);imshow(i);title('原始圖像rice');
>> subplot(1,3,2);imshow(background);title('背景圖像');
>> subplot(1,3,3);imshow(j,[]);title('去除背景的圖像');
減法操作時有時會導致某些像素值爲負數,這時函數會自動截取爲0,也可以調用imabsdiff函數實現。
i=imread('cameraman.tif');
subplot(1,3,1);imshow(i);title('原始圖像');
j=uint8(filter2(fspecial('gaussian'),i));
subplot(1,3,2);imshow(j);title('含噪圖像');
k=imabsdiff(i,j);
subplot(1,3,3);imshow(k,[]);title('兩幅圖像相減');
- 差影法
同一景物在不同時間拍攝的圖像或同一景物在不同波段的圖像相減。
差影法用於自動現場監測、運動目標的檢測和跟蹤、消除背景及目標識別等。
差影法檢測變化:
i=imread('eight1.png');
j=imread('eight.png');
k=imabsdiff(i,j);
figure;
subplot(1,3,1);imshow(i);title('T1時刻的狀態');
subplot(1,3,2);imshow(j);title('T2時刻的狀態');
subplot(1,3,3);imshow(k);title('兩個時刻的狀態區別');
4.圖像的乘法運算
>> i0=imread('rice.png');
>> i=rgb2gray(i0);
>>subplot(2,2,1);imshow(i);title('原始圖像');
>>i16=uint16(i);
>>j=immultiplt(i);
>>subplot(2,2,2);imshow(j);title('圖像自身相乘效果');
>>k=immultiply(i,0.65);
>>subplot(2,2,3);imshow(k);title('圖像與常數0.65相乘效果');
>>k=immultiply(i,3);
>>subplot(2,2,4);imshow(k);title('圖像與常數3相乘效果');
5.圖像的除法運算(校正成像設備的非線性影響,在醫學圖像處理常用)
>> i0=imread('street.jpg');
>>j0=imread('street1.jpg');
>>i=rgb2gray(i0);
>>j=rgb2gray(j0);
>>subplot(2,3,1);imshow(i0);title('原始彩色圖像');
>>subplot(2,3,2);imshow(j0);title('反色彩色圖像');
>>subplot(2,3,3);imshow(i);title('原始灰度圖像');
>>k=imdivide(j,i);
>>k1=imdivie(i,0.3);
>>k2=imdivide(i,1.2);
>>subplot(2,3,4);imshow(k);title('圖像相除的效果');
>>subplot(2,3,5);imshow(k1);title('圖像與常數0.65相除的效果');
>>subplot(2,3,6);imshow(k2);title('圖像與常數3相除的效果');
二、圖像的鄰域運算(圖像濾波、形態學運算)
對圖像的像素進行處理時,不僅需要輸入該像素本身的灰度,還要輸入以該像素爲中心某局部區域的一些像素的灰度進行運算的方式,稱爲圖像鄰域運算
1、滑動鄰域處理
- 滑動鄰域操作每次在一個像素上進行。
- 輸出圖像的每個像素值都是輸入圖在這個像素鄰域內進行指定的運算得到的像素值。
一般算法:
- 選擇一個像素
- 確定這個像素的鄰域
- 對鄰域的像素值應用指定的函數進行計算
- 返回輸出圖像的像素值,其位置位於輸入圖像鄰域的中心位置
- 對圖像中的每個像素重複上面四個步驟。
>> A=imread('cameraman.tif');
>> A=im2double(A);
>> fun=@(x)median(x(:));
>> B=nlfilter(A,[3,3],fun);
>> subplot(1,2,1);imshow(A);title('原始圖像');
>> subplot(1,2,2);imshow(B);title('鄰域操作');
2、快速鄰域操作
當進行滑動鄰域操作的時候,可以使用列處理來加快處理的速度。
在matlab中,進行列處理的函數爲colfilt,可以實現:
- 將圖像的一個滑動塊轉化爲一個臨時矩陣的列
- 使用指定的函數對臨時矩陣進行操作
- 把結果矩陣變爲原來的形狀
調用格式:
圖像塊的大小爲m*n,block_type爲快速移動方式,'distinct’表示圖像不重疊,'sliding’表示圖像滑動,函數fun爲作用於圖像鄰域上的處理函數。
>> A=imread('cameraman.tif');
>>A=im2double(A);
>> fun=@(x)ones(9,1)*median(x);
>> B=colfilt(A,[3 3],'distinct',fun);
>> subplot(1,2,1);imshow(A);title('原始圖像');
>>subplot(1,2,2);imshow(B);title('快速鄰域操作');
三、圖像的幾何運算(圖像配準、校正)
通過把輸入圖像的像素的位置映射到一個新位置達到改變原圖像顯示效果的目的,稱爲圖像的幾何運算。
1、 圖像的旋轉
矩陣變換表示:
編程實現圖像的旋轉:
>>i=imread('football.jpg');
>> subplot(3,2,1);imshow(i);title('原始圖像');
>> i1=imrotate(i,60);
>> i2=imrotate(i,-30);
>> i3=imrotate(i,60,'bicubic','crop');
>> i4=imrotate(i,-30,'bicubic','loose');
>> subplot(3,2,3);imshow(i1);title('逆時針旋轉60度');
>> subplot(3,2,4);imshow(i2);title('順時針旋轉30度');
>> subplot(3,2,5);imshow(i3);title('裁剪逆時針旋轉60度');
>> subplot(3,2,6);imshow(i4);title('裁剪順時針旋轉30度');
結果顯示:
2、圖像的縮放
- 比例縮小變換
基於等間隔採樣的圖像縮小方法
編程實現圖像的縮放:
>> i=imread('football.jpg');
>> figure:imshow(i);title('原始圖像');
>> j=imresize(i,0.125);
>> figure:imshow(j);title('縮小的圖像');
2. 比例放大變換
一般採用灰度插值法對圖像進行放大
Matlab提供三種插值法:
- [ ] 最近鄰插值
- [ ] 雙線性插值法
- [ ] 雙三次插值法
Matlab提供interp2函數用於圖像的插值,格式爲:
>> i=imread('football.jpg');
>> j=imresize(i,0.125);
>> j=rgb2gray(j);
>> j1=interp2(j,8,'nearest');%最近鄰插值
>> j1=uint8(j1);
>> subplot(2,2,1);imshow(j1);title('最近鄰插值');
>> j2=interp2(double(j),8,'linear');
>> j2=uint8(j2);subplot(2,2,2);imshow(j2);title('線性插值');
>> j3=interp2(double(j),8,'spline');
>> j3=uint8(j3);subplot(2,2,4);imshow(j3);title('三次樣條插值');
>> j4=interp2(double(j),8,'cubic');
>> j4=uint8(j4);subplot(2,2,3);imshow(j4);title('立方插值');
Z:需要插值的圖像
Ntimes:放大的倍數
Method:可選的參數,插值的方法
- Nearest:最近鄰插值
- Linear:雙線性插值法
- Spline:三次樣條插值法
- Cubic:雙三次插值法
3、圖像的裁剪
- 自動截圖
I2=imcrop(I,rect);
X2=imcrop(X,MAP,rect);
RGB2=imcrop(RGB,rect); - 鼠標手動截圖
[Img0,rect]=imcrop(Img);
4、圖像的鏡像變換(水平、垂直和對角鏡像)
- 水平鏡像
矩陣變換表示:
- 垂直鏡像
矩陣變換表示:
- 對角鏡像
矩陣變換表示:
>> i=imread('football.jpg');
>> i1=double(i);
>> subplot(2,2,1);imshow(uint8(i1));title('原始圖像');
>> H=size(i1);
>> i2(1:H(1),1:H(2),1:H(3))=i1(H(1):-1:1,1:H(2),1:H(3));
>> subplot(2,2,2);imshow(uint8(i2));title('垂直圖像');
>> i3(1:H(1),1:H(2),1:H(3))=i1(1:H(1),H(2):-1:1,1:H(3));
>> subplot(2,2,3);imshow(uint8(i3));title('水平圖像');
>> i4(1:H(1),1:H(2),1:H(3))=i1(H(1):-1:1,H(2):-1:1,1:H(3));
>> subplot(2,2,4);imshow(uint8(i4));title('對角圖像');
5、圖像的平移
矩陣變換表示:
Matlab沒有提供專門的函數實現圖像的平移,需要自定義平移函數。
不考慮溢出函數:
function J = translation(I,a,b)
%I爲輸入圖像,a,b描述I沿着X軸、Y軸移動距離
%不考慮溢出情況
[M,N,G]=size(I);
I=im2double(I);%將圖像數據類型轉換爲雙精度
J=ones(M,N,G);%初始化新的圖像矩陣爲全1矩陣
for i=1:M;
for j=1:N
%判斷平移後行列座標是否超出範圍
if((i+a)>=1&&(i+a)<=M&&(j+b)>=1&&(j+b)<=N)
J(i+a,j+b,:)=I(i,j,:);%圖像平移
end
end
end
主程序:
>> i=imread('football.jpg');
>> a=90;b=90;
>> j1=translation(i,a,b);subplot(2,2,1);imshow(j1);axis on;title('右下平移圖像');
>> a=-90;b=-90;
>> j2=translation(i,a,b);subplot(2,2,2);imshow(j2);axis on;title('左上平移圖像');
>> a=-90;b=90;
>> j3=translation(i,a,b);subplot(2,2,3);imshow(j3);axis on;title('右上平移圖像');
>> a=90;b=-90;
>> j4=translation(i,a,b);subplot(2,2,4);imshow(j4);axis on;title('左下平移圖像');
考慮溢出函數:
function J = translation(I,a,b)
%I爲輸入圖像,a,b描述I沿着X軸、Y軸移動距離
%考慮溢出情況,採用擴大顯示區域的方法
[M,N,G]=size(I);
I=im2double(I);%將圖像數據類型轉換爲雙精度
J=ones(M+abs(a),N+abs(b),G);%初始化新的圖像矩陣爲全1矩陣,大小根據xy平移的範圍確定
for i=1:M;
for j=1:N;
if(a<0&&b<0)
J(i,j,:)=I(i,j,:);%如果進行左上移動,對新圖像矩陣進行賦值
elseif(a>0&&b>0)
J(i+a,j+b,:)=I(i,j,:);%如果進行右下移動,對新圖像矩陣進行賦值
elseif(a>0&&b<0)
J(i+a,j,:)=I(i,j,:);%如果進行右上移動,對新圖像矩陣進行賦值
else
J(i,j+b,:)=I(i,j,:);%如果進行左下移動,對新圖像矩陣進行賦值
end
end
end