【數字圖像處理系列五】圖像濾波之空間濾波:圖像平滑降噪和圖像銳化

2021-01-21 機器學習與自然語言處理

python版本:python3.5.4 ; opencv-python版本:opencv-python3.4.2.17


使用的開發環境是jupyter notebook,是一個python的交互式開發環境,測試十分方便,併集成了vim操作,安裝教程可參考:https://blog.csdn.net/feilong_csdn/article/details/80186276


先導文章:

opencv-python快速入門篇【數字圖像處理系列一】

基本概念:亮度、對比度、飽和度、銳化、解析度【數字圖像處理系列二】

圖像增強:線性、 分段線性、 對數、 反對數、 冪律(伽馬)變換、直方圖均衡【數字圖像處理系列三】

圖像數據集增強方式總結和實現【數字圖像處理系列四】


在圖像增強:線性、 分段線性、 對數、 反對數、 冪律(伽馬)變換、直方圖均衡【數字圖像處理系列三】一文中我們從圖像灰度變換的角度闡述了圖像增強的各種方式,本文我們將一起學習圖像處理中重點的方式:圖像濾波,圖像濾波分為空間域濾波和頻率域濾波,頻率域濾波我們將在下一節重點說明。圖像空間濾波對於圖像處理主要體現在兩個方面:

(1) 平滑圖像,達到降低圖像噪音的效果(平滑空間濾波)

(2) 銳化圖像,主要目的是突出灰度的過渡部分,即突出圖像的邊緣(銳化空間濾波)


先上圖,感受一下空間濾波對圖像處理的效果(原圖、經過拉普拉斯處理後的圖像):


一、空間濾波原理

圖像的空間濾波器有兩大部分:

(1) 一個基於圖像像素的矩形鄰域

(2) 對矩形鄰域包圍的圖像像素的操作方式


理解圖像的矩形鄰域如下圖所示

將圖像的左上角看做是空間域中的原點O,向下取為x軸,向右取為y軸,圖中便顯示了中心點(x,y)的一個3*3鄰域。每經過一個濾波產生一個新像素,新像素的坐標等於領域中心坐標(x,y),新像素的值是濾波操作的結果。而濾波器的類型也取決於鄰域上操作的類型,如果鄰域操作是線性操作,則濾波器稱為線性空間濾波器;反之如果鄰域操作是非線性操作,則濾波器稱為非線性空間濾波器。


這裡我們假設 f(x,y) 為原像素值,g(x,y) 為濾波後的像素值,則對於一個大小為M * N的圖像使用大小為m * n的濾波器進行線性空間濾波,若令m=2a+1,n=2b+1,則鄰域上線性操作可統一表達成下式:

其中x,y是可變的,以便w中的每個像素可訪問f中的每個像素,我們一般稱鄰域內像素和濾波器模板的操作叫做卷積。下面將分別講解平滑空間濾波器和銳化空間濾波器


二、平滑空間濾波

1、均值濾波、加權均值濾波

均值濾波又稱為線性空間濾波,利用鄰域平均法,即用幾個像素灰度的平均值來代替每個像素的灰度。有效抑制加性噪聲,但容易引起圖像模糊,尤其是會模糊圖像邊緣。通過下圖便可看到均值濾波和加權均值濾波的區別:

其中左圖是均值濾波,即鄰域中每個像素權重相同,取鄰域平均值作為中心像素點的濾波輸出值,則濾波器模板計算公式為:

而右圖濾波器模板則賦予中心點最高權重,然後隨著距中心點距離的增加而減小係數值,其目的是在平滑處理中試圖降低模糊,加權均值濾波器的操作如下是:

下面分別通過opencv-python提供的均值濾波和自定義均值濾波器兩種方式實現圖像的均值濾波:

