OpenCV 形态学操作

形态学,即数学形态学(Mathematical Morphology),是图像处理过程中一个非常重要的研究方向。形态学主要从图像内提取分量信息,该分量信息通常对于表达和描绘图像的形状具有重要意义,通常是图像理解时所使用的最本质的形状特征。如,在识别手写数字时,能够通过形态学运算得到其骨架信息等。

形态学操作主要包含:腐蚀、膨胀、开运算、闭运算、形态学梯度运算、顶帽运算(礼帽运算)、黑帽运算等操作。

案例来源于傅老师。

1.腐蚀

腐蚀是最基本的形态学操作之一,它能够将图像的边界点消除,使图像沿着边界向内收缩,也可以将小于指定结构体元素的部分去除。

腐蚀用来“收缩”或“细化”二值图像中的前景,借此实现去除噪声、元素分割等功能。可以使用函数cv2.erode()实现腐蚀操作。

import cv2
import numpy as np
img = cv2.imread('j.bmp')
kernel = np.ones((3,3),np.uint8) 
erosion = cv2.erode(img,kernel,iterations = 1)
cv2.imshow('erosion', erosion)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV 形态学操作_第1张图片

OpenCV 形态学操作_第2张图片

2.膨胀

膨胀操作是形态学中另外一种基本的操作。膨胀操作和腐蚀操作的作用是相反的,膨胀操作将与当前对象(前景)接触到的背景点合并到当前对象内,从而实现将图像的边界点向外扩张。

膨胀操作采用函数cv2.dilate()实现对图像的膨胀操作。

import cv2
import numpy as np
img = cv2.imread('j.bmp')
kernel = np.ones((3,3),np.uint8)
dige_erosion = cv2.erode(img,kernel,iterations = 1)
kernel = np.ones((5,5),np.uint8)
dige_dilate = cv2.dilate(dige_erosion,kernel,iterations = 1)
cv2.imshow('dilate', dige_dilate)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV 形态学操作_第3张图片

3.通用形态学函数

通用形态学函数将腐蚀和膨胀操作进行组合,可以实现开运算、闭运算、形态学梯度运算、礼帽运算、黑帽运算、击中击不中等多种不同形式的运算。

OpenCV提供了函数cv2.morphologyEx()来实现上述形态学运算。

开运算:先腐蚀后膨胀

import cv2
import numpy as np
# 开:先腐蚀,再膨胀
img = cv2.imread('j.bmp')
kernel = np.ones((5,5),np.uint8) 
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV 形态学操作_第4张图片

闭运算:先膨胀后腐蚀

import cv2
import numpy as np
# 闭:先膨胀,再腐蚀
img = cv2.imread('j.bmp')
kernel = np.ones((5,5),np.uint8) 
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV 形态学操作_第5张图片

礼帽运算:原始图像 - 开运算

import cv2
import numpy as np
#礼帽
img = cv2.imread('j.bmp')
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV 形态学操作_第6张图片

黑帽运算:闭运算 - 原始图像

import cv2
import numpy as np
#黑帽
img = cv2.imread('j.bmp')
blackhat  = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat', blackhat )
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV 形态学操作_第7张图片

4.核函数

在进行形态学操作时,必须使用一个特定的核(结构元)。该核可以自定义生成,也可以通过函数cv2.getStructuringElement()构造。

import cv2
import numpy as np
img=cv2.imread('morph01.png')
img_cvt = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,img_thr = cv2.threshold(img_cvt,150,255,cv2.THRESH_BINARY)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(14,1)) 
dst1 = cv2.dilate(img_thr,kernel,iterations=1)  
kernel2 = cv2.getStructuringElement(cv2.MORPH_RECT,(1,14)) 
dst2 =cv2.dilate(img_thr,kernel2,iterations=1)
dst=cv2.bitwise_and(dst2,dst1)
cv2.imshow("img_cvt",img_cvt)
cv2.imshow("dst",dst)
cv2.imwrite("dst.jpg",dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV 形态学操作_第8张图片

OpenCV 形态学操作_第9张图片

实践

import cv2
import numpy as np 
def show(name,img):
    cv2.imshow(name,img) 
    cv2.waitKey(0)
    cv2.destroyAllWindows()
img=cv2.imread("xuexi.jpg",0)
h,w=img.shape
src=cv2.resize(img,(int(w/3),int(h/3))) 
show('src',src)
binary = cv2.threshold(src,200,255,0)[1] 
show('binary',binary)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(45,1)) 
DilateImg =cv2.dilate(binary,kernel)
result=cv2.morphologyEx(src,cv2.MORPH_BLACKHAT,kernel) 
dst=cv2.bitwise_not(result) 
show("dst",dst)

OpenCV 形态学操作_第10张图片

你可能感兴趣的:(OpenCV,opencv)