opencv之膨胀、腐蚀

1 膨胀

功能

寻找图像中的局部极大值,将图像中的高亮区域进行扩张,运行出来的结果比原图的高亮区域更多。

参数

src: 输入矩阵
kernel: 卷积核
dts: 输出矩阵
anchor: 卷积核矩阵的锚点, 默认将卷积核矩阵的中心点作为锚点
iterations: 膨胀或腐蚀操作的迭代次数
borderType: 边界扩充的模式, 默认不扩充
borderValue: 当borderType=cv2.BORDER_CONSTANT时, 扩充边界的元素以borderValue填充

borderType

  1. BorderTypes.Default=>不填充

  1. BorderTypes.Constant=>填充边缘用指定的像素值(borderValue)

  1. BorderTypes.Replicate=>填充边缘像素用已知的边缘像素值

  1. 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.]]
'''

猜你喜欢

转载自blog.csdn.net/qq_38964360/article/details/129174483
今日推荐