import cv2import copyimport randomimport imutilsimport numpy as np
img = cv2.imread('E:/peking_rw/ocr_project/base_prehandle/img/lena.png')gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#利用opencv提供函數實現均值濾波blur_img = cv2.blur(gray_img, (3, 3))
#在灰度圖上手動實現均值濾波器gray_avg_img = copy.deepcopy(gray_img)for i in range(1, gray_img.shape[0]-1): for j in range(1, gray_img.shape[1]-1): sum_pix = sum([gray_img[l, k] for l in range(i-1, i+2) for k in range(j-1, j+2)]) gray_avg_img [i, j] = int(sum_pix/9)
#在RGB彩色圖上手動實現均值濾波器rgb_avg_img = copy.deepcopy(img)for i in range(1, img.shape[0]-1): for j in range(1, img.shape[1]-1): sum_b_pix = sum([img[l, k, 0] for l in range(i-1, i+2) for k in range(j-1, j+2)]) sum_g_pix = sum([img[l, k, 1] for l in range(i-1, i+2) for k in range(j-1, j+2)]) sum_r_pix = sum([img[l, k, 2] for l in range(i-1, i+2) for k in range(j-1, j+2)]) rgb_avg_img [i, j] = [int(sum_b_pix/9), int(sum_g_pix/9), int(sum_r_pix/9)]
cv2.imshow('origin image', imutils.resize(img, 500))cv2.imshow('gray image', imutils.resize(gray_img, 500))cv2.imshow('blur image', imutils.resize(blur_img, 500))cv2.imshow('gray average image', imutils.resize(gray_avg_img , 500))cv2.imshow('rgb average image', imutils.resize(rgb_avg_img , 500))if cv2.waitKey(0) == 27:    cv2.destroyAllWindows()


效果圖如下:依次是原圖、灰度圖、基於灰度圖opencv提供函數blur均值濾波效果、基於灰度圖自定義均值濾波效果、基於彩色圖自定義均值濾波效果


2、中值濾波

中值濾波是基於排序統計理論的一種能有效抑制噪聲的非線性平滑濾波信號處理技術。中值濾波的特點即是首先確定一個以某個像素為中心點的鄰域,然後將鄰域中各像素的灰度值排序,取其中間值作為中心像素灰度的新值。中值濾波在對於椒鹽噪音處理上效果很好


下面分別通過opencv-python提供的中值濾波和自定義中值濾波器兩種方式實現圖像的中值濾波,下面實驗中我們嘗試著對圖像添加椒鹽噪音然後進行使用中值濾波進行消除:

import cv2import copyimport randomimport imutilsimport numpy as np
img = cv2.imread('E:/peking_rw/ocr_project/base_prehandle/img/old.jpg')gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
pepper_img = copy.deepcopy(gray_img)for i in range(gray_img.shape[0]): for j in range(gray_img.shape[1]): if random.randint(0, 20) == 0: pix = random.randint(250, 255) pepper_img[i, j] = pix
blur_img = cv2.medianBlur(pepper_img, 5)
temp_arr = np.zeros((9))median_img = copy.deepcopy(pepper_img)for i in range(1, pepper_img.shape[0]-1): for j in range(1, pepper_img.shape[1]-1): temp_arr[0] = pepper_img[i-1, j-1] temp_arr[1] = pepper_img[i-1, j] temp_arr[2] = pepper_img[i-1, j+1] temp_arr[3] = pepper_img[i, j-1] temp_arr[4] = pepper_img[i, j] temp_arr[5] = pepper_img[i, j+1] temp_arr[6] = pepper_img[i+1, j-1] temp_arr[7] = pepper_img[i+1, j] temp_arr[8] = pepper_img[i+1, j+1] arr = np.sort(temp_arr) median_img[i, j] = arr[4]
cv2.imshow('pepper image', imutils.resize(pepper_img, 600))cv2.imshow('blur image', imutils.resize(blur_img, 600))cv2.imshow('median image', imutils.resize(median_img, 600))if cv2.waitKey(0) == 27:    cv2.destroyAllWindows()

