從去除噪點的說起,有OpenCV要什麼PS?

寫在最前

想必生活在2020的我們一定不得不對PS有所瞭解或者接觸,雖然現在藉助人工智能技術,ps已經變成了一代“神級”妖術,但是憶往昔,早期的PS其實也不過是一堆計算機視覺裏的算法罷了。其實我們就可以使用計算機視覺裏的技術來做一次人肉PS,提到計算機視覺逃不過的坎肯定是OpenCV,而又繞不過的坎肯定是深度學習,所以我們乾脆點直接opencv-python來進行我們的旅程。只不過這次我不想劍指(劍指系列,之前寫的一系列一般會由淺入深,最終目標是深挖)了,所以我們這次漫談計算機視覺,從最基本的OpenCV慢慢講起,一直講到這幾年比較好的深度學習各個領域。

正文開頭

OpenCV一個出色的開源框架,其中Open指的就是OpenSource,開源。而CV則是計算機視覺(Computer Vision)。依靠OpenCV背後開源社區背書,其不僅在過去實現了絕大多數計算機視覺所需要的基礎算法,同時也能跟隨時代發展不斷更新新的神經網絡。

我們在之前曾經編寫過OpenCV實現人臉識別,爲了更好地進行之後技術的發展。我們自然需要對OpenCV進一步學習。今天就是從最基本的內容——去除噪點開始,同時學習OpenCV的基本操作。

計算機女神——蕾娜

在這裏插入圖片描述

lena圖是計算機視覺非常經典的圖像,她的優勢在於圖像顏色豐富,明暗明顯,而且輪廓,邊角等都有豐富存在對演示多種算法都有不錯的效果(當然也很漂亮,所以更容易廣泛傳播)。我們這次包括之後都會有很多地方能夠用到她。順便一提,上面這幅圖片來自OpenCV的官方,你可以在opencv的github項目中找到她。

圖片的讀取,展示與存儲

opencv的安裝非常簡單,我們主要在python中使用它,因此使用“pip install opencv-python”進行安裝即可。然後我們在python中引用OpenCV類庫,並使用即可。

讀取和保存的具體代碼如下:

import cv2 as cv

# 讀取圖片
src=cv.imread('/lena.jpg')

# 存儲圖片
cv.imwrite('images/lena_write.jpg',src)

可以看到代碼非常簡單,那麼如何進行如想處理呢?其實也非常簡單,只需要對src進行操作即可,具體的操作粗略的來說有兩大類:第一類,使用opencv的方法進行處理,包括類型轉換,濾波,反轉等等圖像操作,在這一類操作中,圖像依舊是opencv的存儲格式。而第二大類,則是從比較數學的角度考慮,存儲的圖像本質不過是一個多維矩陣(或者多維數組),那麼我們自然也可以使用python中的其他矩陣處理的類庫對其進行處理,甚至編寫自己的圖像處理算法等等。

我們剛剛說到的展示圖片,本質也是一種矩陣操作——以合適的像素展示於屏幕。我們也可以有多種方法解決該問題,下面就是有關代碼:

# 展示圖片
cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE)
cv.imshow('input_image', src)
cv.waitKey(0)

# 刪除建立的全部窗口,釋放資源
cv.destroyAllWindows()

上面的代碼非常簡單,甚至在這裏第一行還可以沒有,也沒有太大影響。至於代碼的具體解釋如下:第一行代碼的參數namedWindow,是創建一個窗口,第一個參數是窗口名字,第二個是尺寸。inshow適用於展示圖片的函數,第一個參數是輸入的窗口的標題,第二個是存儲的圖像。第三行是等待輸入以確定之後的操作,不設置的話,之前創建的窗口會直接退出。我們也可以通過設置具體的輸入鍵,使窗口在接收輸入之後自動執行後續的代碼。最後一行是刪除所有窗口來釋放計算資源,主要是爲了保障資源的釋放,這樣更安全合理一些。

圖片加噪

許多時候圖片會出現噪點,目前隨着各種技術的提升,噪點已經比較少見了,但是我們仍然會很多更專業的領域遇到這類問題。opencv就自帶了很多濾波方法可以用於去噪,同時也帶有多種去噪。我們首先使用隨機函數爲圖片添加隨機的噪點,也就是白點,然後使用非局部平均算法進行去噪。由於opencv的原圖大小爲400×400,所以我們需要生成的隨機噪點範圍爲(0,399)。

filePath = 'images/lena.jpg'
img = cv.imread(filePath)

for i in range(1000): #生成1000個噪點
    a = random.randint(0,399)
    b = random.randint(0,399)
    img[a,b] = 255

cv.imshow("noise",img)		# 顯示噪點圖

在這裏插入圖片描述

圖像去噪

不同的去噪方法對應着不同的噪點,我們這裏首先使用非局部平均算法進行圖像去噪,這是一種比較通用的去噪方法。缺點在於由於採用圖像的冗餘數據進行去噪,對於邊緣部分的處理效果往往比較不太好。

dst = cv.fastNlMeansDenoisingColored(img, None, 12, 12, 7, 21)

# 保存圖片
cv.imwrite("/home/fonttian/Documents/MyBlog/OpenCV/images/lena_noise_1000_do.jpg",dst)

fastNlMeansDenoisingColored 圖像去噪

由上面可以看出該方法並不太適用於邊緣噪點,同時由於進行了局部平均,因此也會喪失一些局部細節。那麼這個時候我們就需要使用一些更直接的濾波方法進行去噪。常見的濾波器有很多種,濾波器本身就是一個小的矩陣,也本質等同與現在深度學習常用的卷積核。只不過我們這裏是直接使用特定的軍陣運算對圖像進行處理。與局部平均算法類似的是均值濾波,但是如果只是簡單的將幾個相鄰的數值進行均值計算的話,由於我們這裏的添加是白噪點(最大像素255),那麼就會不可避免的導致周圍平均後全部變白。因此我們需要使用的是其他參數。這裏我們選擇了中值濾波進行濾波。兩種濾波器的參數都是指參數範圍。具體代碼和效果如下:

# 均值模糊  去隨機噪聲有很好的去噪效果
#(1, 15)是垂直方向模糊,(15, 1)是水平方向模糊,我們這裏是隨機單個白噪點,選擇(3,3)進行演示
dst = cv.blur(img, (3, 3))

均值濾波去除噪點

中值濾波則比較合適,具體代碼和效果如下

dst = cv.medianBlur(img, 3)

中值濾波去除噪點

可以看到中值濾波在這裏的去噪效果和細節保留都非常好。而如果假如我們面對更多的噪聲類型,則也需要具體情況具體分析,選擇合理的處理方法。這個我們將在之後的內容中一一教給大家。

專欄地址

CSDN

漫談計算機視覺

github

fongtian的github項目–漫談計算機視覺

公衆號
本文章首發於我司的公衆號“小白白AI學習”,這是我們高尋真源(山東)教育科技有限公司創辦的公衆號,主要目標是爲了促進大數據與人工智能在山東高校的發展和落地。歡迎大家關注我們的公衆號,一起交流學習,共同進步。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章