亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python常用圖像形態(tài)學(xué)操作詳解

 更新時(shí)間:2022年08月17日 10:46:13   作者:有理想的打工人  
這篇文章主要為大家詳細(xì)介紹幾個(gè)Python中常用的圖像形態(tài)學(xué)操作:腐蝕、膨脹、開(kāi)閉運(yùn)算、梯度運(yùn)算、禮帽和黑帽,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

腐蝕

在一些圖像中,會(huì)有一些異常的部分,比如這樣的毛刺:

對(duì)于這樣的情況,我們就可以應(yīng)用復(fù)式操作了。需要注意的是,腐蝕操作只能處理二值圖像,即像素矩陣的值只有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()

這張圖片已經(jīng)幾乎看不到毛刺了,但與此同時(shí),三個(gè)文字也小了一點(diǎn),這就是腐蝕操作。所謂腐蝕操作,就是我們?cè)O(shè)置一個(gè)n×n的矩陣,這個(gè)矩陣可以視為一個(gè)卷積核,在原圖上進(jìn)移動(dòng)。矩陣覆蓋住的像素點(diǎn)中,如果有0(黑色),那么該卷積核的中心位置置零,反之,如果該卷積核內(nèi)全都是255,則不做操作:

注意:我們可以理解成腐蝕操作是完全根據(jù)原圖生成的新圖,而不是在原土上的修改。

接下來(lái)我們?cè)倏纯锤g的代碼:

kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)

首先,我們要利用numpy庫(kù)生成一個(gè)n×n大小的全1矩陣kernel作為卷積核,并且需要指定數(shù)據(jù)類型為無(wú)符號(hào)8位整數(shù)。然后使用erode()函數(shù),其接收的參數(shù)分別為圖像矩陣,kernel矩陣,以及迭代次數(shù)。迭代次數(shù)就是腐蝕操作的次數(shù)。下面我們用一個(gè)圓來(lái)查看一下不同迭代次數(shù)的腐蝕效果:

import cv2
import numpy as np
kernel = np.ones((30,30),np.uint8)
pie = cv2.imread('pie.png')
# 觀察不同的迭代次數(shù)
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()

膨脹

腐蝕操作可以腐蝕掉二值圖像的邊緣,因此可以消除掉一些圖片上的毛刺,但是損失一些原圖相中有效的部分也是在所難免的。膨脹其實(shí)就是腐蝕操作的反面。“卷積核”包裹住的像素中有255,則這個(gè)卷積核中心位置會(huì)置為255,否則不變。因此,膨脹操作會(huì)把原本的圖像范圍進(jìn)行擴(kuò)大:

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()

可以看到,膨脹操作后,圖像的范圍變大了一圈,就連毛刺也都擴(kuò)大了。膨脹操作通常會(huì)配合腐蝕操作一起使用的,先腐蝕在膨脹,可以在保持圖片中有效內(nèi)容大小大體不變的情況下去除掉毛刺:

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) # 對(duì)原圖像進(jìn)行腐蝕
# 膨脹
dige_dilate = cv2.dilate(erosion,kernel,iterations = 1) # 對(duì)腐蝕后圖像進(jìn)行膨脹
cv2.imshow('dilate', dige_dilate)

cv2.waitKey(0)
cv2.destroyAllWindows()

其原理和參數(shù)意義與腐蝕操作類似,在此不做過(guò)多講解。

開(kāi)運(yùn)算與閉運(yùn)算

開(kāi)運(yùn)算與閉運(yùn)算都是應(yīng)用腐蝕與膨脹操作來(lái)處理原圖像的。區(qū)別在于開(kāi)運(yùn)算是先腐蝕在膨脹,閉運(yùn)算是先膨脹再腐蝕。這兩個(gè)操作需要用到的函數(shù)都是morphologyEx(),只需要調(diào)整參數(shù)即可完成兩種不同的操作。

開(kāi)運(yùn)算

執(zhí)行開(kāi)運(yùn)算的函數(shù)是:

cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

kernel依然是n×n的矩陣,cv2.MORPH_OPEN指定了執(zhí)行運(yùn)算為開(kāi)運(yùn)算:

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()

結(jié)果為:

閉運(yùn)算

和開(kāi)運(yùn)算基本相同,只需要把morphologyEx()函數(shù)的第二個(gè)參數(shù)改為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()

很明顯,先膨脹再腐蝕和原圖并沒(méi)有什么區(qū)別,僅僅是比原圖大了一圈,因此閉運(yùn)算也沒(méi)有開(kāi)運(yùn)算應(yīng)用廣泛。

梯度運(yùn)算

梯度運(yùn)算本質(zhì)是膨脹-腐蝕。從這個(gè)定義中不難發(fā)現(xiàn),梯度就是原圖的邊緣部分。獲取梯度依然要用到morphologyEx()函數(shù),將第二個(gè)參數(shù)改為cv2.MORPH_GRADIENT即可:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
kernel = np.ones((3,3),np.uint8)
# 先用開(kāi)運(yùn)算把毛刺去掉:
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()

得到的結(jié)果就是下面這樣:

禮帽與黑帽

禮帽和黑帽都是翻譯的結(jié)果,因此我們不能望文生義。禮貌操作就是原始圖像-開(kāi)運(yùn)算結(jié)果,黑帽操作是閉運(yùn)算-原始輸入。依然是用morphologyEx()函數(shù),通過(guò)修改第二個(gè)參數(shù)完成。

禮帽

禮帽操作需要用到的參數(shù)是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()

得到的結(jié)果為:

黑帽

黑帽操作需要用到的參數(shù)是cv2.MORPH_BLACKHAT,黑帽運(yùn)算會(huì)輸出執(zhí)行閉運(yùn)算后的圖像比原圖大出的一小圈輪廓:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
kernel = np.ones((5,5),np.uint8) # kernel矩陣維度大一些會(huì)讓黑帽操作的結(jié)果更明顯
# 黑帽操作
tophat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()

到此這篇關(guān)于Python常用圖像形態(tài)學(xué)操作詳解的文章就介紹到這了,更多相關(guān)Python圖像形態(tài)學(xué)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python TK庫(kù)簡(jiǎn)單應(yīng)用(實(shí)時(shí)顯示子進(jìn)程輸出)

    python TK庫(kù)簡(jiǎn)單應(yīng)用(實(shí)時(shí)顯示子進(jìn)程輸出)

    這篇文章主要介紹了python TK庫(kù)簡(jiǎn)單應(yīng)用(實(shí)時(shí)顯示子進(jìn)程輸出),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • 深入了解Python中Lambda函數(shù)的用法

    深入了解Python中Lambda函數(shù)的用法

    lambda函數(shù)是Python中常用的內(nèi)置函數(shù),又稱為匿名函數(shù)。和普通函數(shù)相比,它只有函數(shù)體,省略了def和return,使得結(jié)構(gòu)看起來(lái)更精簡(jiǎn)。本文將詳細(xì)說(shuō)說(shuō)Lambda函數(shù)的用法,需要的可以參考一下
    2022-09-09
  • Numpy中的數(shù)組搜索中np.where方法詳細(xì)介紹

    Numpy中的數(shù)組搜索中np.where方法詳細(xì)介紹

    這篇文章主要介紹了Numpy中的數(shù)組搜索中np.where方法詳細(xì)介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Python學(xué)習(xí)之時(shí)間包使用教程詳解

    Python學(xué)習(xí)之時(shí)間包使用教程詳解

    本文主要介紹了Python中的內(nèi)置時(shí)間包:datetime包?與?time包?,通過(guò)學(xué)習(xí)時(shí)間包可以讓我們的開(kāi)發(fā)過(guò)程中對(duì)時(shí)間進(jìn)行輕松的處理,快來(lái)跟隨小編一起學(xué)習(xí)一下吧
    2022-03-03
  • Python中with及contextlib的用法詳解

    Python中with及contextlib的用法詳解

    這篇文章主要介紹了Python中with及contextlib的用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了with及contextlib的功能、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-06-06
  • Python使用tkinter模塊實(shí)現(xiàn)推箱子游戲

    Python使用tkinter模塊實(shí)現(xiàn)推箱子游戲

    這篇文章主要介紹了Python使用tkinter模塊實(shí)現(xiàn)推箱子游戲,主要分享兩點(diǎn),第一就是這個(gè)程序的實(shí)現(xiàn)過(guò)程,第二點(diǎn)就是我在編寫(xiě)過(guò)程中的一些思考。本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參看下吧
    2019-10-10
  • pycharm中導(dǎo)入模塊錯(cuò)誤時(shí)提示Try to run this command from the system terminal

    pycharm中導(dǎo)入模塊錯(cuò)誤時(shí)提示Try to run this command from the system ter

    這篇文章主要介紹了pycharm中導(dǎo)入模塊錯(cuò)誤時(shí)提示Try to run this command from the system terminal問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 淺談Python實(shí)時(shí)檢測(cè)CPU和GPU的功耗

    淺談Python實(shí)時(shí)檢測(cè)CPU和GPU的功耗

    本文主要介紹了淺談Python實(shí)時(shí)檢測(cè)CPU和GPU的功耗,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Python實(shí)現(xiàn)獲取網(wǎng)站PR及百度權(quán)重

    Python實(shí)現(xiàn)獲取網(wǎng)站PR及百度權(quán)重

    這篇文章主要介紹了Python實(shí)現(xiàn)獲取網(wǎng)站PR及百度權(quán)重,本文使用傳參的方式請(qǐng)求站長(zhǎng)工具和谷歌工具獲取PR值和百度權(quán)重,需要的朋友可以參考下
    2015-01-01
  • 在Python中調(diào)用ggplot的三種方法

    在Python中調(diào)用ggplot的三種方法

    這篇文章主要介紹了在Python中調(diào)用ggplot的三種方法,ggplot作為一個(gè)圖形庫(kù),經(jīng)常被用來(lái)制作數(shù)據(jù)的可視化視圖,需要的朋友可以參考下
    2015-04-04

最新評(píng)論