Python 圖像處理 OpenCV (9):圖像處理形態學開運算、閉運算以及梯度運算

2021-03-02 極客挖掘機
引言

前面介紹了圖像形態學的兩種基礎算法,圖像腐蝕和圖像膨脹,本篇接著介紹圖像形態學中的開運算、閉運算以及梯度運算。

由於內容的連貫性,請先閱讀前文「Python 圖像處理 OpenCV (8):圖像腐蝕與圖像膨脹」,了解清楚圖像的腐蝕與膨脹基礎原理。

不然真的沒辦法理解開運算和閉運算。

第一件事情還是給圖像增加噪聲,思路沿用之前加噪聲的思路,使用 Numpy 給圖片添加黑白兩種噪聲點,代碼如下:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# 讀取圖片
img = cv.imread("demo.png", cv.IMREAD_UNCHANGED)
source = cv.cvtColor(img, cv.COLOR_BGR2RGB)
rows, cols, chn = source.shape

# 加噪聲-白點噪聲
for i in range(500):
x = np.random.randint(0, rows)
y = np.random.randint(0, cols)
source[x, y, :] = 255

# 圖像保存 白點噪聲圖像
cv.imwrite("demo_noise_white.jpg", source)
print("白點噪聲添加完成")

# 重新讀取圖像
img1 = cv.imread("demo.png", cv.IMREAD_UNCHANGED)
source1 = cv.cvtColor(img1, cv.COLOR_BGR2RGB)

# 加噪聲-黑點噪聲
for i in range(1000):
x = np.random.randint(0, rows)
y = np.random.randint(0, cols)
source1[x, y, :] = 0

# 圖像保存 黑點噪聲圖像
cv.imwrite("demo_noise_black.jpg", source1)
print("黑點噪聲添加完成")

# 顯示結果
titles = ['White Img','Black Img']
images = [source, source1]

# matplotlib 繪圖
for i in range(2):
plt.subplot(1, 2, i+1), plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])

plt.show()

形態學開運算

圖像開運算實際上是一個組合運算,開運算是圖像先進行腐蝕,再進行膨脹的運算。

圖像被腐蝕後,去除了噪聲,但是也壓縮了圖像;接著對腐蝕過的圖像進行膨脹處理,使得剛才在腐蝕過程中被壓縮的圖像得以恢復原狀。

下面是一個圖像開運算的流程圖:

開運算的一些特性:

開運算能夠除去孤立的小點,毛刺和小橋,而總的位置和形狀不便。不同的結構元素的選擇導致了不同的分割,即提取出不同的特徵。

我們先不管開運算 OpenCV 為我們提供的函數是什麼,先使用前面介紹過的圖像腐蝕與膨脹處理看下結果:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# 讀取圖片
source = cv.imread("demo_noise_white.jpg", cv.IMREAD_GRAYSCALE)

# 設置卷積核
kernel = np.ones((5, 5),np.uint8)

# 圖像腐蝕
erode_img = cv.erode(source, kernel)

# 圖像膨脹
dilate_result = cv.dilate(erode_img, kernel)

# 顯示結果
titles = ['Source Img','Erode Img','Dilate Img']
images = [source, erode_img, dilate_result]

# matplotlib 繪圖
for i in range(3):
plt.subplot(1, 3, i+1), plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])

plt.show()

可以看到降噪的效果還是不錯的。

接著看 OpenCV 為開運算提供的函數。

圖像開運算主要使用到的函數是 morphologyEx() 它是形態學擴展的一組函數,而其中的 cv.MORPH_OPEN 對應的是開運算。

使用時語法如下:

dst = cv.morphologyEx(src, cv.MORPH_OPEN, kernel)

我們再使用 morphologyEx() 函數去重新實現下剛才的圖像開運算,看下和之前的結果有啥區別:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# 讀取圖片
source = cv.imread("demo_noise_white.jpg", cv.IMREAD_GRAYSCALE)

# 設置卷積核
kernel = np.ones((5, 5),np.uint8)

#圖像開運算
dst = cv.morphologyEx(source, cv.MORPH_OPEN, kernel)

# 顯示結果
titles = ['Source Img','Dst Img']
images = [source, dst]

# matplotlib 繪圖
for i in range(2):
plt.subplot(1, 2, i+1), plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])

plt.show()

至少從肉眼的角度上看不出來和之前的方式有啥區別,實際上也沒啥區別。

形態學閉運算

與開運算相反的是閉運算,閉運算是圖像先膨脹,後腐蝕,它有助於關閉前景物體內部的小孔,或物體上的小黑點。

先看下圖像閉運算的流程圖:

閉運算的一些特性:

閉運算能夠填平小湖(即小孔),彌合小裂縫,而總的位置和形狀不變。

首先還是用 dilate() 和 erode() 函數實現一下圖像閉運算,代碼如下:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# 讀取圖片
source = cv.imread("demo_noise_black.jpg", cv.IMREAD_GRAYSCALE)

