Opencv学习笔记四——图像形态学操作

需要的库和自定义函数

import cv2
import numpy as np
import matplotlib.pyplot as plt

def cv_show(name, mat):
    cv2.imshow(name, mat)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

 图像形态学操作最基本的两个处理:腐蚀和膨胀

一、腐蚀操作——erode

对图片外围进行销蚀处理,让图像变“瘦”。可用于处理图像中的毛刺。

###        函数原型
void cv::erode 	( InputArray  src,
		OutputArray  	dst,
		InputArray  	kernel,
		Point  	anchor = Point(-1,-1),
		int  	iterations = 1,
		int  	borderType = BORDER_CONSTANT,
		const Scalar &  	borderValue = morphologyDefaultBorderValue() 
	) 		
###        在python中使用
dst	= cv2.erode(src, kernel, dst, anchor, iterations, borderType, borderValue)
src原图像,通道数可以是任意的。但深度须是CV_8U, CV_16U, CV_16S, CV_32F , CV_64F其中的一种
dst处理后的图像,大小类型须和原图像相同
kernel参考的像素点范围(a, b)
anchorposition of the anchor within the element; default value (-1, -1) means that the anchor is at the element center.
iterations迭代次数
borderType像素外推方法
borderValue边界值(在边界为常量的情况下)

 注意:kernel可以用numpy的ones方法创建

anchor参数、borderType参数和boarderValue参数一般使用缺省

loardImg = 'C://Users//rwhite//Pictures//opencv//testt.jpg'

img = cv2.imread(loardImg)
#cv_show('before', img)

kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(img, kernel, iterations=2)
#cv_show('after', erosion)

cv2.imwrite('C://Users//rwhite//Pictures//opencv//after.jpg', erosion)

二、膨胀操作——dilate

对图片外围进行膨胀处理,让图像变“胖”。可用于突出图像的某些特征,更容易识别。

###        函数原型
void cv::dilate (InputArray  	src,
		OutputArray  	dst,
		InputArray  	kernel,
		Point  	anchor = Point(-1,-1),
		int  	iterations = 1,
		int  	borderType = BORDER_CONSTANT,
		const Scalar &  borderValue = morphologyDefaultBorderValue() 
	) 		
###        在python中使用
dst	= cv2.dilate(src, kernel, dst, anchor, iterations, borderType)

src原图像,通道数可以是任意的。但深度须是CV_8U, CV_16U, CV_16S, CV_32F , CV_64F其中的一种
dst处理后的图像,大小类型须和原图像相同
kernel参考的像素点范围(a, b)
anchorposition of the anchor within the element; default value (-1, -1) means that the anchor is at the element center.
iterations迭代次数
borderType像素外推方法
borderValue边界值(在边界为常量的情况下

 注意:各个参数用法与erode函数的相同

loardImg = 'C://Users//rwhite//Pictures//opencv//testt.jpg'

img = cv2.imread(loardImg)
#cv_show('before', img)

kernel = np.ones((5, 5), np.uint8)
dil = cv2.dilate(img, kernel, iterations=5)

cv2.imwrite('C://Users//rwhite//Pictures//opencv//after.jpg', dil)
#cv_show('after', dil)

三、morphologyEx函数的使用

【开运算与闭运算、计算梯度、礼帽与黑帽】

###        函数原型
void cv::morphologyEx(InputArray  src,
		OutputArray  	dst,
		int  	op,
		InputArray  kernel,
		Point  	anchor = Point(-1,-1),
		int  	iterations = 1,
		int  	borderType = BORDER_CONSTANT,
		const Scalar &  borderValue = morphologyDefaultBorderValue() 
	) 		
###        在python中使用
dst	= cv2.morphologyEx(src, op, kernel, dst, anchor, iterations, borderType, borderValue)
src原图像,通道数可以是任意的。但深度须是CV_8U, CV_16U, CV_16S, CV_32F , CV_64F其中的一种
dst处理后的图像,大小类型须和原图像相同
op运算方式
kernel参考的像素点范围(a, b)
anchorAnchor position with the kernel. Negative values mean that the anchor is at the kernel center.
iterations迭代次数
borderType像素外推方法
borderValue边界值(在边界为常量的情况下

注意:其中op参数用于指定运算方式,可选值如下:

cv2.MORPH_ERODE

膨胀操作

cv2.MORPH_DILATE

腐蚀操作

cv2.MORPH_OPEN

开运算

cv2.MORPH_CLOSE

闭运算

cv2.MORPH_GRADIENT

计算图像梯度

cv2.MORPH_TOPHAT

礼帽运算

cv2.MORPH_BLACKHAT

黑帽运算

cv2.MORPH_HITMISS

"hit or miss" .- Only supported for CV_8UC1 binary images. A tutorial can be found in the documentation

1.开运算与闭运算

开运算先对图像进行腐蚀操作后进行膨胀操作;而闭运算相反,先膨胀在腐蚀。

        开运算:先腐蚀会增加黑点的数量,抹去较小的白点;再进行膨胀操作将黑点变回原样,这样会使被抹去的区域消失。我们在移除小的对象时候很有用(假设物品是亮色,前景色是黑色),被用来去除噪声。

        闭运算:先膨胀将白色部分变大,此时小的黑色区域会被挤掉,然后腐蚀再将一些大的黑色的部分还原回来,整体得到的效果就是:抹去前景物体上的小黑点。通常是用来填充前景物体中的小洞,或者抹去前景物体上的小黑点

img = cv2.imread('C://Users//rwhite//Pictures//opencv//testtt.jpg', cv2.IMREAD_GRAYSCALE)

kernel = np.ones((7, 7), np.uint8)
close = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
open  = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

 2.梯度运算

膨胀后的图像减去腐蚀后的图像,得到一个图像的轮廓。这个操作就是梯度运算。

img = cv2.imread('C://Users//rwhite//Pictures//opencv//test.jpg', cv2.IMREAD_GRAYSCALE)

kernel = np.ones((7, 7), np.uint8)
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

cv2.imwrite('C://Users//rwhite//Pictures//opencv//gradient.jpg', gradient)

3.礼帽与黑帽

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

 即礼帽运算可以得到开运算操作中处理掉的毛刺

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

即黑帽运算可以得到原始输入中图像的大致轮廓

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值