效果圖如下:依次是含椒鹽噪音圖、經過cv2.medianBlur()函數處理後的圖像、經過自定義中值濾波器濾波後圖像

除了中值濾波外,還有一種非線性濾波是最值濾波,最值濾波是去鄰域中的最大值最為新像素值,在搜尋一幅圖像最亮點時非常有用。


三、銳化空間濾波器

寫在前面:上節提到的圖像平滑是通過模糊圖像達到圖像降噪的目的,但同時存在一個問題就是會使得圖像的邊緣被淡化。因此本節圖像銳化濾波恰相反,圖像平滑是一個積分的過程,圖像銳化便是通過圖像微分增強邊緣和其他突變,削弱灰度變換緩慢的區域。


在圖像微分銳化操作中,對於一階微分的任何定義需要保證以下三點:

(1) 在恆定灰度區域的微分值為零

(2) 在灰度臺階或斜坡處微分值非零

(3) 沿著斜坡的微分值非零

同樣類比得對於二階微分的任何保證以下三點:

(1) 在恆定區域微分值為零

(2) 在灰度臺階或斜坡的起點處微分值非零

(3) 沿著斜坡的微分值非零


1、二階微分圖像銳化—laplacian算子

首先一個二維圖像函數 f(x,y) 的拉普拉斯算子定義為:

拉普拉斯變換是一個線性算子,在x方向上離散化有:

在y方向離散化有:

從上面三個式子可以得出離散拉普拉斯算子是:

上面公式便是拉普拉斯算子中一種計算方式,等價於下圖中的laplacian模板1,自然laplacian模板2也可以類比寫出離散算子公式:

註:由於拉普拉斯是一種微分算子,因此其強調的是圖像中灰度的變換,忽視圖像灰度變換緩慢的區域。因此我們通過laplacian算子得出的是圖像更多的是邊緣線,因此,我們可以將原圖和拉普拉斯圖像疊加在一起,可以復原背景特性並且保持拉普拉斯銳化處理的效果,由此得出下面公式:

對於上面展示的拉普拉斯模板1和拉普拉斯模板2,常數c取-1,也有其他模板,這裡不再詳述


下面給出利用opencv函數和自實現上述拉普拉斯模板的應用實例:

import cv2import copyimport randomimport imutilsimport numpy as np
img = cv2.imread('E:/peking_rw/ocr_project/base_prehandle/img/blurry_moon.jpg')
lap_img1 = copy.deepcopy(img)for i in range(1, img.shape[0]-1): for j in range(1, img.shape[1]-1): temp = img[i+1, j] + img[i-1, j] + img[i, j+1] + img[i, j-1] -4*img[i, j] lap_img1[i, j] = img[i, j] - temp
lap_img2 = copy.deepcopy(img)for i in range(1, img.shape[0]-1): for j in range(1, img.shape[1]-1): temp = img[i-1, j-1] + img[i-1, j] + img[i-1, j+1] + img[i, j-1] + \ img[i, j+1] + img[i+1, j-1] + img[i+1, j] + img[i+1, j+1] - 8*img[i, j] lap_img2[i, j] = img[i, j] - temp
kernel = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]]) lapkernel_img = cv2.filter2D(img, -1, kernel)lap_img3 = img - lapkernel_img
cv2.imshow('origin image', imutils.resize(img, 400))cv2.imshow('laplacian image1', imutils.resize(lap_img1, 400))cv2.imshow('laplacian image2', imutils.resize(lap_img2, 400))cv2.imshow('laplacian image3', imutils.resize(lap_img3, 400))if cv2.waitKey(0) == 27:    cv2.destroyAllWindows()

效果圖如下,順序既是上述程序的輸出順序:


2、非銳化掩蔽

非銳化掩蔽的思路便是應原圖像減去平滑的圖像,這樣便得到強調邊緣的圖像,然後再和原圖像相加,便達到強調圖像邊緣的效果,具體步驟如下:

(1) 模糊原圖像

(2) 從原圖像減去模糊圖像(產生的差值圖像稱為模板)

(3) 將模板和原圖像相加


則將上述思路換算成數學公式便是:

然後在原圖像加上模板的一個權重部分:

當k>1時我們稱該處理為高提升濾波,當k<1時則是不強調非銳化模板的作,下面提供代碼實現如下:

import cv2import copyimport randomimport imutilsimport numpy as np
img = cv2.imread('E:/peking_rw/ocr_project/base_prehandle/img/blurry_moon.jpg')blur_img = cv2.blur(img, (5, 5))
mask_img = img - blur_imgsharp_mask_img = img + mask_img
cv2.imshow('origin image', imutils.resize(img, 400))cv2.imshow('blur image', imutils.resize(blur_img, 400))cv2.imshow('mask image', imutils.resize(mask_img, 400))cv2.imshow('sharpen mask image', imutils.resize(sharp_mask_img, 400))if cv2.waitKey(0) == 27:    cv2.destroyAllWindows()


3、cv2.filter2D()自定義卷積核濾波

opencv-python中提供cv2.filter2D()函數可實現自定義內核和圖像進行卷積操作,cv2.filter2D()一般定義為:

cv2.filter2D(img, -1, kernel)   

下面我們提供實例展示對圖像濾波的效果:

import cv2import copyimport randomimport imutilsimport numpy as np
img = cv2.imread('E:/peking_rw/ocr_project/base_prehandle/img/old.jpg')kernel = np.array([[0, -1, 0], [0, 5, 0], [0, -1, 0]]) new_img = cv2.filter2D(img, -1, kernel)
cv2.imshow('origin image', imutils.resize(img, 400))cv2.imshow('new image', imutils.resize(new_img, 400))if cv2.waitKey(0) == 27:    cv2.destroyAllWindows()

根據自定義的卷積核 kernel = np.array([[0, -1, 0], [0, 5, 0], [0, -1, 0]]) 得到的濾波效果如下:


往期精彩:

深度學習多種模型評估指標介紹 - 附sklearn實現

乾貨 | Attention注意力機制超全綜述

Tensorflow常用函數使用說明及實例簡記

機器學習中優化相關理論知識簡述

自己動手實現一個神經網絡多分類器

Transformer 模型的 PyTorch 實現

乾貨 | NLP中的十個預訓練模型

乾貨|一文弄懂機器學習中偏差和方差

FastText原理和文本分類實戰,看這一篇就夠了

Transformer模型細節理解及Tensorflow實現

GPT,GPT2,Bert,Transformer-XL,XLNet論文閱讀速遞

機器學習算法篇:最大似然估計證明最小二乘法合理性

Word2vec, Fasttext, Glove, Elmo, Bert, Flair訓練詞向量教程+數據+源碼



原創不易,別偷偷摸摸的在看,有用就點個好看呀

