數字影像處理習題(一)
文章目錄
- 數字影像處理習題(一)
- 一、簡答題
- 二、編程題
- 1. 影像處理
- 1.1 影像匯入、裁減顯示(長寬分別為原尺寸1/2)、彩色影像灰度化、保存
- 2. 影像采樣與量化
- 2.2 利用求均值方法是實作4倍降采樣
- 2.3 手動撰寫量化函式,將灰度級改為8
- 3. 影像變換
- 3.1 手寫影像反轉
- 3.2 非線性變換完成對數變換
- 4. 直方圖
- 4.1 完成清華大學出版社教材例5.6,5.7
- 4.2 手寫函式替換imhist()
- 5. 空域低通濾波
- 5.2 影像分別添加椒鹽噪聲與乘性噪聲,手寫實作3 * 3視窗均值濾波與中值濾波,并比交兩種方法在不同噪聲下的去噪效果,提示:嵌套使用for回圈陳述句
一、簡答題
1. 什么是數字影像,數字影像有哪些特點
答:數字影像,是以二維數字組形式表示的影像,是二維影像用有限數字數值像素的表示,由陣列或矩陣表示,其光照位置和強度都是離散的,數字影像是由模擬影像數字化得到的、以像素為基本元素的、可以用數字計算機或數字電路存盤和處理的影像,
? 數字影像特點:處理的資訊多數為二維資訊,運算量巨大;各個像素互不獨立,相關性大;數字影像占用的頻帶較寬,
2. 若RGB影像中每一幅紅、綠、藍都是一幅8bit影像,則該RGB圖所有可能的顏色總數是多少?
答:16777216種,
? 每幅紅、綠、藍影像都是一幅8bit影像,則每個RGB顏色色值有2^8= 256個(0-255),所以該RGB圖所有可能的顏色總數為(28)3 = 16777216,
二、編程題
1. 影像處理
1.1 影像匯入、裁減顯示(長寬分別為原尺寸1/2)、彩色影像灰度化、保存
-
編程思路:
(1)影像匯入:使用
imread()函式將影像讀入作業區,(2)剪裁(長寬分別為原尺寸1/2):首先使用
size()獲取影像的長寬并儲存,用rect[x,y,length,width]設定引數,從某個有效的x、y坐標開始裁剪1/2的寬和高的尺寸,(3)顯示:使用
imshow()函式來顯示影像檔案,為了同時顯示不同視窗的多幅影像,使用figure()函式,(3)彩色影像灰度化:將3個通道(RGB)轉換成1個通道,可以直接使用
rgb2gray()函式,(4)保存: 使用函式
imwrite()來寫入影像檔案, -
源代碼:
檔案名:Homework1_1.m
close all; clear; clc; img = imread('test.jpg'); %讀取test圖片(為三通道彩色圖片) figure,imshow(img),title('原圖'); %顯示原圖 hight=size(img,1); %獲取影像高 width=size(img,2); %獲取影像寬 rect = [width/4,hight/4,width/2,hight/2]; %設定引數,從1/4的x,y坐標開始延長1/2的寬高 %即影像中心區域 imgCut=imcrop(img,rect); %對圖片img進行rect的引數裁剪,命名為imgCut imwrite(imgCut,'testCut.jpg') %將灰度化后圖片保存,命名為testCut.jpg figure,imshow(imgCut),title('裁剪后圖'); %顯示裁剪后的圖片 imgGray = rgb2gray(img); %將RGB圖片轉換為灰度圖片 imwrite(imgGray,'testGray.jpg') %將灰度化后圖片保存,命名為testGray.jpg figure,imshow(imgGray),title('灰度化圖'); %顯示灰度化后的圖片 %顯示在一個視窗 對比結果 figure; subplot(1,3,1),subimage(img); title('原圖'); subplot(1,3,2),subimage(imgCut); title('裁剪后圖'); subplot(1,3,3),subimage(imgGray); title('灰度化圖'); -
結果:

