Matlab數字圖像處理初步

2021-01-20 K的筆記
灰度數字圖像與矩陣灰度圖像:一張灰度圖像根據其豎直位置(行)與水平位置(列)可以對應於一個二維矩陣

注意:jpg文件為有損壓縮,png文件為無損壓縮

數字圖像基礎API

信息獲取:函數info=imfinfo('filename')可獲取灰度或彩色圖像文件的基本信息,如假設文件名為mcm1.png,可見:

例如我展示一個圖片的信息,結果為:

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('新合成圖像')

二維離散傅立葉變換

二維離散傅立葉變換可以理解為一維離散傅立葉變換的張量積,或理解按照兩個方向分別作一次一維傅立葉變換。定義:

對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點均值濾波的方法,即以每個像素為中心,周圍

恢復結果的衡量-峰值信噪比(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 -


相關焦點

  • 圖像處理之RGB轉Ycbcr or gray
    YCbCr或Y'CbCr有的時候會被寫作:YCBCR或是Y'CBCR,是色彩空間的一種,通常會用於影片中的影像連續處理,或是數字攝影系統中。
  • 小波變換進行圖像壓縮matlab原始碼源程序
    小波變換進行圖像壓縮matlab原始碼源程序
  • 關於MATLAB 圖像處理與深度學習的作用分析和介紹
    圖中的紅色數字均由算法生成。接下來我們將介紹如何創建該算法,並說明為何深度學習和圖像處理對於對象檢測和圖像分類同樣十分有用。 圖像處理與深度學習 我們重點介紹兩種技術: 圖像處理 按像素級別變換或者修改圖像。比如,過濾、模糊、去模糊和邊緣檢測等; 深度學習 通過學習樣本圖像自動識別圖像特點。近幾年,深度學習已經徹底改變了圖像處理領域。
  • 使用Matlab圖像處理(三)——圖像濾波原理
    小白不想把複雜的數學公式拿上進行講解,大家可以簡單記成這種噪聲符合正態分布就可以啦,我們用「影響圖像處理最深遠的人」的相片來直觀的展現一下高斯噪聲的樣子。首先看一下沒有噪聲的的圖片我們看一下在這張圖片上加了0.08的高斯噪聲的結果:
  • 基於二值圖像的邊界提取和4方向鏈碼表示
    附錄: 一、 背景圖像邊界處理是圖像處理與分析中最基礎內容之一,也是至今沒有得到完滿解決的一類問題,邊界處理技術主要有邊界的提取和表示。邊界在圖像中所佔比例較小,是圖像的一個重要特徵。然後根據坐標來對圖像的邊界按照Moore邊界追蹤算法進行數字編碼,使得圖像的邊界被一一地轉換成一個數字序列。如圖1所示,採用四方向坐標只能刻畫出的具有四個方向的邊界,而本報告即是採用四方向坐標來刻畫數字圖像的邊界的。
  • matlab圖像拼接方法
    matlab圖像拼接的四種方法1、直接拼接,2、亮度調整後拼接,3、按距離比例融合,4、亮度調整後按距離比例融合流程:1。讀入左,右圖,並取出重合部分,並轉化為亮度圖2。
  • MATLAB圖像處理之圖像增強(二)
    對數變換常用來擴展低值灰度,壓縮高值灰度,這樣可以使低值灰度的圖像細節更容易看清,從而達到圖像增強的效果。>程序代碼如下:J=imread('c.jpg');I=rgb2gray(J);imshow(I);figure,imhist(I)效果圖上面的處理想必大家都已經爛熟於心了,我們重點來看怎樣通過直方圖進行灰度變換。
  • 【數字圖像處理系列五】圖像濾波之空間濾波:圖像平滑降噪和圖像銳化
    使用的開發環境是jupyter notebook,是一個python的交互式開發環境,測試十分方便,併集成了vim操作,安裝教程可參考:https://blog.csdn.net/feilong_csdn/article/details/80186276先導文章:opencv-python快速入門篇【數字圖像處理系列一
  • Matlab圖像增強與復原技術在SEM圖像中的應用
    圖像增強與復原是一種基本的圖像處理技術。其按照特定的需要突出一幅圖像中的某些信息或強化某些感興趣的特徵,將原來不清晰的圖片變得清晰,使之改善圖像質量和豐富信息量,提高圖像的視覺效果和圖像成分的清晰度,加強圖像判讀和識別效果的圖像處理的方法。
  • 結合實例與代碼談數字圖像處理都研究什麼?
    圖像處理(以及機器視覺)在學校裡是一個很大的研究方向,很多研究生、博士生都在導師的帶領下從事著這方面的研究。另外,就工作而言,也確實有很多這方面的崗位和機會虛位以待。而且這種情勢也越來越凸顯。那麼圖像處理到底都研究哪些問題,今天我們就來談一談。圖像處理的話題其實非常非常廣,外延很深遠,新的話題還在不斷湧現。
  • 圖像處理技術是什麼_圖像處理技術現狀和發展前景
    數字圖像處理概要   數字圖像處理是將圖像信號轉換成數位訊號並利用計算機對其進行處理。起源於20世紀20年代,20世紀60年—70年隨著計算機技術與數位電視技術的普及和發展而迅速發展。在80年代——90年代才形成獨立的科學體系。
  • 一種改進型的FIR數字濾波器設計
    在數位訊號處理中,濾波佔有極其重要的作用,數字濾波器是譜分析、雷達信號處理、通信信號處理應用中的基本處理算法。目前常用的濾波器設計方法普遍採用matlab仿真,dsp實現。但這一傳統設計方法需要的開發周期較長,且設計過程反覆進行,非常不便。
  • 基於MATLAB的理想低通濾波器的設計
    低通濾波器概念有許多不同的形式,其中包括電子線路(如音頻設備中使用的hiss 濾波器)、平滑數據的數字算法、音障(acoustic barriers)、圖像模糊處理等等,這兩個工具都通過剔除短期波動、保留長期發展趨勢提供了信號的平滑形式。
  • 基於數字圖像處理技術的巖石節理寬度測量
    一般採用的方法是:首先對對象巖體取樣,並從中採集數字圖像信息,然後沿用傳統的人工測量方法,對圖像中的目標物體進行測量,最後得出測量結果。這種方法只是在數據採集時提高了精確度,但在測量過程中由於缺少對現有圖像分析技術的應用,測量結果並不理想。目前常用的圖像分析技術主要是一些圖像測量算法,其中有:當量圓直徑算法,當量橢圓長、短軸算法等。
  • 基於MATLAB圖像處理的中值濾波、均值濾波以及高斯濾波的實現與對比
    基於MATLAB圖像處理的中值濾波、均值濾波以及高斯濾波的實現與對比
  • MATLAB圖像的幾何運算
    它主要是改變圖像中物體(像素)之間的空間關係,可以看成將各像素在圖像內移動的過程。幾何變換通常包括圖像的平移、圖像的鏡像變換、圖像的轉置、圖像的縮放和圖像的旋轉等。8.2.1  圖像的平移圖像平移就是將圖像中所有的點都按照指定的平移量水平、垂直移動。
  • MATLAB應用在基於噪聲檢測的圖像均值去噪法
    研究表明,人類獲取的視覺圖像信息在人類接受的信息中的比重達到75%,「百聞不如一見」便是非常形象的例子之一。在高度信息化條件下的今天,數字圖像越來越得到普及和應用。  然而,人們在獲取和傳輸數字圖像的同時,難免於圖像數據被外界噪聲所汙染,妨礙了人們對圖像信息的理解。由此,圖像去噪技術應運而生。圖像去噪,即在儘可能地不損失原圖像細節的前提下,去除圖像中無關的噪點。
  • 用matlab對信號進行傅立葉變換
    傅氏變換分析是信號分析中很重要的方法,藉助matlab可以很方便的對各類信號進行傅氏頻域分析。
  • MATLAB中的二維傅立葉變換
    2.傅立葉變換的應用傅立葉變換在圖像處理中有非常非常的作用。因為不僅傅立葉分析涉及圖像處理的很多方面,傅立葉的改進算法,比如離散餘弦變換,gabor與小波在圖像處理中也有重要的分量。印象中,傅立葉變換在圖像處理以下幾個話題都有重要作用:a.圖像增強與圖像去噪
  • 什麼是傅立葉變換,如何用MATLAB實現?
    第三場分享的主題是: 傅立葉變換的理解與MATLAB實現直播日期:2021年1月21日(周四)晚18點沒有傅立葉變換,就無法用數學的方法去處理現實世界中的各種各樣的信號。如今幾乎所有信息最終都會數位化,就會用到傅立葉變換及其變種,藉助傅立葉變換才能將信號識別為具體的成分,完成數位化。