需要的库和自定义函数
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) |
anchor | position 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) |
anchor | position 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) |
anchor | Anchor 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.礼帽与黑帽
礼帽 = 原始输入 - 开运算结果
即礼帽运算可以得到开运算操作中处理掉的毛刺
黑帽=闭运算结果 - 原始输入
即黑帽运算可以得到原始输入中图像的大致轮廓