數字圖像處理_圖像基本運算


圖像基本運算

1點運算

 線性點運算是指輸入圖像的灰度級與輸出圖像呈線性關系。
s=ar+b
  (r為輸入灰度值,s為相應點的輸出灰度值)。
  當a=1,b=0時,新圖像與原圖像相同;
  當a=1,b≠0時,新圖像是原圖像所有像素的灰度值上移或下移,是整個圖像在顯示時更亮或更暗;
  當a>1時,新圖像對比度增加;
  當a<1時,新圖像對比度降低;
  當a<0時,暗區域將變亮,亮區域將變暗,點運算完成了圖像求補;

  非線性點運算是指輸入與輸出為非線性關系,常見的非線性灰度變換為對數變換和冪次變換,對數變換一般形式為:

s=clog(1+r)
其中c為一常數,並假設r≥0.此變換使窄帶低灰度輸入圖像映射為寬帶輸出值,相對的是輸出灰度的高調整。

 

 1 x=imread('D:/picture/DiaoChan.jpg');
 2 subplot(2,2,1)
 3 imshow(x);
 4 title('原圖');
 5 J=0.3*x+50/255;
 6 subplot(2,2,2);
 7 imshow(J);
 8 title('線性點變換');
 9 subplot(2,2,3);
10 x1=im2double(x);
11 H=2*log(1+x1);
12 imshow(H)
13 title('非線性點運算');%對數運算

冪次變換一般形式:s=cr^γ

冪級數γ部分值把窄帶暗值映射到寬帶輸出值

下面是非線性點運算的冪運算

 

1 I=imread('D:/picture/DiaoChan.jpg');
2 subplot(2,2,1);
3 imshow(I);title('原始圖像','fontsize',9);
4 subplot(2,2,2);
5 imshow(imadjust(I,[],[],0.5));title('Gamma=0.5');
6 subplot(2,2,3);
7 imshow(imadjust(I,[],[],1));title('Gamma=1');
8 subplot(2,2,4);
9 imshow(imadjust(I,[],[],1.5));title('Gamma=1.5');

 



2代數運算和邏輯運算

加法運算去噪處理

 

 1 clear all
 2 i=imread('lenagray.jpg');
 3 imshow(i)
 4 j=imnoise(i,'gaussian',0,0.05);
 5 [m,n]=size(i);
 6 k=zeros(m,n);
 7 for l=1:100
 8     j=imnoise(i,'gaussian',0,0.05);
 9     j1=im2double(j);
