【OpenCV C++20 学习笔记】击中击不中(Hit-or-Miss)

击中击不中 Hit-or-Miss

原理

形态学操作对图片的处理是基于图片的形状的。形态学操作将一个或多个结构元素(structuring elements),即卷积核,应用到图片上从而获得计算结果。最基本的两个形态学操作就是腐蚀(erosion)和膨胀(dilation)。这两种操作的各种结合形成了更多的形态学操作:开运算(opening)、闭运算(closing),以及顶帽(top-hat)和黑帽(black-hat)运算。

这些形态学操作的介绍可以参照本合集的另外一篇文章:形态学变换(morphologyEx)

击中击不中变换(Hit-or-Miss transformation)对于在二进制图片中寻找特定模式非常有效。特别是,对于结构元素 B 1 B_1 B1和 B 2 B_2 B2,图片中的某些像素区域能匹配 B 1 B_1 B1,但不匹配 B 2 B_2 B2,这种情况下,击中击不中变换能很好地发挥作用。用数学表达式来表达就是:
A ⊛ B = ( A ⊖ B 1 ) ∩ ( A c ⊖ B 2 ) A ⊛ B = (A \ominus B_1) \cap (A^c \ominus B_2) A⊛B=(A⊖B1)∩(Ac⊖B2)

因此,击中击不中变换共包括以下3个步骤

  1. 用结构元素 B 1 B_1 B1对图片 A A A进行腐蚀操作
  2. 用结构元素 B 2 B_2 B2对图片 A A A的补集 A c A^c Ac进行腐蚀操作
  3. 去步骤1和步骤2结果的交集

在实际操作中不用这么复杂,可以将结构元素 B 1 B_1 B1和 B 2 B_2 B2合并成单个的结构元素 B B B。如下例:

即 B 1 − B 2 = B B_1-B_2=B B1−B2=B。合并出来的 B B B结构元素中间为-1,上下左右都是1,其余部分为0。说明这个结构元素匹配的模式是中间暗且上下左右都亮的像素区域。

将合并后的结构元素应用到下面这个矩阵:

则可以得到下面这个矩阵:

可以看到只有第7行、第3列的像素被成功定位了。因为在原始矩阵中,只有这个位置是暗的,且它的上下左右都是亮的。

代码实现

在OpenCV中实现击中击不中变换非常简单,只需要使用morphologyEx()函数的MORPH_HITMISS模式就行。例如可以用以下代码实现上图中的例子:

cpp 复制代码
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>

using namespace cv;

int main() {
    Mat input_image{ (Mat_<uchar>(8, 8) <<
        0, 0, 0, 0, 0, 0, 0, 0,
        0, 255, 255, 255, 0, 0, 0, 255,
        0, 255, 255, 255, 0, 0, 0, 0,
        0, 255, 255, 255, 0, 255, 0, 0,
        0, 0, 255, 0, 0, 0, 0, 0,
        0, 0, 255, 0, 0, 255, 255, 0,
        0, 255, 0, 255, 0, 0, 255, 0,
        0, 255, 255, 255, 0, 0, 0, 0) };

    Mat kernel{ (Mat_<int>(3, 3) <<
        0, 1, 0,
        1, -1, 1,
        0, 1, 0) };

    Mat output_image;
    morphologyEx(input_image,	//原图
        output_image,			//输出图
        MORPH_HITMISS,			//形态学变换模式
        kernel);				//卷积核,即结构元素B
    
    //由于图片大小,用窗口显示根本看不出来
    imshow("原图", input_image);		//可以在此处设置断点,然后用image watch来查看	
    moveWindow("原图", 0, 200);

    waitKey(0);
    return 0;
}

在Image Watch中显示的运行结果:

  1. 原图矩阵
  2. 结构元素
  3. 输出图片矩阵

    可以看到运行结果与上面图中所描述的一致。
相关推荐
兵慌码乱6 天前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
通信小呆呆10 天前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
H__Rick10 天前
自动对焦学习-3
人工智能·学习·计算机视觉
Daisy Lee10 天前
量化学习-第1章-什么是量化金融
学习·金融·datawhale
Alsn8610 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
YM52e10 天前
买菜计算器小应用 - HarmonyOS ArkUI 开发实战-PC版本
学习·华为·harmonyos·鸿蒙·鸿蒙系统
小雨下雨的雨10 天前
HarmonyOS ArkUI训练营入门-组件掌握系列-Animation 动画效果实现-PC版本
学习·华为·harmonyos·鸿蒙
梦想三三10 天前
OpenCV银行卡数字识别项目(图像预处理与字符分割)
人工智能·opencv·计算机视觉
cqbzcsq10 天前
CellFlow虚拟细胞论文阅读
论文阅读·人工智能·笔记·学习·生物信息
YangYang9YangYan10 天前
2026初入职场学习数据分析的价值
学习·数据挖掘·数据分析