# 設置卷積核
kernel = np.ones((5, 5),np.uint8)

# 圖像膨脹
dilate_result = cv.dilate(source, kernel)

# 圖像腐蝕
erode_img = cv.erode(dilate_result, kernel)

# 顯示結果
titles = ['Source Img','Dilate Img','Erode Img']
images = [source, dilate_result, erode_img]

# matplotlib 繪圖
for i in range(3):
plt.subplot(1, 3, i+1), plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])

plt.show()

如果想要使用形態學擴展的函數 morphologyEx() 則需要把裡面的參數換成 MORPH_CLOSE ,同樣,既然是形態學擴展函數,那麼圖像腐蝕和圖像膨脹也有對應的參數:

接著還是使用 MORPH_CLOSE 參數來實現下圖像的閉運算:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# 讀取圖片
source = cv.imread("demo_noise_black.jpg", cv.IMREAD_GRAYSCALE)

# 設置卷積核
kernel = np.ones((5, 5),np.uint8)

# 圖像閉運算
dst = cv.morphologyEx(source, cv.MORPH_CLOSE, kernel)

# 顯示結果
titles = ['Source Img','Dst Img']
images = [source, dst]

# matplotlib 繪圖
for i in range(2):
plt.subplot(1, 2, i+1), plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])

plt.show()

形態學梯度運算

圖像形態學的梯度運算和前面的開運算閉運算是一樣的,都是組合函數。

梯度運算實際上是圖像膨脹減去圖像腐蝕後的結果,最終我們得到的是一個類似於圖像輪廓的圖形。

梯度運算在 morphologyEx()  函數中的參數是 MORPH_GRADIENT ,示例代碼如下:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# 讀取圖片
source = cv.imread("demo.png", cv.IMREAD_GRAYSCALE)

# 設置卷積核
kernel = np.ones((5, 5), np.uint8)

# 圖像梯度運算
dst = cv.morphologyEx(source, cv.MORPH_GRADIENT, kernel)

# 顯示結果
titles = ['Source Img','Dst Img']
images = [source, dst]

# matplotlib 繪圖
for i in range(2):
plt.subplot(1, 2, i+1), plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])

plt.show()

示例代碼

如果有需要獲取源碼的同學可以在公眾號回復「OpenCV」進行獲取。

參考

http://www.woshicver.com/

https://blog.csdn.net/Eastmount/article/details/83651172

https://blog.csdn.net/hanshanbuleng/article/details/80657148