-
分析:
(1) 裁剪:一開始使用近似正方形比例的圖片,實驗結果不清晰,使自己反而開始對于寬高,長寬定義混淆,最后更換測驗圖片,驗證,長寬即寬高,
獲得影像寬高,使用size()函式,size(A,n)如果在size函式的輸入引數中再添加一項n,并用1或2為n賦值,則 size將回傳矩陣的行數(高)或列數(寬),
引數格式為:rect[x,y,length,width],(2)對于影像灰度化:rgb2gray是matlab內部一種處理影像的函式,通過消除影像色調和飽和度資訊同時保留亮度實作將將RGB影像或彩色圖轉換為灰度影像,即灰度化處理的功能,呼叫這個功能的格式是
I = rgb2gray(RGB),意思是將真彩色影像RGB轉換為灰度強度影像I ,(3) 圖片保存:使用函式
imwrite()來寫入影像檔案,(4)顯示:使用
imshow()函式來顯示影像檔案,為方便觀察實驗結果最后將結果與原圖放在一個視窗,用subplot()函式,該函式的語法形式為subplot(m,n,p)或subplot(m n p),其中,m表示圖排成m行,n表示圖排成n列,p表示圖所在的位置,p=1表示從左到右、從上到下的第一個位置,
2. 影像采樣與量化
2.2 利用求均值方法是實作4倍降采樣
-
編程思路:
(1)用
imread()函式將影像資訊轉化為矩陣資訊進行保存,由于影像為RGB三色,所得到的資訊是三維的,因此先使用rgb2gray()函式將影像轉化為二維的灰度圖,(2)
[high,width]=size(a)讀取影像像素,采樣for回圈,步長為2,將四個像素點的值求均值后賦值給新的圖片,最后現實影像, -
源代碼:
檔案名:Homework2_2.m
%利用求均值方法實作4倍降采樣 close all; clear; clc; img=imread('學院.jpg'); %讀取原圖 img=rgb2gray(img); %轉變為灰度化影像 [h,w]=size(img); %獲取高寬 newImg=zeros((h+1)/2,w/2); %新建一個長寬為原圖一半的全零矩陣 l=1;r=1; for i=1:2:h-1; %對原圖行進行遍歷,步長為2 for j=1:2:w-1; %對原圖列進行遍歷,步長為2 newImg(l,r)=(img(i,j)+img(i+1,j)+img(i,j+1)+img(i+1,j+1))/4; r=r+1; end l=l+1; r=1; end newImg = uint8(newImg); %影像矩陣變成uint8型 figure; subplot(1,2,1),imshow(img),title('原圖'); subplot(1,2,2),imshow(newImg),title('4倍采樣圖'); -
結果:

-
分析:
(1)實驗所得到的四倍降采樣圖片的像素數量是原圖的1/4,因此需要將新圖的寬高設定為原圖的1/2,
(2)求均值法實作降采樣需要將原圖臨近的四塊像素的灰度值求均值,使用for回圈,
(3)每步步長為2將原圖依次遍歷,
2.3 手動撰寫量化函式,將灰度級改為8
-
編程思路:
(1)首先用
imread()函式將影像資訊轉化為矩陣資訊進行保存,由于影像為RGB三色,所得到的資訊是三維的,因此先使用rgb2gray()函式將影像轉化為二維的灰度圖,(2)通過灰度直方圖得出灰度值范圍,利用線性變換將其轉換為灰度級為8的影像(灰度值為0-255),
-
源代碼:
檔案名:Homework2_3.m
%手動撰寫量化函式,將灰度級改為8 close all; clear; clc; img=imread('學院.jpg'); %讀取原圖 img=rgb2gray(img); %轉變為灰度化影像 imged=img/7*(0+255/7); %轉變為灰度級為8的影像 subplot(2,2,1),imhist(img),title('灰度直方圖'); subplot(2,2,2),imshow(img),title('原灰度影像'); subplot(2,2,3),imhist(imged),title('灰度直方圖'); subplot(2,2,4),imshow(imged),title('灰度級為8'); -
結果:

