info =
包含以下欄位的 struct:
Filename: 'D:\matlab\AFile\temp\pic\songshu.jpg'
FileModDate: '26-Jul-2020 15:49:11'
FileSize: 720467
Format: 'jpg'
FormatVersion: ''
Width: 1920
Height: 1080
BitDepth: 24
ColorType: 'truecolor'
FormatSignature: ''
NumberOfSamples: 3
CodingMethod: 'Huffman'
CodingProcess: 'Progressive'
Comment: {}
Orientation: 1
XResolution: 72
YResolution: 72
ResolutionUnit: 'Inch'
Software: 'Adobe Photoshop CS Windows'
DateTime: '2017:02:26 10:40:49'
DigitalCamera: [1×1 struct]
ExifThumbnail: [1×1 struct]
讀取圖像:進入圖像所在的文件夾,鍵入A=imread('filename'),即可獲取灰度或彩色圖像的信息,並且將其儲存在矩陣A中
展示圖像:MATLAB函數imshow(A)可以彈出Figure並顯示圖像A
注意:
數字圖像的默認儲存格式uint8並不適合進行數值計算。在進行數值計算時,矩陣往往被自動轉化成雙精度型。因此圖示前往往將矩陣強制轉換為uint8型。對雙精度型矩陣,直接使用imshow默認最小值為0,最大值為1。0~255雙精度圖像可標準化圖示如imshow(A/255)彩色圖像處理 彩色圖像的通道分離與圖像存儲 對於RGB格式的彩色圖像矩陣A,B=A(:,:,1)即可提取彩色圖像的紅色通道值,其中B將以二維矩陣的形式存儲表示
相應API:
imshow(B):將會得到對應紅色通道的灰度圖像
C=rgb2gray(A):可以根據彩色圖像A的整體亮度均勻的轉化為灰度圖像C
imwrite(A,'file_name')可以將任何的灰度或彩色圖像矩陣存入對應文件名。注意:double型矩陣存儲時範圍為0~1
彩色圖像的顏色編碼更換 RGB格式是大多數彩色圖像的存儲格式,按照紅、綠、藍三種顏色分別存儲一張灰度圖像。另一種非常流行的顏色模型為HSV模型,分為色調(Hue),飽和度(Saturation)以及明度(Value)三種信息
B = rgb2hsv(A),可以將RGB模型的矩陣A化為hsv型的矩陣B,而C=hsv2rgb(B)可以完成逆變換。若A為uint8型的數據,則會自動轉為雙精度型並除以255,再進行對應的色彩空間變換,HSV的指標範圍均為0~1
數字圖像的簡單處理數字圖像的放大
RGB2 = imresize(RGB,[192,256]); % 圖像長寬減半
數字圖像的放大
RGB3=imresize(RGB,[1000,NaN]); % 等比例放大
Matlab默認使用雙三次插值的方法獲取更大的圖像
數字圖像的裁剪
RGB4=RGB3(401:600,401:600,:); % 將前頁放大圖像的第401~600行,401~600列裁剪下來
RGB5=RGB3(600:-1:401,600:-1:401,:); % 與上述結果相比,進行了水平和垂直翻轉
RGB6=RGB3(1:2:end,1:2:end,:); % 本質上是一種「粗暴」的圖像縮小算法
數字圖像映射到曲面
[x,y,z] = sphere(100); %生成101層高度的單位球面坐標,每層101X101個點坐標
warp(x,y,z,RGB) %將彩椒圖像映射到球面顯示
view(45,-45) %改變觀察角度,也改變了圖像相對位置
數字圖像的亮度與對比度亮度:設uint8型的灰度圖像的二維矩陣為A,設置常整數-255<=c<=255,則A+c就表示亮度的調整。若A+c超過255則自動設置為255,反之若A+c小於0則自動設置為0
對比度:設uint8型的灰度圖像的矩陣為A,設置正常數c>0與0~255之間的整數k,則
圖像的直方圖顯示與均衡化imhist(A)可繪製圖像的灰度直方圖,統計各灰度出現頻率B = histeq(A)可將矩陣A進行灰度均衡化(一般增大對比度)I=imread('peppers.png'); %讀取圖像並在左上角顯示其灰度
I=rgb2gray(I);
figure;subplot(2,2,1);
imshow(I);
title('原始圖像');
subplot(2,2,2); %繪製直方圖
imhist(I);
title('原始圖像直方圖');
I1=histeq(I); %圖像均衡化後的效果
subplot(2,2,3);
imshow(I1);title('圖像均衡化');
subplot(2,2,4);
imhist(I1);
title('直方圖均衡化');
圖像的背景提取與計算圖像的背景提取可以基於圖像的開運算算法(屬於形態學圖像基礎,這裡對原理不作要求),對應的MATLAB函數為imopen,開運算的核心是對圖像的腐蝕再膨脹的運算,主要效果除了對細節平滑化外,可以去掉前景亮色的邊緣毛刺等,後面將專門介紹。
clear all;coins=imread('coins.png'); %打開MATLAB內建的硬幣圖像
background=imopen(coins,strel('disk',15));
%利用半徑為15的圓盤做開運算
subplot(2,2,1),imshow(coins);title ('原始圖像')
subplot(2,2,2);imshow(background);title ('背景圖像')
%可以發現,背景圖像提取了每一個硬幣的所在區域並進行了一定的光滑化
coins1=imsubtract(coins,background);%MATLAB提供的更專業的相減函數
subplot(2,2,3),imshow(coins1);
title ('imsubtract函數相減結果')
K = imabsdiff(coins,background);%前景值不論正負都可以保留
subplot(2,2,4);imshow(K,[]) %按K的範圍比例放縮輸出(擴大對比度)
title ('imabsdiff函數相減結果')
圖像的前景摳圖與背景更換ind = background>=80; %硬幣區域背景值均大於等於80
figure;subplot(2,2,1);
imshow(ind)
title('獲取的前景位置')
coins_f = immultiply(coins,ind);
%兩個uint8與logical矩陣做圖像式乘法時,*或.*均會出現錯誤(非double)
subplot(2,2,2);imshow(coins_f)
title('摳取的前景圖像')
background_new = imread('nbg.png');
%這個文件MATLAB沒有,可自己嘗試生成一個同型的灰度背景圖像
subplot(2,2,3);imshow(background_new)
title('新背景圖像')
coins_new = coins_f + immultiply(background_new,~ind);
%邏輯型矩陣ind做非運算後,1變成0,0變成1。因此背景部分代替無硬幣區域
%有硬幣區域使用最初coins的圖像灰度,進行整合
subplot(2,2,4);imshow(coins_new)
title('新合成圖像')
二維離散傅立葉變換二維離散傅立葉變換可以理解為一維離散傅立葉變換的張量積,或理解按照兩個方向分別作一次一維傅立葉變換。定義:
MATLAB對應函數ifft2 (Y)
對Cameraman圖像進行二維傅立葉變換,模的最大值必為低頻值,除左上角外,大值多位於四個角落。因此可以使用MATLAB函數fftshift來平移傅立葉變換函數將大值置於中部
clear,close all;
A = imread('cameraman.tif');%MATLAB自帶的圖像
FA = fft2(A);
subplot(1,2,1),imshow(abs(FA),[0,1e4]),title('原始傅立葉變換');
FAS = fftshift(FA); %本身不改變FA的值,只是進行一個水平與豎直方向的平移
subplot(1,2,2),imshow(abs(FAS),[0,1e4]),title('平移傅立葉變換');
%這裡1e4並不是變換的最大模,只是為了能夠儘量反映傅立葉係數模的對比度
傅立葉變換對於自然圖像往往不具有稀疏性。對於小塊亮度函數,其頻譜線會集中在坐標軸,並且保持旋轉不變性。
f=zeros(900,900);
f(351:648,476:525)=1;
subplot(221);imshow(f,[]);title('原始圖像');
F=fftshift(fft2(f));
subplot(222);imshow(log(1+abs(F)),[])
%log(1+abs(F))進行合理比例變化,保證圖譜清晰
title('原始圖像的頻譜');
f=imrotate(f,45,'bilinear','crop');
%對其進行旋轉,雙線性,如果出格則裁剪掉的算法
subplot(223),imshow(f,[])
title('圖像正向旋轉45度')
Fc=fftshift(fft2(f));
subplot(224);
imshow(log(1+abs(Fc)),[])
title('旋轉後圖像的頻譜')
二維離散餘弦變換實際的自然圖像,大都在整體區域上不滿足恆為常值,也不滿足具有周期紋理狀的統一分布。但是往往在局部分片上滿足相應形式,因此,分片傅立葉變換或分片餘弦變換就有了很大的存在和利用價值。
圖像恢復問題 圖像去高斯噪聲問題 與信號去噪問題相似,圖像去噪問題即圖像對應的目標函數受到了一些未知的退化變換,得到了一幅帶有噪點的不準確圖像。去噪問題即利用圖像的內在性質與噪聲分布的特點,完成目標清晰圖像的估計與獲取的過程。
函數imnoise可生成各種類型的帶有各種噪聲的圖像
B = imnoise(A,'gaussian',0,0.05);
% 對圖像A添加高斯噪聲,均值0,方差0.05*(255^2),與個人生成隨機矩陣計算相比,imnoise可以自動將結果化為uint8型
均值濾波 最簡單也最直接的二維圖像高斯噪聲的去噪方法即為均值濾波方法,對應的MATLAB函數為imfilter。用法形如:
filt = 1/25 * ones(5)
C = imfilter(B,filt,'symmetric','same');
解釋:設立25點均值濾波的方法,即以每個像素為中心,周圍的範圍的均值代替原有的含有噪聲的圖像函數值,這個和一元信號去噪使用smooth函數的原理基本相同。對稱邊界條件,濾波時不改變圖像大小(對應’same』,否則為』full』)
恢復結果的衡量-峰值信噪比(PSNR) 除了直接通過肉眼觀察圖像質量外,基於圖像函數誤差定義的峰值信噪比,可以對圖像的恢復質量進行數值上的分析。峰值信噪比的定義(8位無符號整型)為:
可以注意到,峰值信噪比的值往往大於信噪比,僅取決於圖像函數的絕對誤差。
psnr(B,A) % 真實圖像在前後均可
% ans = 13.8864,帶有噪聲的圖像PSNR值較低,單位分貝dB
psnr(C,A)
% ans = 21.0560,均值濾波確實減小了誤差,提高了PSNR
椒鹽噪聲與圖像填充問題 椒鹽噪聲,即隨機選擇圖像中的若干像點,將他們的值變為0(黑椒點)或255(白鹽點),使其與真實值無關。
B = imnoise(A,'salt & pepper',0.1); % 將10%隨機的像點轉化為非黑即白的椒鹽噪聲
椒鹽噪聲所在位置的直接檢測方法講就是直接找出像素值 為0與255的點,用周圍像素值填充。這些信息被認定為是無效的,需要通過其他位置的灰度值來恢復這些被破壞的灰度值。因此椒鹽噪聲去噪本質上是一種圖像填充問題(估計完全未知元素)
ind = (B==0) | (B==255);
sum(ind(:))/numel(ind)
% ans = 0.1000 噪點比例檢測
椒鹽噪聲的簡單恢復方法-中值濾波因為椒鹽噪聲噪點周圍,我們認為絕大多數的信息是準確的,因此可以在噪點周圍3X3或5X5的範圍內取灰度值的中位數來估計噪點的灰度,可以削弱信息缺失的影響。
C = medfilt2(B,[3 3]); % 3X3的中值濾波,即一個像點上下左右3X3區域內取中位數估計
psnr(B,A) % ans = 15.0481
psnr(C,A) % ans = 25.8709
C(~ind) = B(~ind); % 未填充區域應取消濾波效果
psnr(C,A) % ans = 33.4267
圖像區域填充問題與逐步填充的思想
圖像有時候會整塊的丟失或不再需要(如部分PS或美圖軟體中的擦除筆功能),此問題本質上也是一個圖像填充問題,需要利用已知或未擦除區域對剩餘區域進行估計。反覆進行中值濾波,真實值會漸漸滲透到填充區域內部,從而達到圖像填充的理想效果。濾波半徑儘量大一些圖像模糊卷積
A = imread('XX.png');
kernel = fspecial('disk',10); %對焦不準模糊核,半徑為10
B = imfilter(A,kernel,'replicate'); %複製型邊界條件,PSNR=21.05dB
移動模糊核
A = imread('XX.png');
kernel = fspecial('motion',15,90); %向上平移15格的移動模糊
B = imfilter(A,kernel,'replicate'); %複製型邊界條件,PSNR=23.67dB
周期型邊界條件
A = imread('XX.png');
kernel = fspecial('disk',10); %對焦不準模糊核,半徑為10
C = imfilter(A,kernel,'circular'); %周期型邊界條件,PSNR=20.79dB
MATLAB的圖像反卷積函數-deconvreg
D = deconvreg(B,kernel); %複製型邊界恢復效果很差,PSNR=7.79dB
E = deconvreg(C,kernel); %周期型則幾乎完全恢復,PSNR=28.94dB
MATLAB的盲反卷積函數-deconvblind
F = deconvblind(B,kernel);
% 以kernel為初值,即使與真實的模糊核有差距,邊界條件也有一些差距,仍可恢復到勉強的水平。PSNR=22.05dB
可以將模糊化過程定義為函數句柄,再用cgs,gmres等反問題求解函數來獲取較為準確的解。但由於整數化近似帶來的誤差所造成的的不可逆影響。結果仍然無法得到完全的清晰。PSNR=27.44dB,使用正則化將結果進行分片光滑的逼近可以進一步改善相應的結果。
- END -