膨胀:dilate为核B对核A做卷积时,核B覆盖区域的像素最大值提取
腐蚀:erode 为核B对核A做卷积时,核B覆盖区域的像素最小值提取
击中击不中变换:有两个不相交集合B={B1,B2},用B1去腐蚀X,然后用B2去腐蚀X的补集,得到的结果相减就是击中击不中变换。
腐蚀和膨胀公式:

击中击不中变换公式:

腐蚀和膨胀opencvsharp程序

      //定义原图路径Mat panda = new Mat("template2.jpg");//显示原图//Cv2.ImShow("原图",panda);PICPRO.DispImage(panda, pictureBox1);int size = 5;//定义卷积核 矩形,5*5的核 核的锚点Mat stu = Cv2.GetStructuringElement(MorphShapes.Rect,new OpenCvSharp.Size(size,size),new OpenCvSharp.Point(-1,-1));//定义一个膨胀输出mat类型Mat dil = new Mat();//膨胀 输入图 输出图 卷积核B 锚点位置,应用膨胀次数Cv2.Dilate(panda, dil, stu, new OpenCvSharp.Point(-1, -1), 1);//定义一个腐蚀输出mat类型Mat erode = new Mat();//输入图像 输出图像 卷积核 锚点位置 腐蚀次数Cv2.Erode(panda,erode,stu,new OpenCvSharp.Point(-1,-1),1);Cv2.ImShow("膨胀",dil);Cv2.ImShow("腐蚀", erode);Cv2.WaitKey();

0黑,255白
腐蚀erode : 是黑色的扩张,向0的扩张

原图

膨胀dilate : 是白色的扩张,向255的扩张

开运算: 先腐蚀在膨胀,可以剔除小白点
闭运算: 先膨胀在腐蚀,可以剔除小黑点

击中击不中变换实现代码:

     //自建图byte[] image = new byte[64]{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 input_image = new Mat(8, 8, MatType.CV_8UC1, image);Console.WriteLine("自建图" + Cv2.Format(input_image));input_image.SetArray<Byte>(image);//目标图定义Mat binary = new Mat();Mat binaryNot = new Mat();Mat binaryNot1 = new Mat();Mat binaryOut = new Mat();Mat HitMiss = new Mat();//原图Cv2.Threshold(input_image, binary, 0, 255, ThresholdTypes.Otsu);Mat stu = Cv2.GetStructuringElement(MorphShapes.Cross,new OpenCvSharp.Size(3, 3), new OpenCvSharp.Point(-1, -1));Console.WriteLine("STU" + Cv2.Format(stu));Cv2.MorphologyEx(binary, HitMiss, MorphTypes.HitMiss, stu);Cv2.Resize(HitMiss, HitMiss, new OpenCvSharp.Size(), 50, 50, InterpolationFlags.Nearest);Cv2.ImShow("直接用输出的结果", HitMiss);//原图的补集Cv2.BitwiseNot(binary, binaryNot);Cv2.Resize(binaryNot, binaryNot1, new OpenCvSharp.Size(), 50, 50, InterpolationFlags.Nearest);// Cv2.ImShow("原图", binary);Cv2.ImShow("原图补集", binaryNot1);//构建核Abyte[] kernelA = new byte[9] {0,1,0,1,1,1,0,1,0 };Mat StuA = new Mat(3, 3, MatType.CV_8UC1, kernelA);StuA.SetArray<byte>(kernelA);Console.WriteLine("核A"+ Cv2.Format(StuA));//构建核Bbyte[] kernelB = new byte[9] { 1, 0, 1, 0, 0, 0, 1, 0, 1 };Mat StuB = new Mat(3, 3, MatType.CV_8UC1);StuB.SetArray<byte>(kernelB);Console.WriteLine("核B"+ Cv2.Format(StuB));//用核A去腐蚀原图Cv2.MorphologyEx(binary, binary, MorphTypes.Erode, StuA);Console.WriteLine("核A去腐蚀原图" + Cv2.Format(binary));//用核B去腐蚀原图补集Cv2.MorphologyEx(binaryNot, binaryNot, MorphTypes.Erode, StuB);Console.WriteLine("核B去腐蚀原图补集" + Cv2.Format(binaryNot));//交集Cv2.Subtract(binary, binaryNot, binaryOut);Cv2.Resize(binaryOut, binaryOut, new OpenCvSharp.Size(), 50, 50, InterpolationFlags.Nearest);Cv2.ImShow("结果", binaryOut);Cv2.MoveWindow("结果", 0, 0);int rate = 50;StuB = (StuB ) * 255;StuA = (StuA ) * 255;Cv2.Resize(StuA, StuA, new OpenCvSharp.Size(), rate, rate, InterpolationFlags.Nearest);Cv2.ImShow("StuA", StuA);Cv2.MoveWindow("StuA", 0, 0);Cv2.Resize(StuB, StuB, new OpenCvSharp.Size(), rate, rate, InterpolationFlags.Nearest);Cv2.ImShow("StuB", StuB);Cv2.MoveWindow("StuB", 0, 0);Cv2.Resize(input_image, input_image, new OpenCvSharp. Size(), rate, rate, InterpolationFlags.Nearest);Cv2.ImShow("原图", input_image);Cv2.MoveWindow("原图", 0, 0);