-
分析:
關于灰度級:灰度值范圍[Lmin,Lmax]內就有K個亮度值對應,稱為灰度級K,為方便計算機處理,灰度級K一般以2的整數次冪表示,一般取K=256,表示共有256個灰度級,
為了實作灰度級8的轉變,因此需要8個亮度值,把0-255灰度值均勻分成2^3=8份,即為8個灰度級,第一區間賦值為0,第八區間賦值為255,中間區間以此類推,
設灰度級為k,
imged=img/(k-1)*(0+255/(k-1));
3. 影像變換
3.1 手寫影像反轉
-
編程思路:
(1)首先用
imread()函式將影像資訊轉化為矩陣資訊進行保存,由于影像為RGB三色,所得到的資訊是三維的,因此先使用rgb2gray()函式將影像轉化為二維的灰度圖,(2)將影像轉換為double型,影像反轉線性變換后再將資料型別轉換為uint8資料型別,顯示圖片,
(3)灰度值為0-255,反轉則為img1=255-img1, -
源代碼:
檔案名:Homework3_1.m
%影像反轉:手寫 close all; clear; clc; img=imread('學院.jpg'); %讀取原圖 img=rgb2gray(img); %轉變為灰度化影像 img1=double(img); %影像矩陣變成double型 img1=255-img1; %影像反轉 img2=uint8(img1); %影像矩陣變成uint8型 subplot(1,2,1),imshow(img),title('原始灰度影像'); subplot(1,2,2),imshow(img2),title('反轉灰度影像'); -
結果:

-
分析:
影像反轉,“白變黑,黑變白”,因為灰度值范圍為0-255,反轉則為:現值=255-原值,
3.2 非線性變換完成對數變換
-
編程思路:
(1)用
imread()函式將影像資訊轉化為矩陣資訊進行保存,由于影像為RGB三色,所得到的資訊是三維的,因此先使用rgb2gray()函式將影像轉化為二維的灰度圖,(2)把二維的灰度圖矩陣轉換為double型之后進行對數變換,最后轉換為uint8型別顯示,
-
源代碼:
檔案名:Homework3_2.m
%非線性變換:完成對數變換 close all; clear; clc; img=imread('學院.jpg'); %讀取原圖 img=rgb2gray(img); %轉變為灰度化影像 img1=double(img); %影像矩陣變成double型 img2=46*log(img1+1); %對數變換 img2=uint8(img2); %影像矩陣變成uint8型 subplot(1,2,1),imshow(img),title('原始灰度影像'); subplot(1,2,2),imshow(img2),title('對數變換影像'); -
結果:

-
分析:
原圖經過非線性對數變換后,整體亮度變強,對數變換一般適用于處理過暗影像,
4. 直方圖
4.1 完成清華大學出版社教材例5.6,5.7
-
5.6 源代碼:
檔案名:Homework4_1_6.m
%例5.6 直方圖均衡化 Image=rgb2gray(imread('img.jpg')); %讀取原圖轉變為灰度化影像 histgram=imhist(Image); %統計影像直方圖 [h,w]=size(Image); NewImage=zeros(h,w); s=zeros(256); s(1)=histgram(1); for t=2:256 s(t)=s(t-1)+histgram(t); %計算新的灰度值 end for x=1:w for y=1:h NewImage(y,x)=s(Image(y,x)+1)/(w*h); %生成新影像 end end subplot(2,2,1),imshow(Image),title('couple灰度影像'); subplot(2,2,2),imhist(Image),title('couple灰度影像的直方圖');axis tight; subplot(2,2,3),imshow(NewImage),title('直方圖均衡化處理后的影像'); subplot(2,2,4),imhist(NewImage),title('直方圖均衡化處理后的影像的直方圖');axis tight; -
5.7 源代碼:
檔案名:Homework4_1_7.m
%例5.7 區域直方圖均衡化 Image=rgb2gray(imread('img.jpg')); %讀取原圖轉變為灰度化影像 histgram=imhist(Image); %統計影像直方圖 [h,w]=size(Image); NewImage=zeros(h,w); s=zeros(256); s(1)=histgram(1); for t=2:256 s(t)=s(t-1)+histgram(t); %計算新的灰度值 end for x=1:w for y=1:h NewImage(y,x)=s(Image(y,x)+1)/(w*h); %生成新影像 end end subplot(1,4,1),imshow(Image),title('couple灰度影像'); subplot(1,4,2),imhist(Image),title('couple灰度影像的直方圖');axis tight; subplot(1,4,3),imshow(NewImage),title('直方圖均衡化處理后的影像'); subplot(1,4,4),imhist(NewImage),title('直方圖均衡化處理后的影像的直方圖');axis tight; -
結果:
(1)例5.6

