OpenCV學習筆記——卷積與濾波

卷積

1、表達式

卷積是一種數學算子。表達式爲:

以上是一維卷積,而在圖像處理中,我們常用二維卷積。表達式爲:

在這裏插入圖片描述
(其中,g稱爲濾波器,一般爲3*3矩陣)

2、計算方法

讓濾波器g(x,y)左右上下翻轉,得到g(-x,-y),然後從左到右、從上到下掃過原始數據。**讓濾波器的每行每列與原始數據對應的每行每列做乘積並求和。**得到的數即爲卷積結果,將其放於一個新的表中。

g(x,y)翻轉的原因是爲了滿足在與“1”數組相乘時,得到原濾波器。

如上圖(轉載自謝小小XH),左邊的二維數組稱爲原始數據,右邊的二維數組成爲濾波器,所做的卷積操作實際上就是7*1+8*1+9*2+……+24*1+25*1=314。對於圖像處理來說,卷積的實質就是對像素的處理

3、爲什麼要引入卷積

卷積可以對某塊圖像進行突出化的處理。從仿生的角度上來講,正如人類盯着某一個物體看的時候,這個物體之外的東西或多或少都會被我們忽略(即虛化)。而濾波器就相當於一個權重分配的取值表(類似於我們盯着的那個物品的形狀),當原始數據(類似於我們眼睛接受到的全部光線)經過濾波器的卷積後,我們關心的部分就會被突出,而其他部分會被忽略或減弱

例如,我們關心老鼠的背部,那麼濾波器會被設定爲老鼠背部的權重大其他部分權重小

那麼當濾波器移動到老鼠背部的時候,所得最終結果的值將較

當濾波器移動到其他部分(如頭部)時,所得結果的值較

以上圖例來自於https://blog.csdn.net/cufewxy1/article/details/80485886?utm_source=app該博客很好的講述了CNN和卷積的基本概念。

平滑濾波

平滑濾波的主要作用是消除噪聲,其實質是採用卷積操作,對原始圖像進行處理。我學習的平滑濾波主要有三種:平均濾波、高斯濾波、中值濾波。

1、四領域與八領域

在這裏插入圖片描述
排除中間像素點後的上、下、左、右四個像素點稱爲四領域

排除中間像素點後的其他八個像素點稱爲八領域

2、平均濾波

在一個小區域內(通常3*3)像素值平均。公式:

在這裏插入圖片描述

平均濾波使圖像邊緣也被平均化,導致圖像細節受損,圖像變模糊

3、高斯濾波

在一個小區域內(通常3*3)像素值加權平均,稱爲“加權平均濾波”。公式:

在這裏插入圖片描述
在這裏插入圖片描述
而形如上右的濾波器又被稱爲高斯濾波器。高斯濾波器還可以被拓展爲雙邊濾波器

在這裏插入圖片描述

高斯濾波既能消除噪聲有保留了圖像的細節,最爲常用

4、中值濾波

確定窗口後按灰度大小對像素進行排序,取灰度中位數對應的像素值代替原窗口中心的像素值。選擇窗口的方法很多樣——如:四鄰域八鄰域T字型等。

在這裏插入圖片描述

能很好的消除孤立噪聲,特別是胡椒狀噪點

數學形態學濾波

與卷積對應的平滑濾波不同,數學形態學濾波主要是通過幾何操作來進行濾波的。其包含兩種最基本操作:膨脹腐蝕。腐蝕和膨脹都會使圖像出現一定的顆粒化

膨脹指的是對於所有A的元素按B中元素相對位置變化的方式進行平移,然後取並集。
腐蝕指的是對於所有A的元素按B中元素相對位置逆變化的方式進行平移,然後取交集。
在這裏插入圖片描述
如上圖,第二張圖就是將第一張圖經過膨脹變換得到的,實質是黑的區域的擴張白的區域的減少
第三張圖是第一張圖經過腐蝕變換得到的,實質是黑的區域的減少白的區域的擴張

除了膨脹與腐蝕,數學形態學濾波還有開閉運算
在這裏插入圖片描述

利用OpenCV實現圖像平滑濾波

1、相關函數
dst = cv2.blur(src, ksize)					#平均濾波
dst = cv2.GaussianBlur(src, ksize,sigmaX)	#高斯濾波
dst = cv2.medianBlur(src, ksize)			#中值濾波
#src:原始圖像
#ksize:濾波器大小

其中,ksize常用(3,3)(5,5)大小的濾波器。

dst = cv2.bilateralFilter(src, d, sigemaColor, sigmaSpace)	#雙邊濾波
#src:原始圖像
#d:過濾期間使用的各像素領域的直徑
#sigmaColor:色彩空間的sigma參數,常取150~200
#sigmaSpace:做表空間的sigma參數,常取150~200

在這裏插入圖片描述

2、代碼
import cv2
import numpy as np


def gauss_noise(image, mean=0, var=0.001):
    """
    添加高斯噪聲
    mean : 均值
    var : 方差
    """
    image = np.array(img/255, dtype=float)
    noise = np.random.normal(mean, var ** 0.5, image.shape)
    out = image + noise
    if out.min() < 0:
        low_clip = -1
    else:
        low_clip = 0
    out = np.clip(out, low_clip, 1.0)
    out = np.uint8(out*255)
    cv2.imshow("Gauss", out)
    return out


filename = r"e:\lena.jpg"
img = cv2.imread(filename)
img = gauss_noise(img)	#插入高斯噪聲

blur = cv2.blur(img, (5,5))
gauss = cv2.GaussianBlur(img, (5,5), 0)
median = cv2.medianBlur(img, 5)
bilateral = cv2.bilateralFilter(img, 5, 150, 150)

cv2.imshow('Image', blur)
cv2.imshow('Blurred', blur)
cv2.imshow('Gauss', blur)
cv2.imshow('Median filtered', median)
cv2.imshow('Bilateral filtered', bilateral)

cv2.waitKey()
cv2.destroyAllWindows()

感謝CSDN免費開課一學即懂的計算機視覺(第一季),感謝屈楨深老師的講解。本文部分圖片及代碼均取自於以上課程。

發佈了12 篇原創文章 · 獲贊 22 · 訪問量 3453
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章