相關焦點

  • 形態學上的圖像頂帽運算和黑帽運算是什麼?
    數學形態學(Mathematical morphology)是一門建立在格論和拓撲學基礎之上的圖像分析學科,是數學形態學圖像處理的基本理論。其基本的運算包括:腐蝕和膨脹、開運算和閉運算、骨架抽取、極限腐蝕、擊中擊不中變換、形態學梯度、Top-hat變換、顆粒分析、流域變換等。本篇文章主要講解Python調用OpenCV實現圖像形態學轉化,包括圖像頂帽運算和圖像黑帽運算,基礎性知識希望對您有所幫助。1.圖像頂帽運算2.圖像黑帽運算
  • opencv教程-形態學處理、邊緣檢測
    1:形態學處理(常用於二值化圖像)腐蝕:對核範圍內的像素,只要有一個是非前景,則設置為背景;比如對於3*3的核函數,如果當前像素的3*3鄰域內像素全是前景則保留,否者設置為背景;常用於去除較小噪聲,分離物體。
  • OpenCV-Python 形態學轉換|十七
    目標在這一章當中, 我們將學習不同的形態學操作,例如侵蝕,膨脹,開運算,閉運算等。 我們將看到不同的功能,例如:cv.erode(),cv.dilate(), cv.morphologyEx()等。理論形態變換是一些基於圖像形狀的簡單操作。通常在二進位圖像上執行。
  • opencv學習—03圖像運算(一)
    在灰度圖像中,像素用8bit(1個字節)來表示,像素值的範圍是[0,255]。兩個像素值進行加法運算時求得的和可能超過255,不同的加法運算對超過255數值的處理方式不一樣。(數值,圖像):將超過圖像飽和值的數值處理為飽和值(最大值)cv2.add(圖像,數值):將超過圖像飽和值的數值處理為飽和值(最大值)【例1】使用隨機數組模擬灰度圖像,分別用加法「+」和cv2.add( )對像素值進行求和運算
  • 【OpenCV+Python】頂帽與黑帽操作
    上個教程中我們遺留了一些問題,那就是經過圖像開運算或者是閉運算之後亮度會發生變化,這就會對後期的圖像處理造成一定的困擾,所以本次教程我們介紹OpenCV
  • Python 圖像處理 OpenCV (1):入門
    引言又開一個新的系列分享,對圖像處理感興趣的同學可以關注這個系列。更新頻率儘量保持一周兩到三次推送。
  • Python+OpenCV的基礎圖像處理操作匯總
    圖像處理是對圖像進行的技術操作與分析,比如為了得到增強的圖像或提取一些有用的信息而進行的一系列操作。隨著我們的發展,許多應用程式使用圖像/幀/視頻作為輸入,對它們進行預處理,並將其輸入到設備或軟體或腳本中。圖像處理也可以是娛樂性的,可以用於許多應用。
  • 基於opencv 的圖像處理入門教程
    前言雖然計算機視覺領域目前基本是以深度學習算法為主,但實際上很多時候對圖片的很多處理方法,並不需要採用深度學習的網絡模型,採用目前成熟的圖像處理庫即可實現,比如 OpenCV 和 PIL ,對圖片進行簡單的調整大小、裁剪、旋轉,或者是對圖片的模糊操作。
  • 常用的十大 python 圖像處理工具
    但無論是用於何種用途,這些圖像都需要進行處理。圖像處理就是分析和處理數字圖像的過程,主要旨在提高其質量或從中提取一些信息,然後可以將其用於某種用途。圖像處理中的常見任務包括顯示圖像,基本操作如裁剪、翻轉、旋轉等,圖像分割,分類和特徵提取,圖像恢復和圖像識別。
  • 數學運算、矩陣和圖像
    那個時候沒有接觸微積分、沒有接觸矩陣論、沒有接觸圖像處理,也沒有接觸機器學習。我們不知道我們未來做什麼。但我們的目的是搭建一個體系,這個體系中基本上都是最基礎的知識,主要以數學為主。 從最開始的加、減、乘、除開始,有很多種數學運算,還有加權和、開方、指數、以e為底、log等運算。再到後面,有均值、方差、標準差、最值等。這些都是數學專業最最基礎的運算。
  • 「python opencv視覺零基礎實戰」七邏輯運算應用
    一、學習目標了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 基於OpenCV的圖像分割處理!
    它特別適用於目標和背景佔據不同灰度級範圍的圖像。它不僅可以極大的壓縮數據量,而且也大大簡化了分析和處理步驟,因此在很多情況下,是進行圖像分析、特徵提取與模式識別之前的必要的圖像預處理過程。閾值處理是指剔除圖像內像素值高於閾值或者低於閾值得像素點。例如,設定閾值為127,將圖像內所有像素值大於127的像素點的值設為255;將圖像內所有像素值小於127的像素點的值設為0。
  • 基於 opencv 的圖像處理入門教程
    雖然計算機視覺領域目前基本是以深度學習算法為主,但實際上很多時候對圖片的很多處理方法,並不需要採用深度學習的網絡模型,採用目前成熟的圖像處理庫即可實現,比如 OpenCV 和 PIL ,對圖片進行簡單的調整大小、裁剪、旋轉,或者是對圖片的模糊操作。
  • opencv-python圖像預處理-濾波
    為了消除外界環境對圖像採集的幹擾,增強圖像的邊緣及灰度跳變的部分,使圖像變得清晰以及提高圖像處理速度需要對圖像進行預處理操作,主要是對圖像進行濾波和增強操作。使用的方法可以分為空間域處理和頻率域處理兩類。空間域指圖像平面本身,這類圖像處理方法用各種模板直接與圖像進行卷積運算,實現對圖像的處理。
  • ImagePy——UI界面支持開放插件的Python開源圖像處理框架
    雷鋒網 AI 科技評論按,ImagePy 是一款 python 開源圖像處理框架,其 UI 界面支持開放插件。在 github:https://github.com/Image-Py/imagepy 上,不僅有關於這款圖像處理軟體的詳細介紹,還有一些使用示例,雷鋒網 AI 科技評論接下來將詳細介紹這一開源圖像處理框架。
  • OpenCV之bitwise_and、bitwise_not等圖像基本運算及掩膜
    1.圖像基本運算圖像的基本運算有很多種,比如兩幅圖像可以相加、相減、相乘、相除、位運算、平方根、對數、絕對值等;圖像也可以放大、縮小
  • OpenCV圖像分析處理(2)
    二、圖像處理調整圖像亮度與對比度圖像變換可以看作如下
  • OpenCV基礎 | 5.像素運算
    學習視頻可參見python+opencv3.3視頻教學 基礎入門[1]
  • 【OpenCV入門十七講】形態學操作
    形態學操作-膨脹跟卷積操作類似,假設有圖像A和結構元素B,結構元素B在A上面移動,其中B定義其中心為錨點,計算B覆蓋下A的最大像素值用來替換錨點的像素,其中B作為結構體可以是任意形狀形態學操作-膨脹(感官上圖像變細,變白了)
  • 手把手教你使用圖像處理利器OpenCV
    我們一開始會討論一些圖像處理,然後繼續探討不同的應用/場景,也就是圖像處理的用武之地。開始吧!什麼是圖像處理?在深入研究圖像處理的方法之前,重要的是要了解什麼是圖像處理,特別是這項技術在處理大量圖片方面的角色。圖像處理完整的說法是「數字圖像處理」,經常使用圖像處理的領域是「計算機視覺」。