1. 程式人生 > >OpenCV---膨脹與腐蝕

OpenCV---膨脹與腐蝕

unknown strong 圓形 14. waitkey 不同 tco detail 第一個

膨脹

技術分享圖片技術分享圖片

腐蝕

技術分享圖片技術分享圖片

一:膨脹實現dilate

import cv2 as cv
import numpy as np

def dilate_demo(image):  #膨脹
    print(image.shape)
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)
    cv.imshow("binary",binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT,(5
,5)) dst = cv.dilate(binary,kernel) cv.imshow("dilate_demo",dst) src = cv.imread("./5.png") #讀取圖片 cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #創建GUI窗口,形式為自適應 cv.imshow("input image",src) #通過名字將圖像和窗口聯系 dilate_demo(src) cv.waitKey(0) #等待用戶操作,裏面等待參數是毫秒,我們填寫0,代表是永遠,等待用戶操作 cv.destroyAllWindows() #銷毀所有窗口

技術分享圖片

二:實現腐蝕erode

def erode_demo(image):  #腐蝕
    print(image.shape)
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)
    cv.imshow("binary",binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3))  #可以修改卷積核大小來增加腐蝕效果,越大腐蝕越強
dst
= cv.erode(binary,kernel) cv.imshow("erode_demo",dst) src = cv.imread("./5.png") #讀取圖片 cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #創建GUI窗口,形式為自適應 cv.imshow("input image",src) #通過名字將圖像和窗口聯系 erode_demo(src) cv.waitKey(0) #等待用戶操作,裏面等待參數是毫秒,我們填寫0,代表是永遠,等待用戶操作 cv.destroyAllWindows() #銷毀所有窗口

技術分享圖片

kernel = cv.getStructuringElement(cv.MORPH_RECT,(5,5))

技術分享圖片

相關知識補充

(一)可以看做膨脹是將白色區域擴大,腐蝕是將黑色區域擴大

(二)可以不進行灰度處理,對彩色圖片進行處理

(1)膨脹

kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
dst = cv.dilate(src,kernel)
cv.imshow("result",dst)

技術分享圖片

(2)腐蝕

kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
dst = cv.erode(src,kernel)
cv.imshow("result",dst)

技術分享圖片

(三)getStructuringElement方法

推文:OpenCV中獲取不同形狀的結構元素getStructuringElement

自定義一個結構元素kernel,要聲明一個Mat,然後對Mat的元素賦值;這種方法靈活但略顯復雜
OpenCV提供了一個函數getStructuringElement,可以獲取常用的結構元素的形狀:矩形(包括線形)、橢圓(包括圓形)及十字形。
getStructuringElement的內部並沒有什麽優化實現,只是封裝了一下功能。其原理同樣是聲明一個Mat,然後求形狀,指定Mat的值。
十字形為單線寬。
總之:getStructuringElement是一種更加簡便的方法實現一個kernel
MORPH_RECT, MORPH_ELLIPSE, MORPH_CROSS

參數:

cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
def getStructuringElement(shape, ksize, anchor=None): # real signature unknown; restored from __doc__
第一個參數shape:表示內核的形狀,有三種形狀可以選擇
矩形:MORPH_RECT;
交叉形:MORPH_CORSS;
橢圓形:MORPH_ELLIPSE;
第二個參數ksize:是內核的尺寸(n,n)
第三個參數anchor:錨點的位置

返回值:

getStructuringElement函數會返回指定形狀和尺寸的結構元素。

OpenCV---膨脹與腐蝕