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

2021-10-05 14:43:16 字數 3509 閱讀 1824

想必生活在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進行操作即可,具體的操作粗略的來說有兩大類:第一類,使用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)。

#生成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)# 儲存

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

# 均值模糊  去隨機雜訊有很好的去噪效果

#(1, 15)是垂直方向模糊,(15, 1)是水平方向模糊,我們這裡是隨機單個白噪點,選擇(3,3)進行演示

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

csdn漫談計算機視覺

github

fongtian的github專案–漫談計算機視覺

Open3D 去除mesh中的噪點

各種重建演算法的結果 比如rgbd integration 並不是只有乙個三角網格而是有多個網格。一些較小的部分 相比如主物體較小 是由於雜訊引起的,我們會想要移除它。open3d實現了乙個連通分量演算法cluster connected s,將每個三角形分配給乙個連線的三角集群,從集群中返回每乙個...

從Ajax的HelloWorld說起

從ajax的helloworld說起 收藏 就這個經典的helloworld示例,學習ajax的互動模式。還是從如何建立helloworld說起吧 1 建立 xmlhttprequest 物件 2 初始化非同步請求,xmlhttprequest物件如何做 中轉站 的工作,就在這裡體現 先獲取個客戶端...

從python的yield說起

感覺是在需要返回某個值的地方通過yield來代替return,不是很明白其用法,所以仔細研究下。乙個使用了yiled關鍵字的函式就不再是乙個普通的函式了,而是乙個生成器函式 generator function 當函式被呼叫的時候將返回乙個迭代器 iterator 所以下面將分別講解迭代器和生成器這...