1 膨胀
功能
寻找图像中的局部极大值,将图像中的高亮区域进行扩张,运行出来的结果比原图的高亮区域更多。
参数
src: 输入矩阵
kernel: 卷积核
dts: 输出矩阵
anchor: 卷积核矩阵的锚点, 默认将卷积核矩阵的中心点作为锚点
iterations: 膨胀或腐蚀操作的迭代次数
borderType: 边界扩充的模式, 默认不扩充
borderValue: 当borderType=cv2.BORDER_CONSTANT时, 扩充边界的元素以borderValue填充
borderType
BorderTypes.Default=>不填充
BorderTypes.Constant=>填充边缘用指定的像素值(borderValue)
BorderTypes.Replicate=>填充边缘像素用已知的边缘像素值
BorderTypes.Wrap=>用另一边的像素来补偿填充
计算过程
类似于卷积处理,设定一个元素全为1的卷积核矩阵,卷积计算后,该像素点的值等于以该像素点为中心的卷积核矩阵范围内的最大值。如下图case1所示,红框为3*3的卷积核,膨胀操作就是将卷积核区域内的最大值赋给卷积核的中心点(8替换了1),
case1(默认无填充)
case2(使用常数填充)
python代码
from cv2 import BORDER_CONSTANT, MORPH_RECT
import numpy as np
import cv2
x = np.array([
[1, 2, 3, 4],
[8, 7, 6, 5],
[9, 10, 11, 12],
[16, 15, 14, 13]
],
dtype=np.float64())
kernel = cv2.getStructuringElement(MORPH_RECT, (3,3))
# case1
y1 = cv2.dilate(x, kernel, iterations=1)
print(y1)
# 打印结果
'''
[[ 8. 8. 7. 6.]
[10. 11. 12. 12.]
[16. 16. 15. 14.]
[16. 16. 15. 14.]]
'''
# 把borderType设置为BorderTypes.Constant, borderValue设为100
# case2
y2 = cv2.dilate(x, kernel, iterations=1, borderType=BORDER_CONSTANT, borderValue=100)
print(y2)
# 打印结果
'''
[[100. 100. 100. 100.]
[100. 11. 12. 100.]
[100. 16. 15. 100.]
[100. 100. 100. 100.]]
'''
c++代码
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat src = imread("D:\\c++_opencv\\images\\0--Parade_0_Parade_marchingband_1_20.jpg", IMREAD_ANYCOLOR);
imshow("input", src);
Mat dst;
Mat kernel = getStructuringElement(MORPH_RECT, Size(3,3));
dilate(src, dst, kernel);
imshow("output", dst);
waitKey(0);
destroyAllWindows();
return 0;
}
2 腐蚀
功能
寻找图像中的局部极小值,将图像中的高亮区域进行缩减,运行出来的结果比原图的高亮区域更少。
计算过程
类似于卷积处理,设定一个元素全为1的卷积核矩阵,卷积计算后,该像素点的值等于以该像素点为中心的卷积核矩阵范围内的最小值。如下图所示,红框为3*3的卷积核,膨胀操作就是将卷积核区域内的最小值赋给卷积核的中心点(11替换了13),
python代码
from cv2 import BORDER_CONSTANT, MORPH_RECT
import numpy as np
import cv2
x = np.array([
[1, 2, 3, 4],
[8, 7, 6, 5],
[9, 10, 11, 12],
[16, 15, 14, 13]
],
dtype=np.float64())
kernel = cv2.getStructuringElement(MORPH_RECT, (3,3))
y1 = cv2.erode(x, kernel, iterations=1)
print(y1)
# 打印结果
'''
[[ 1. 1. 2. 3.]
[ 1. 1. 2. 3.]
[ 7. 6. 5. 5.]
[ 9. 9. 10. 11.]]
'''