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.]]
'''
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
膨胀腐蚀是图像处理中常用的形态学操作,可以用来改变图像的形状和结构。在OpenCV中,可以使用cv2.dilate()函数进行膨胀操作,使用cv2.erode()函数进行腐蚀操作。 膨胀操作可以使图像中的白色区域扩张,黑色区域缩小。它通过将图像中的每个像素点与结构元素进行比较,并将结构元素中的最大值赋给对应的像素点。 下面是一个示例代码,演示了如何使用OpenCV进行膨胀操作: ```python import cv2 import numpy as np # 读取图像 image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE) # 定义结构元素 kernel = np.ones((5, 5), np.uint8) # 膨胀操作 dilated = cv2.dilate(image, kernel, iterations=1) # 显示结果 cv2.imshow('Dilated Image', dilated) cv2.waitKey(0) cv2.destroyAllWindows() ``` 腐蚀操作与膨胀操作相反,它可以使图像中的白色区域缩小,黑色区域扩张。它通过将图像中的每个像素点与结构元素进行比较,并将结构元素中的最小值赋给对应的像素点。 下面是一个示例代码,演示了如何使用OpenCV进行腐蚀操作: ```python import cv2 import numpy as np # 读取图像 image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE) # 定义结构元素 kernel = np.ones((5, 5), np.uint8) # 腐蚀操作 eroded = cv2.erode(image, kernel, iterations=1) # 显示结果 cv2.imshow('Eroded Image', eroded) cv2.waitKey(0) cv2.destroyAllWindows() ``` 上述示例代码中,结构元素的大小可以根据需求进行调整,iterations参数表示对图像进行膨胀腐蚀的次数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chen_znn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值