OpenCV-形态学操作

形态学操作

  • 腐蚀
  • 膨胀
  • 通用形态学函数
    • 开:先腐蚀,再膨胀
    • 闭:先膨胀,再腐蚀
    • 梯度=膨胀-腐蚀
  • 礼帽与黑帽
    • 礼帽
    • 黑帽
  • 核函数
    • 检测直线
    • 去除文章批注

形态学,即数学形态学(Mathematical Morphology),是图像处理过程中一个非常重要的研究方向。形态学主要从图像内提取分量信息,该分量信息通常对于表达和描绘图像的形状具有重要意义,通常是图像理解时所使用的最本质的形状特征。例如,在识别手写数字时,能够能够通过形态学运算得到其骨架信息,在具体识别时,仅针对其骨架进行运算即可,形态学处理在视觉检测、文字识别、医学图像处理、图像压缩编码等领域都有非常重要的应用。
形态学操作主要包含:服饰、膨胀、开运算、闭运算、形态学梯度(Morphological Gradient)运算、顶帽运算(礼帽运算)、黑帽运算等操作。腐蚀操作和膨胀操作是形态学运算的基础,将腐蚀和膨胀操作进行结合,就可以实现开运算、闭运算、形态学梯运算、礼帽运算、黑帽运算、击中击不中等不同形式的运算。

腐蚀

腐蚀是最基本的形态学操作之一,它能够将图像的边界点消除,使图像沿着边界向内收缩,也可以将小于指定结构体元素的部分去除。
腐蚀用来收缩或者细化二值图像中的前景,借此实现去噪声,元素分割等功能

在open cv中,使用函数cv2.erode()实现腐蚀操作,其语法格式为:

dst = cv2.erode(src, kernel [, anchor[, iterations [ , borderType[ , borderValue]]]])

dst 是腐蚀后所输出的目标图像,该图像和原始图像具有同样的类型和大小。
src是需要进行腐蚀的原始图像,图像的通道数可以是任意的,但是要求图像的深度必须是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F中的一种。
kernel代表腐蚀操作时采用的结构类型。它可以自定义生成,也可以通过函数cv2.getStructuringElement()生成。
anchor代表element结构中锚点的位置。该值默认为(-1,-1),在核的中心位置。
iterations 是腐蚀操作选代的次数,该值默认为1,即只进行一次腐蚀操作。
borderType代表边界样式,一般采用其默认值BORDER_CONSTANT。

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

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

pie = cv2.imread('j.bmp')
cv2.imshow('J', pie)
cv2.waitKey(0)
cv2.destroyAllWindows()
kernel = np.ones((30,30),np.uint8) 
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()

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

膨胀

膨胀操作是形态学中另外一种基本的操作。膨胀操作和腐蚀操作的作用是相反的,膨胀操作能对图像的边界进行扩张。膨胀操作将当前对象(前景)接触到的背景点合并、到当前对象内,从而实现将图像的边界点向外扩张。如果图像内两个对象的距离较近,那么在膨胀的过程中,两个对象可能会连通在一起。膨胀操作对填补图像分割后图像内所存在的空白相对有帮助。
同腐蚀过程一样,在膨胀过程中,也是使用一个结构元素逐个像素的扫描要被膨胀的图像,并根据结构元和待膨胀图像的关系来确定膨胀结果。
在open cv中,使用函数cv2.dilate()实现膨胀操作,其函数的语法格式为:

dst = cv2.dilate(src, kernel [, anchor[, iterations [ , borderType[ , borderValue]]]])

dst 是膨胀后所输出的目标图像,该图像和原始图像具有同样的类型和大小。
src是代表需要进行膨胀的原始图像,图像的通道数可以是任意的,但是要求图像的深度必须是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F中的一种。
element代表膨胀操作时采用的结构类型。它可以自定义生成,也可以通过函数cv2.getStructuringElement()生成。
参数kernel、anchor、iterations、borderType、borderValue与函数cv2.erode()内相应的函数一致。

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

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

kernel = np.ones((5,5),np.uint8) 
dige_dilate = cv2.dilate(dige_erosion,kernel,iterations = 1)
cv2.imshow('dilate', dige_dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()
pie = cv2.imread('j.bmp')
kernel = np.ones((30,30),np.uint8) 
dilate_1 = cv2.dilate(pie,kernel,iterations = 1)
dilate_2 = cv2.dilate(pie,kernel,iterations = 2)
dilate_3 = cv2.dilate(pie,kernel,iterations = 3)
res = np.hstack((dilate_1,dilate_2,dilate_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

通用形态学函数

开:先腐蚀,再膨胀

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-形态学操作_第10张图片

闭:先膨胀,再腐蚀

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-形态学操作_第11张图片

梯度=膨胀-腐蚀

pie = cv2.imread('j.bmp')
kernel = np.ones((7,7),np.uint8) 
dilate = cv2.dilate(pie,kernel,iterations = 5)
erosion = cv2.erode(pie,kernel,iterations = 5)

res = np.hstack((dilate,erosion))

cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)

cv2.imshow('gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV-形态学操作_第12张图片
OpenCV-形态学操作_第13张图片

礼帽与黑帽

礼帽 = 原始输入-开运算结果
黑帽 = 闭运算-原始输入

礼帽

img = cv2.imread('j.bmp')
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV-形态学操作_第14张图片

黑帽

img = cv2.imread('j.bmp')
blackhat  = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat', blackhat )
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV-形态学操作_第15张图片

核函数

检测直线

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("img_thr",img_thr)
cv2.imshow("dst1",dst1)
cv2.imshow("dst2",dst2)
cv2.imshow("dst",dst)
cv2.imwrite("dst.jpg",dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV-形态学操作_第16张图片

去除文章批注

import cv2
import numpy as np
def show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
img = cv2.imread("00000.jpg",0)
a=cv2.resize(img,(300,500))
show("src",img)
binary=cv2.threshold(a,250,255,0)[1]
show('binary',binary)
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(66,1))
blackhat=cv2.morphologyEx(a,cv2.MORPH_BLACKHAT,kernel)
show('blackhat',255-blackhat)

OpenCV-形态学操作_第17张图片OpenCV-形态学操作_第18张图片

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