自建图:

//自建核

//用接口和代码分别实现的结果

//数据的计算

opencvsharp图像处理_腐蚀与膨胀,击中击不中变换(3)相关推荐

  1. MATLAB--数字图像处理 击中击不中变换

    击中击不中变换 原理 击中击不中变换(HMT)需要两个结构元素B1和B2,合成一个结构元素对B=(B1,B2) 一个用于探测图像内部,作为击中部分;另一个用于探测图像外部,作为击不中部分.显然,B1和 ...

  2. 数字图像处理 击中击不中变换

    参考链接 目的: 击中击不中变换就是在A图像上找到和B图像一致的那块区域,举个例子就是:你拿着一张A图片的一部分,你需要在A图像上找到这张图片在A图片上的位置在哪(注意,这里找到的位置,都是一个点,也 ...

  3. 【youcans 的 OpenCV 例程 200 篇】120. 击中-击不中变换

    欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 [youcans 的 OpenCV 例程 2 ...

  4. 详解图像形态学中的击中击不中变换操作(HMT),并提醒大家OpenCV4中的击中击不中变换操作是有问题的

    大家看这篇博文前可以先看一看下面这篇博文,下面这篇博文是这篇博文的基础: 详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐 ...

  5. 区域填充与击中击不中变换

    1,区域填充 %区域填充 clear,clc,close all; BW1 = logical([1 0 0 0 0 0 0 0; 1 1 1 1 1 0 0 0;1 0 0 0 0 0 1 0; 1 ...

  6. 形态学 - 击中-击不中变换

    目录 1. HMT 介绍 2. 代码实现 1. HMT 介绍 HMT全称是Hit miss transformation --- 击中 击不中变换,这里我们只对二值图像做处理 二值图像是图像的灰度值只 ...

  7. 击中击不中变换的作用理解

    学习形态学变换的时候,看到击中击不中变换一直百思不得其解,虽然他的定义写的很清楚明白,但是不知道具体是干嘛用的,按照自己的理解写了一个matlab小程序来试试. 1.击中击不中变换是形态学形状检测的基 ...

  8. 二值形态学之击中击不中变换

    定义 应用 物体识别 细化 击中击不中变换(Hit Miss Transform ,HMT),是通过同时探测图像的内部和外部,进而获取更多的内外标记,体现更多信息的一个方法.他的应用有很多,特别是在图 ...

  9. OpenCV实现击中击不中变换和形态学细化

    1 击中击不中变换 1.1 HMT概述 形态学Hit-or-Miss是形状检测基本工具,只要结构元设置得当,就可以检测一些基本的形状图案,HMT变换只能作用于二值图像,结构元(核)元素值由0.1.-1 ...

最新文章

  1. gson解析mysql城市json数据_Gson解析复杂的json数据
  2. WinDbg+SOS:Web服务器High CPU Hang(100%)实例分析
  3. java 学生信息的增删改查_学生信息的增删改查(java)
  4. php订单模块解耦,PHP快速使用RabbitMQ实现项目中部分业务的解耦
  5. Swift--基本数据类型(二)
  6. mysql索引有字符集_07. 类型、字符集、引擎和索引
  7. golang mysql加锁_使用golang实现类InnoDB数据行锁效果
  8. php获取每月的星期天,php计算一月中有多少个周末
  9. Google 发布其非 Linux 系操作系统 Fuchsia 说明书!
  10. 前端 JavaScript 复制粘贴的奥义——Clipboard 对象概述
  11. tortoisegit 代码的回滚方式 --两种
  12. QSetting::Scope
  13. Conda 的 yml 文件 Conda/PIP 国内镜像源的添加
  14. 用excel将有规律的数据随机打乱
  15. 知识图谱(Knowledge Graph)
  16. cad多段线画圆弧方向_cad弧形多线(cad多段线怎么画弧线)
  17. CodeReview中常见缩写
  18. 华为防火墙配置流量根据链路权重负载分担
  19. 统计学常识笔记整理(二)
  20. kubernete编排技术五:DaemonSet

热门文章

  1. 【逆向工程】在PE结构空白区段插入代码
  2. Typora中如何使用数学公式、数学符号
  3. vue子组件修改props传进来的值、回调函数
  4. 清华软院、清华计科、南大计算机、中科院自动化所夏令营保研过程贴
  5. cr全称是什么意思,城域网中的AC、BRAS、SW、SR、CR是什么意思
  6. Coredump:core与kernel的区别,以及coredump具体指什么?
  7. mysql 数据库第二次安装不了_mysql数据库二次安装无法启动
  8. OpenCV学习第十三篇:提取水平和垂直线(去除干扰线)
  9. Linux力挺微博世
  10. 题目7飞机票订票系统