(2)例5.7

-
分析:
(1)影像直方圖均衡化和區域均衡化,可使影像灰度級均衡平坦,
(2)直方圖均衡化:原始影像的灰度直方圖從比較集中的某個灰度區間變成在全部灰度范圍內的均勻分布,增加許多影像的區域對比度,亮度可以更好的在直方圖上分布,
(3)區域直方圖均衡化:也就是對一個像素周圍的區域進行直方圖均衡化,然后將結果返還給最中心的區域,需要自己確定模板的大小,一般都是奇數行,奇數列,運算時間較長,且模板越大,運算時間越長,
4.2 手寫函式替換imhist()
-
編程思路:
可以用回圈遍歷圖片的每個像素,求出每個灰度值出現的次數,最終進行統計展示,
-
源代碼:
檔案名:Homework4_2.m
%手寫imhist() close all; clear; clc; Image=rgb2gray(imread('學院.jpg')); %讀取原圖轉變為灰度化影像 n=256; k=256/n; histograms(n)=0; for i=1:1:n a=size(find(Image<=k*i))-size(find(Image<=k*(i-1))); histograms(i)=a(1); end subplot(1,2,1),imhist(Image);title('imhist()直方圖');axis tight; subplot(1,2,2),bar(0:k:n*k-1,histograms,'grouped');title('手寫代碼灰度分布直方圖');axis tight; -
結果:

-
分析:
(1)用回圈遍歷圖片的每個像素,求出每個灰度值出現的次數,最終進行統計展示,
(2)
find函式回傳原圖I矩陣中等k值的下標,length計算下標的數量來表示頻率.
5. 空域低通濾波
5.2 影像分別添加椒鹽噪聲與乘性噪聲,手寫實作3 * 3視窗均值濾波與中值濾波,并比交兩種方法在不同噪聲下的去噪效果,提示:嵌套使用for回圈陳述句
-
編程思路:
(1)向灰度影像增加噪聲,
(2)獲取影像高與寬,并新建新的影像矩陣,為了方便邊界操作,將其高寬各增加2,
(3)利用嵌套for回圈對每一個像素點進行操作,
(3)均值濾波:將該像素點周圍包括其自己的3*3共九個灰度值求均值,
? 中值濾波:將該像素點周圍包括其自己的3*3共九個灰度值排序,取其均值,呼叫函式實作
-
源代碼:
檔案名:Homework5_2.m
%影像分別添加椒鹽噪聲與乘性噪聲 %手寫實作3 * 3視窗均值濾波與中值濾波 close all; clear; clc; Image=rgb2gray(imread('img.jpg')); %讀取原圖轉變為灰度化影像 ImageA1 = imnoise(Image,'speckle'); %加入乘性噪聲,方差默認值 ImageB1 = imnoise(Image, 'salt & pepper'); %加入椒鹽噪聲,噪聲密度為0.02 ImageA1 = double(ImageA1); ImageB1 = double(ImageB1); [h,w] = size(Image); ImageA2 = zeros(h+2, w+2); %乘性噪聲均值濾波影像 ImageA3 = zeros(h+2, w+2); %乘性噪聲中值濾波影像 ImageB2 = zeros(h+2, w+2); %椒鹽噪聲均值濾波影像 ImageB3 = zeros(h+2, w+2); %椒鹽噪聲中值濾波影像 for i=2:1:h-1 for j=2:1:w-1 % 均值濾波 ImageA2(i,j)=(ImageA1(i-1,j-1)+ImageA1(i-1,j)+ImageA1(i,j-1)+ImageA1(i-1,j+1)+ImageA1(i+1,j-1)+ImageA1(i,j)+ImageA1(i,j+1)+ImageA1(i+1,j)+ImageA1(i+1,j+1))/9; ImageB2(i,j)=(ImageB1(i-1,j-1)+ImageB1(i-1,j)+ImageB1(i,j-1)+ImageB1(i-1,j+1)+ImageB1(i+1,j-1)+ImageB1(i,j)+ImageB1(i,j+1)+ImageB1(i+1,j)+ImageB1(i+1,j+1))/9; % 中值濾波 ImageA3(i,j) = MedianFiltering(i,j,ImageA1); %跳轉取中值的自定義函式:MedianFiltering ImageB3(i,j) = MedianFiltering(i,j,ImageB1); end end subplot(2,3,1),imshow(uint8(ImageA1)),title('加入乘性噪聲后的影像'); subplot(2,3,2),imshow(uint8(ImageA2)),title('乘性噪聲均值濾波影像'); subplot(2,3,3),imshow(uint8(ImageA3)),title('乘性噪聲中值濾波影像'); subplot(2,3,4),imshow(uint8(ImageB1)),title('加入椒鹽噪聲后的影像'); subplot(2,3,5),imshow(uint8(ImageB2)),title('椒鹽噪聲均值濾波影像'); subplot(2,3,6),imshow(uint8(ImageB3)),title('椒鹽噪聲中值濾波影像');檔案名:MedianFiltering.m
function mvalue = MedianFiltering(i,j,img) %將該像素周圍3*3的灰度值存入一個陣列 x = [img(i-1,j-1),img(i-1,j),img(i-1,j+1),img(i,j-1),img(i,j),img(i,j+1),img(i+1,j-1),img(i+1,j),img(i+1,j+1)]; y = sort(x); %將陣列排序 mvalue = y(4); %取中值 end -
結果:


