72.击中击不中变换

   目录

        1 概念讲解及用处

        2 API函数详解

        3 用C++编写代码进行实现

        1 概念讲解及用处

        图像的击中/击不中变换(Hit/Miss Transform)是一种基于数学形态学的图像处理技术,用于检测和分割图像中特定形状或模式的区域。它被广泛应用于目标识别、图像分析、图像编码等领域。

        击中/击不中变换通过定义结构元素(也称为模板)来实现对图像的匹配操作。结构元素是一个小且固定的矩阵,其中包含了我们希望匹配的特定形状或模式。图像中的像素排列形状如果与结构元素的结构形状一致,就表示该像素被击中,则要保留下来,没有被击中的则去除。该结构中的元素值可以是1(表示匹配的像素)或0(表示不匹配的像素)。

        在进行击中/击不中变换时,我们需要同时考虑结构元素的两个版本:击中版本和击不中版本。击中版本定义了所有像素都必须与结构元素相匹配的条件,而击不中版本则定义了所有像素都不能与结构元素相匹配的条件。

        具体实施击中/击不中变换的步骤如下:

  1. 将待处理的输入图像和击中版本的结构元素进行卷积运算。
  2. 将待处理的输入图像和击不中版本的结构元素进行卷积运算,并将结果取反(即使原本匹配的像素变为不匹配,不匹配的像素变为匹配)。
  3. 对两次卷积得到的结果进行逻辑与(AND)运算。

        最终,击中/击不中变换的结果将生成一个二值图像,其中像素值为1的区域表示匹配成功的目标区域,而像素值为0的区域则代表未匹配成功的区域。

        通过定义不同形状和尺寸的结构元素,可以实现对不同形状或模式的目标进行检测和分割。这种技术在图像处理领域具有广泛的应用,例如在数字图像中检测边缘、孔洞、角点等特定的几何结构,或者应用于字符识别、指纹识别等任务中。

        需要注意的是,击中/击不中变换是一种基于形态学的图像处理方法,它在处理图像时主要关注形状和结构,并不考虑像素的灰度值信息。因此,在应用该方法之前,可能需要进行预处理操作,如灰度化、二值化等,以便提取出感兴趣的形状或模式。

        2 API函数详解

        在OpenCV中,可以通过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());

src: 输入的源图像。
dst: 输出的目标图像,用于存储开运算结果。
op: 形态学操作类型,使用MORPH_OPEN表示开运算操作。
kernel: 结构元素,用于指定形态学操作的邻域大小和形状。
anchor: 结构元素的锚点,默认为(-1,-1)表示位于结构元素的中心。
iterations: 操作的迭代次数,默认为1。
borderType: 图像边界的处理方式,默认为BORDER_CONSTANT表示用常数填充边界。
borderValue: 边界填充的颜色,默认为默认值。

        3 用C++编写代码进行实现

        下面是使用OpenCV库在C++中实现图像击中击不中操作的示例代码:

#include <opencv2/opencv.hpp>

using namespace cv;

int main()
{
    Mat srcImage = imread("input.jpg", IMREAD_GRAYSCALE);
    if (srcImage.empty())
    {
        printf("Failed to load image\n");
        return -1;
    }

    Mat dstImage;
    Mat kernel1 = (Mat_<char>(3, 3) << 0, -1, 0,
                                       0, 1, 0,
                                       0, 0, 0); // 定义结构元素1
    Mat kernel2 = (Mat_<char>(3, 3) << 0, 0, 0,
                                       0, -1, 0,
                                       0, 1, 0); // 定义结构元素2

    morphologyEx(srcImage, dstImage, MORPH_HITMISS, kernel1, Point(-1, -1), 1, BORDER_CONSTANT, Scalar(0));
    morphologyEx(dstImage, dstImage, MORPH_HITMISS, kernel2, Point(-1, -1), 1, BORDER_CONSTANT, Scalar(0));

    imshow("Source Image", srcImage);
    imshow("Hit-or-Miss Transform Result", dstImage);
    waitKey(0);

    return 0;
}

        在代码中,首先加载输入图像srcImage。然后,定义了两个3x3的结构元素kernel1和kernel2,分别代表目标的前景和背景。接下来,使用morphologyEx()函数进行击中击不中变换,并将结果保存在dstImage中。最后,显示原始图像和击中击不中变换结果图像,并等待按键退出程序。

由下图可知,我们经过两次的击中击不中变换,将图像中的竖直图像去除。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

别叭叭儿—好好学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值