<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在一些影象中,會有一些異常的部分,比如這樣的毛刺:
對於這樣的情況,我們就可以應用複式操作了。需要注意的是,腐蝕操作只能處理二值影象,即畫素矩陣的值只有0(黑色)和255(白色)。我們先看看程式碼和效果:
import cv2 import numpy as np img = cv2.imread('dagongren.png') # 腐蝕的程式碼 kernel = np.ones((3,3),np.uint8) erosion = cv2.erode(img,kernel,iterations = 1) cv2.imshow('erosion', erosion) cv2.waitKey(0) cv2.destroyAllWindows()
這張圖片已經幾乎看不到毛刺了,但與此同時,三個文字也小了一點,這就是腐蝕操作。所謂腐蝕操作,就是我們設定一個n×n的矩陣,這個矩陣可以視為一個折積核,在原圖上進移動。矩陣覆蓋住的畫素點中,如果有0(黑色),那麼該折積核的中心位置置零,反之,如果該折積核內全都是255,則不做操作:
注意:我們可以理解成腐蝕操作是完全根據原圖生成的新圖,而不是在原土上的修改。
接下來我們再看看腐蝕的程式碼:
kernel = np.ones((3,3),np.uint8) erosion = cv2.erode(img,kernel,iterations = 1)
首先,我們要利用numpy庫生成一個n×n大小的全1矩陣kernel作為折積核,並且需要指定資料型別為無符號8位元整數。然後使用erode()函數,其接收的引數分別為影象矩陣,kernel矩陣,以及迭代次數。迭代次數就是腐蝕操作的次數。下面我們用一個圓來檢視一下不同迭代次數的腐蝕效果:
import cv2 import numpy as np kernel = np.ones((30,30),np.uint8) pie = cv2.imread('pie.png') # 觀察不同的迭代次數 erosion_1 = cv2.erode(pie,kernel,iterations = 1) erosion_2 = cv2.erode(pie,kernel,iterations = 2) erosion_3 = cv2.erode(pie,kernel,iterations = 3) res = np.hstack((erosion_1,erosion_2,erosion_3)) cv2.imshow('res', res) cv2.waitKey(0) cv2.destroyAllWindows()
腐蝕操作可以腐蝕掉二值影象的邊緣,因此可以消除掉一些圖片上的毛刺,但是損失一些原圖相中有效的部分也是在所難免的。膨脹其實就是腐蝕操作的反面。“折積核”包裹住的畫素中有255,則這個折積核中心位置會置為255,否則不變。因此,膨脹操作會把原本的影象範圍進行擴大:
import cv2 import numpy as np img = cv2.imread('dagongren.png') kernel = np.ones((3,3),np.uint8) # 膨脹操作 dige_dilate = cv2.dilate(img,kernel,iterations = 1) cv2.imshow('dilate', dige_dilate) cv2.waitKey(0) cv2.destroyAllWindows()
可以看到,膨脹操作後,影象的範圍變大了一圈,就連毛刺也都擴大了。膨脹操作通常會配合腐蝕操作一起使用的,先腐蝕在膨脹,可以在保持圖片中有效內容大小大體不變的情況下去除掉毛刺:
import cv2 import numpy as np img = cv2.imread('dagongren.png') kernel = np.ones((3,3),np.uint8) # 腐蝕 erosion = cv2.erode(img,kernel,iterations = 1) # 對原影象進行腐蝕 # 膨脹 dige_dilate = cv2.dilate(erosion,kernel,iterations = 1) # 對腐蝕後影象進行膨脹 cv2.imshow('dilate', dige_dilate) cv2.waitKey(0) cv2.destroyAllWindows()
其原理和引數意義與腐蝕操作類似,在此不做過多講解。
開運算與閉運算都是應用腐蝕與膨脹操作來處理原影象的。區別在於開運算是先腐蝕在膨脹,閉運算是先膨脹再腐蝕。這兩個操作需要用到的函數都是morphologyEx(),只需要調整引數即可完成兩種不同的操作。
執行開運算的函數是:
cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
kernel依然是n×n的矩陣,cv2.MORPH_OPEN指定了執行運算為開運算:
import cv2 import numpy as np img = cv2.imread('dagongren.png') kernel = np.ones((3,3),np.uint8) opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) cv2.imshow('opening', opening) cv2.waitKey(0) cv2.destroyAllWindows()
結果為:
和開運算基本相同,只需要把morphologyEx()函數的第二個引數改為cv2.MORPH_CLOSE即可:
import cv2 import numpy as np img = cv2.imread('dagongren.png') kernel = np.ones((3,3),np.uint8) closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel) cv2.imshow('closing', closing) cv2.waitKey(0) cv2.destroyAllWindows()
很明顯,先膨脹再腐蝕和原圖並沒有什麼區別,僅僅是比原圖大了一圈,因此閉運算也沒有開運算應用廣泛。
梯度運算本質是膨脹-腐蝕。從這個定義中不難發現,梯度就是原圖的邊緣部分。獲取梯度依然要用到morphologyEx()函數,將第二個引數改為cv2.MORPH_GRADIENT即可:
import cv2 import numpy as np img = cv2.imread('dagongren.png') kernel = np.ones((3,3),np.uint8) # 先用開運算把毛刺去掉: img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) cv2.imshow('gradient', gradient) cv2.waitKey(0) cv2.destroyAllWindows()
得到的結果就是下面這樣:
禮帽和黑帽都是翻譯的結果,因此我們不能望文生義。禮貌操作就是原始影象-開運算結果,黑帽操作是閉運算-原始輸入。依然是用morphologyEx()函數,通過修改第二個引數完成。
禮帽操作需要用到的引數是cv2.MORPH_TOPHAT。由禮帽操作的定義可以直到,禮帽操作可以得到圖片中的“毛刺”部分:
import cv2 import numpy as np img = cv2.imread('dagongren.png') kernel = np.ones((3,3),np.uint8) # 禮帽操作 tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) cv2.imshow('tophat', tophat) cv2.waitKey(0) cv2.destroyAllWindows()
得到的結果為:
黑帽操作需要用到的引數是cv2.MORPH_BLACKHAT,黑帽運算會輸出執行閉運算後的影象比原圖大出的一小圈輪廓:
import cv2 import numpy as np img = cv2.imread('dagongren.png') kernel = np.ones((5,5),np.uint8) # kernel矩陣維度大一些會讓黑帽操作的結果更明顯 # 黑帽操作 tophat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel) cv2.imshow('tophat', tophat) cv2.waitKey(0) cv2.destroyAllWindows()
到此這篇關於Python常用影象形態學操作詳解的文章就介紹到這了,更多相關Python影象形態學內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45