-
分析:
(1)椒鹽噪聲是數字影像的一個常見噪聲,所謂椒鹽,椒就是黑,鹽就是白,椒鹽噪聲就是在影像上隨機出現黑色白色的像素,椒鹽噪聲是一種因為信號脈沖強度引起的噪聲,椒鹽噪聲用中值濾波比較好,
原因是:
-
椒鹽噪聲是幅值近似相等但是隨機的分布在不同位置,圖中既有污染的點,也有干凈的點,
-
圖中噪聲的均值不為零,所以不適合均值濾波,
-
圖中有干凈的點也有污染的點,所以中值濾波可以用干凈的點代替污染的點,
(2)乘性噪聲一般由信道不理想引起的,它們與信號的關系是相乘,信號在,噪聲在;信號不在,噪聲也就消失,乘性隨機性看成是系統的時變性或者非線性造成的,乘性噪聲普遍存在于現實世界的影像應用當中,
-
從實驗結果看均值濾波與中值濾波效果大差不差,
-
它不能很好地保護影像細節,在影像去噪的同時也破壞了影像的細節部分,從而使影像變得模糊,不能很好地去除噪聲點,
-
-
分析:
(1)椒鹽噪聲是數字影像的一個常見噪聲,所謂椒鹽,椒就是黑,鹽就是白,椒鹽噪聲就是在影像上隨機出現黑色白色的像素,椒鹽噪聲是一種因為信號脈沖強度引起的噪聲,椒鹽噪聲用中值濾波比較好,
原因是:
-
椒鹽噪聲是幅值近似相等但是隨機的分布在不同位置,圖中既有污染的點,也有干凈的點,
-
圖中噪聲的均值不為零,所以不適合均值濾波,
-
圖中有干凈的點也有污染的點,所以中值濾波可以用干凈的點代替污染的點,
(2)乘性噪聲一般由信道不理想引起的,它們與信號的關系是相乘,信號在,噪聲在;信號不在,噪聲也就消失,乘性隨機性看成是系統的時變性或者非線性造成的,乘性噪聲普遍存在于現實世界的影像應用當中,
-
從實驗結果看均值濾波與中值濾波效果大差不差,
-
它不能很好地保護影像細節,在影像去噪的同時也破壞了影像的細節部分,從而使影像變得模糊,不能很好地去除噪聲點,
-
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/333545.html
標籤:其他
上一篇:W2-影像增強
下一篇:專案實戰:Qt檔案改名工具 v1.2.0(支持遞回檢索,搜索:模糊匹配,前綴匹配,后綴匹配;重命名:模糊替換,前綴追加,后綴追加)