相關焦點

  • 【乾貨】遙感圖像處理之空間域增強&卷積濾波&形態學濾波
    空間域增強處理是通過直接改變圖像中的單個像元及相鄰像元的灰度值來增強圖像。
  • 圖像與濾波
    前幾天讀到一篇文章,它提到圖像其實是一種波,可以用波的算法處理圖像。我頓時有一種醍醐灌頂的感覺,從沒想到這兩個領域是相關的,圖像還可以這樣玩!下面我就來詳細介紹這篇文章。一、為什麼圖像是波?我們知道,圖像由像素組成。
  • opencv-python圖像預處理-濾波
    為了消除外界環境對圖像採集的幹擾,增強圖像的邊緣及灰度跳變的部分,使圖像變得清晰以及提高圖像處理速度需要對圖像進行預處理操作,主要是對圖像進行濾波和增強操作。使用的方法可以分為空間域處理和頻率域處理兩類。空間域指圖像平面本身,這類圖像處理方法用各種模板直接與圖像進行卷積運算,實現對圖像的處理。
  • 使用Matlab圖像處理(三)——圖像濾波原理
    小白不想把複雜的數學公式拿上進行講解,大家可以簡單記成這種噪聲符合正態分布就可以啦,我們用「影響圖像處理最深遠的人」的相片來直觀的展現一下高斯噪聲的樣子。首先看一下沒有噪聲的的圖片我們看一下在這張圖片上加了0.08的高斯噪聲的結果:
  • 基於MATLAB圖像處理的中值濾波、均值濾波以及高斯濾波的實現與對比
    背景知識中值濾波法是一種非線性平滑技術,它將每一像素點的灰度值設置為該點某鄰域窗口內的所有像素點灰度值的中值.中值濾波是基於排序統計理論的一種能有效抑制噪聲的非線性信號處理技術,中值濾波的基本原理是把數字圖像或數字序列中一點的值用該點的一個鄰域中各點值的中值代替,讓周圍的像素值接近的真實值,從而消除孤立的噪聲點。
  • MATLAB中的圖像變換之線性空間濾波
    凡是使用空間模板進行的圖像處理,我們就定義為空間濾波,模板本身被稱為空間濾波器。圖像的空域線性濾波和非線性濾波在空域對圖像進行濾波處理無非兩種情況:線性濾波和非線性濾波。濾波的意思就是對原圖像的每個像素周圍一定範圍內的像素進行運算,運算的範圍就稱為掩膜或領域。
  • 結合實例與代碼談數字圖像處理都研究什麼?
    、中值濾波、高斯平滑等)和銳化(例如Laplace方法)等。       增強處理中的很多算法其實和圖像復原中的降噪算法是重合的。現在保持邊緣(或紋理結構)的平滑算法屬於研究熱點。像那些美顏相機裡的嫩膚算法都是以此為基礎的。
  • Matlab圖像增強與復原技術在SEM圖像中的應用
    圖像增強與復原是一種基本的圖像處理技術。其按照特定的需要突出一幅圖像中的某些信息或強化某些感興趣的特徵,將原來不清晰的圖片變得清晰,使之改善圖像質量和豐富信息量,提高圖像的視覺效果和圖像成分的清晰度,加強圖像判讀和識別效果的圖像處理的方法。
  • 圖像增強——頻域增強定義和步驟
    頻域增強定義和步驟 頻域增強是利用圖像變換方法將原來的圖像空間中的圖像以某種形式轉換到其它空間中,然後利用該空間的特有性質方便地進行圖像處理,最後再轉換回原來的圖像空間中,從而得到處理後的圖像。 頻域增強的主要步驟是: 選擇變換方法,將輸入圖像變換到頻域空間; 在頻域空間中,根據處理目的設計一個轉移函數並進行處理; 將所得結果用反變換得到圖像增強。
  • 明景模糊圖像處理系統功能
    明景模糊視頻圖像處理系統主要用於公安偵查過程中對涉案監控視頻中提取的模糊圖片進行清晰化處理,解決視頻圖像線索「看不清」的難題。針對視頻偵查實戰需求,提供圖像降噪、低照度增強、去模糊、超解析度等多種視頻圖像增強處理算法,增強視頻圖像畫面關鍵細節,恢復視頻圖像中有價值的信息。
  • 計算機視覺和圖像處理之間有什麼區別?
    現代機器視覺系統背後的的核心動機在於模擬人類視覺,用於識別圖案,面部以及將將2D圖像轉化為3D模型等。在概念層面,圖像處理和計算機視覺之間存在很多重疊,並且經常被誤解的術語可以互換使用。在這裡,我們簡要概述了這些技術,並解釋了它們在基礎層面上的不同之處。
  • 圖像處理 淺談圖像金字塔
    圖像金子塔,是一種經典的圖像多尺度描述方法。它將降採樣和平滑濾波結合在一起,對圖像進行多尺度表示。
  • 基於DSP集成開發環境CCS2.2的指紋圖像預處理的應用研究
    最近隨著識別算法精度的提高和DSP(數位訊號處理器)晶片性能的改進,使得以指紋為生物特徵的身份鑑定系統得到快速發展,但是真正應用於嵌入式的指紋系統國內還是空白。為此,需要研究開發擁有自主智慧財產權的嵌入式指紋識別系統。 DSP 是指利用專用或通用的數位訊號處理晶片,以數字計算的方法對信號進行處理。它具有處理速度快,靈活,精確,抗幹擾能力強,體積小等優點。
  • 圖像各向異性濾波
    晶體的各向異性即沿晶格的不同方向,原子排列的周期性和疏密程度不盡相同,由此導致晶體在不同方向的物理化學特性也不同,這就是晶體的各向異性。亦稱「非均質性」。物體的全部或部分物理、化學等性質隨方向的不同而各自表現出一定的差異的特性。即在不同的方向所測得的性能數值不同。
  • 監控視頻中的圖像預處理技術
    現在,視頻預處理都是在數字域進行的,即在視頻數位化採集以後進行,充分發揮了數位訊號處的方便、高效、靈活和一致的優越性。目前,在視頻監控中常見的預處理方法除了基本的圖像濾波、圖像去噪和多種圖像增強處理外,還出現了多種針對特殊應用環境的預處理方法,如背光或暗光處理、雨霧煙處理、感興趣區間的處理等。
  • 高清成像技術讓條碼圖像更清晰
    隨著數字圖像技術的不斷成熟,高清成像處理技術在各領域也逐步發展起來,它具有分析精度高、處理內容豐富、可以進行複雜的非線性分析等特點。高清成像處理過程是將條碼的圖像信號轉換成數位訊號並利用軟體進行分析,與傳統方法相比具有更大的靈活性和較低的成本,因此,在條碼識讀及檢測領域具有很大的發展潛力。
  • Matlab數字圖像處理初步
    0~255雙精度圖像可標準化圖示如imshow(A/255)彩色圖像處理 彩色圖像的通道分離與圖像存儲 對於RGB格式的彩色圖像矩陣A,B=A(:,:,1)即可提取彩色圖像的紅色通道值,其中B將以二維矩陣的形式存儲表示
  • 圖像去噪算法的優點和缺點
    3、PCA 降噪 4、K-SVD 降噪 5、非局部均值降噪 6、WNNM 降噪 7、基於主成分分析和雙邊濾波的圖像降噪算法 8、小波變換 9、小波閾值降噪 10、Contourlet 變換 11、基於平移不變 Contourlet 變換的 SAR 圖像降噪**
  • 使用Python+OpenCV進行圖像處理(二)
    本篇是視覺入門系列教程的第二篇。整個視覺入門系列內容如下:理解顏色模型與在圖像上繪製圖形(圖像處理基本操作)。基本的圖像處理與濾波技術。從特徵檢測到人臉檢測。對應的圖像處理技術包括:模糊化(Blurring)、閾值化(thresholding)和形態轉換(morphological transformation)。本篇我們將詳細介紹這幾個常見的圖像預處理技術。(本文假設讀者已經熟悉卷積的概念。)模糊化(Blurring)模糊化的目標是實現降噪。
  • 圖像噪聲處理系統設計開題報告_圖像噪聲處理實驗報告 - CSDN
    以下是幾類常用的圖像處理技術:1、圖像去噪 圖像去噪指的是利用各種濾波模型,通過多點平滑等方法從已知的含有噪聲的圖像中去掉噪聲成分。圖像去噪從整個圖像分析的流程上來講屬於圖像的預處理階段,從數字圖像處理的技術角度來說屬於圖像恢復的技術範疇,它的存在有著非常要的意義。