10     k=k+j1;
11 End
12 k=k/100;
13 subplot(1,3,1),imshow(i),title('原始圖像')
14 subplot(1,3,2),imshow(j),title('加噪圖像')
15 subplot(1,3,3),imshow(k),title(‘求平均后的

 

 

 減法運算提取噪聲

1 I=imread(‘lena.jpg’);
2 J=imnoise (I,‘lena.jpg’,0,0.02);
3 K=imsubtract(J,I);
4 K1=255-K;
5 figure;imshow(I);
6 figure;imshow(J);
7 figure;imshow(K1);

乘法運算改變圖像灰度級

1 I=imread('D:/picture/SunShangXiang.jpg')
2 I=im2double(I);
3 J=immultiply(I,1.2);
4 K=immultiply(I,2);
5 subplot(1,3,1),imshow(I);subplot(1,3,2),imshow(J);
6 subplot(1,3,3);imshow(K);

 邏輯運算

 1 A=zeros(128);
 2 A(40:67,60:100)=1;
 3 figure(1)
 4 imshow(A);
 5 B=zeros(128);
 6 B(50:80,40:70)=1;
 7 figure(2)
 8 imshow(2);
 9 C=and(A,B);%10 figure(3);
11 imshow(3);
12 D=or(A,B);%13 figure(4);
14 imshow(4);
15 E=not(A);%16 figure(5);
17 imshow(E);

 

3幾何運算

平移運算實現圖像的平移

 

 1 I=imread('lenagray.jpg');
 2 subplot(1,2,1);
 3 imshow(I);
 4 [M,N]=size(I);g=zeros(M,N);
 5 a=20;b=20;
 6 for i=1:M
 7     for j=1:N
 8         if((i-a>0)&(i-a<M)&(j-b>0)&(j-b<N))
 9             g(i,j)=I(i-a,j-b);
10         else
11             g(i,j)=0;
12         end
13     end
14 end
15 subplot(1,2,2);imshow(uint8(g));

 

水平鏡像變換

1 I=imread('lena.jpg');
2 subplot(121);imshow(I);
3 [M,N]=size(I);g=zeros(M,N);
4 for i=1:M
5     for j=1:N
6         g(i,j)=I(i,N-j+1);
7     end
8 end
9 subplot(122);imshow(uint8(g));

 垂直鏡像變換

1 I=imread('lena.jpg');
2 subplot(121);imshow(I);
3 [M,N]=size(I);g=zeros(M,N);
4 for i=1:M
5     for j=1:N
6         g(i,j)=I(M-i+1,j);
7     end
8 end
9 subplot(122);imshow(uint8(g));

 

 圖像的旋轉

 1 x=imread('D:/picture/DiaoChan.jpg');
 2 imshow(x);
 3 j=imrotate(x,45,'bilinear');
 4 k=imrotate(x,45,'bilinear','crop');
 5 subplot(1,3,1),imshow(x);
 6 title(‘原圖')
 7 subplot(1,3,2),imshow(j);
 8 title(‘旋轉圖(顯示全部)')
 9 subplot(1,3,3),imshow(k);
10 title(‘旋轉圖(截取局部)')

幾種插值法比較

1 i=imread('lena.jpg');
2 j1=imresize(i,10,'nearest');
3 j2=imresize(i,10,'bilinear');
4 j3=imresize(i,10,'bicubic');
5 subplot(1,4,1),imshow(i);title(‘原始圖像')
6 subplot(1,4,2),imshow(j1);title(‘最近鄰法')
7 subplot(1,4,3),imshow(j2);title(‘雙線性插值法')
8 subplot(1,4,4),imshow(j3);title(‘三次內插法')

 放縮變換

 1 x=imread('D:/picture/ZiXia.jpg')
 2 subplot(2,3,1)
 3 imshow(x);
 4 title('原圖');
 5 Large=imresize(x,1.5);
 6 subplot(2,3,2)
 7 imshow(Large);
 8 title('擴大為1.5');
 9 Small=imresize(x,0.1);
10 subplot(2,3,3)
11 imshow(Small);
12 title('縮小為0.3');
13 subplot(2,3,4)
14 df=imresize(x,[600 700],'nearest');
15 imshow(df)
16 title('600*700');
17 df1=imresize(x,[300 400],'nearest');
18 subplot(2,3,5)
19 imshow(df1)
20 title('300*400');

 








 


 后記:

(1)MATLAB基礎知識回顧

1:crtl+R是對選中的區域注釋,ctrl+T是取消注釋

2:有的代碼中點運算如O=a.*I+b/255 ,其中b除以255原因是:灰度數據有兩種表式方法:一種是用unit8類型,取值0~255;另一種是double類型,取值0~1。兩者之間相差255倍。就這段代碼而言,I剛讀入時是unit8類型,在第2句轉換為double,所以后面涉及到與它進行運算的時候,為了統一,都要轉換到0~1的范圍,所以要除255。

3:imresize的用法

  1、B = imresize(A,m)  將圖片A放大m倍
  2、B = imresize(A,m,method)
    將圖片A由參數method指定的插值運算方法來改變圖像的大小到m倍,
    method的幾種可選值:
    'nearest'最近鄰插值(默認)
    'bilinear'雙線性插值
    'bicubic'雙三次插值
  3、B = imresize(A,[mrows
   ncols],method) 將圖片A由參數method指定的插值運算方法,來改變圖像的大小到長寬為[mrows
   ncols]
  4、B= imresize(...,method,n) 
  5、B= imresize(...,method,h) 
   其中的h可以是任意一個FIR濾波器(h通常由函數ftrans2、fwind1、fwind2、或fsamp2等生成的二維FIR濾波器)。

4:uint16的用法

  matlab中uint16函數的用法;
  1.函數用法:將輸入參數映射到無符號16位范圍之內,即將參數限定在0-65535之間;
  2.實例:當輸入為一個實數a時:
  if a<0 輸出ans=0;
  if 0<=a<=65535 輸出ans=a;
  if a>65535 輸出ans=65535;
  當輸入為一個矩陣a時:對於矩陣中的每一個元素進行上述標量操作;
  if a=[-1 2 65539] 輸出ans=[0 2 65535];
  注意:uint8的用法同理

5  mat2gray   把一個double類的任意數組轉換成值范圍在[0,1]的歸一化double類數組
    im2double 將輸入轉換為double類.若輸入是uint8類 uint16 類 logical類則函數將其轉換為范圍[0,1]之間的類.

6imadjust

    函數imadjust是對灰度圖像進行亮度轉換的基本IPT工具
    g=imadjust(f,[low-in   high-in],[low_out  high_out],gmma)

    此函數將圖像f中的亮度值映像到g中的新值,即將low_in至high_in之間的值的映射到low_out和high_out之間的值.low_in以下high_in以                 上的值被剪切了.   參數gamma給出曲線的形狀.該曲線用來映射f的亮度值,以便生成圖像g.若gamma小於

        1,則映射被加權至更高的輸出值.

7imnoise的用法

imnoise 函數說明
  在MATLAB中,可以使用imnoise函數給一幅圖像添加噪聲。
  g = imnoise(f, type, parameters)
  參數說明:
  輸出:g是添加噪聲之后的圖像。
  輸入:f是原圖像,type是加入的噪聲類型,parameters是噪聲的一些參數。
  概括地說,imnoise的函數原型為:g = imnoise(f, type, parameters),注意這個只是一個概括性的函數原型,因為parameters根據噪聲種  類的不同可以指定多個值,也可以指定一個值。所以真正可以直接調用的函數原型是下面的這些函數接口。
具體形式的imnoise接口
    g=imnoise(f,‘gaussian’,m,var)是將均值為m,方差為var的高斯噪聲加到圖像f上。m的默認值是0,var默認值是0.01。
    g=imnoise(f,‘salt & pepper’,d)給圖像f添加椒鹽噪聲,其中d是噪聲密度(即包含噪聲值的圖像區域的百分比)。因此,大約有    d*numel(f)個像素受到污染,默認的噪聲密度為0.05。
    g=imnoise(f,‘speckle’,var)用方程g=f + n*f將乘性噪聲添加到圖像f上,其中n是均值為0、方差為var的均勻分布的隨機噪聲。var的默認值為0.04。
imrotate函數說明

調用格式

編輯
B = imrotate(A,angle)
B = imrotate(A,angle,method)
B = imrotate(A,angle,method,bbox)

調用格式說明

B = imrotate(A,angle)
將圖像A(圖像的數據矩陣)繞圖像的中心點旋轉angle度, 正數表示逆時針旋轉, 負數表示順時針旋轉。返回旋轉后的圖像矩陣。
B = imrotate(A,angle,method)
使用method參數可以改變插值算法,method參數可以為下面這三個值:
'nearest':最鄰近線性插值(Nearest-neighbor interpolation)
'bilinear': 雙線性插值(Bilinear interpolation)
'bicubic': 雙三次插值(或叫做雙立方插值)(Bicubic interpolation)
B = imrotate(A,angle,method,bbox)
bbox參數用於指定輸出圖像屬性:
'crop': 通過對旋轉后的圖像B進行裁剪, 保持旋轉后輸出圖像B的尺寸和輸入圖像A的尺寸一樣。
'loose': 使輸出圖像足夠大, 以保證 源圖像旋轉后超出 圖像尺寸范圍的像素值沒有丟失。 一般這種格式產生的圖像的尺寸都要大於源圖像的尺寸。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM