上理论:

Hilditch 细化算法的步骤为:

对图像从左向右从上向下迭代每个像素,是为一个迭代周期。在每个迭代周期中,对于每一个像素p,如果它同时满足6个条件,则标记它。在当前迭代周期结束时,则把所有标记的像素的值设为背景值。如果某次迭代周期中不存在标记点(即满足6个条件的像素),则算法结束。假设背景值为0,前景值为1,则:

6个条件为:

(I):p 为1,即p不是背景;

(2):x1,x3,x5,x7不全部为1(否则把p标记删除,图像空心了);

(3):x1~x8 中,至少有2个为1(若只有1个为1,则是线段的端点。若没有为1的,则为孤立点);

(4):p的8连通联结数为1;

联结数指在像素p的3*3邻域中,和p连接的图形分量的个数:

(5)假设x3已经标记删除,那么当x3为0时,p的8联通联结数为1;

(6)假设x5已经标记删除,那么当x5为0时,p的8联通联结数为1。

以上的理论选择网络博客:http://www.cnblogs.com/xiaotie/archive/2010/08/12/1797760.html(此博客上有C#版本的Hilditch细化算法,但是使用unsafe的代码不是太好理解的。

我上一个自己写的代码

/// <summary>/// Hilditch细化算法/// </summary>/// <param name="input"></param>/// <returns></returns>private int[,] ThinnerHilditch(int[,] input){int lWidth = input.GetLength(0);int lHeight = input.GetLength(1);bool IsModified = true;int Counter = 1;int[] nnb = new int[9];//去掉边框像素for (int i = 0; i < lWidth; i++){input[i, 0] = 0;input[i, lHeight - 1] = 0;}for (int j = 0; j < lHeight; j++){input[0, j] = 0;input[lWidth - 1, j] = 0;}do{Counter++;IsModified = false;int[,] nb = new int[3, 3];for (int i = 1; i < lWidth; i++){for (int j = 1; j < lHeight; j++){//条件1必须为黑点if (input[i, j] != 1){continue;}//取3*3领域for (int m = 0; m < 3; m++){for (int n = 0; n < 3; n++){nb[m, n] = input[i - 1 + m, j - 1 + n];}}//复制nnb[0] = nb[2, 1]==1?0:1;nnb[1] = nb[2, 0]==1?0:1;nnb[2] = nb[1, 0]==1?0:1;nnb[3] = nb[0, 0]==1?0:1;nnb[4] = nb[0, 1]==1?0:1;nnb[5] = nb[0, 2]==1?0:1;nnb[6] = nb[1, 2]==1?0:1;nnb[7] = nb[2, 2]==1?0:1;// 条件2:p0,p2,p4,p6 不皆为前景点 if (nnb[0] == 0 && nnb[2] == 0 && nnb[4] == 0 && nnb[6] == 0){continue;}// 条件3: p0~p7至少两个是前景点 int iCount = 0;for (int ii = 0; ii < 8; ii++){iCount += nnb[ii];}if (iCount > 6) continue; // 条件4:联结数等于1 if (DetectConnectivity(nnb) != 1){continue;}// 条件5: 假设p2已标记删除,则令p2为背景,不改变p的联结数 if (input[i, j - 1] == -1){nnb[2] = 1;if (DetectConnectivity(nnb) != 1)continue;nnb[2] = 0;}// 条件6: 假设p4已标记删除,则令p4为背景,不改变p的联结数 if (input[i, j + 1] == -1){nnb[6] = 1;if (DetectConnectivity(nnb) != 1)continue;nnb[6] = 0;}input[i, j] = -1;IsModified = true;}}for (int i = 0; i < lWidth; i++){for (int j = 0; j < lHeight; j++){if (input[i, j] == -1){input[i, j] = 0;}}}} while (IsModified);return input;}

希望对大家有用。

C#图像细化:Hilditch细化算法相关推荐

  1. 图像滤镜艺术---图像滤镜晕影调节算法研究

    原文:图像滤镜艺术---图像滤镜晕影调节算法研究 本文对滤镜中常见的晕影,晕角效果的实现做了研究,具体如下: 1 晕影调整算法 所谓晕影就是给图像四个角添加暗影效果,这暗影向图像中心逐渐淡化.我们使用 ...

  2. YUV图像实时去雾算法的优化与改进

    YUV图像实时去雾算法的优化与改进 2016-03-02 21:04 摘要:针对已有的基于DSP的实时去雾算法出现的问题进行优化和改进.在降采样倍数过大时,去雾效果会出现一些副作用,包括纹理细节丢失. ...

  3. 调整图像- 自动对比度、自动色阶算法

    调整图像- 自动对比度.自动色阶算法 我们以24位彩色图像为例说明这两个算法. 在执行两个算法之前,我们需要确定两个参数,大家在用PS时选择自动色阶并不会弹出什么参数设置对话框,那是因为PS把这个隐藏 ...

  4. 一种改进的高光谱图像CEM目标检测算法

    一种改进的高光谱图像CEM目标检测算法 人工智能技术与咨询 来源:< 应用物理> ,作者付铜铜等 关键词: 高光谱图像:光谱重排:CEM算法:目标检测: 摘要: 约束能量最小化(Const ...

  5. 去雾综述_图像去雾的算法历史与综述

    图像去雾的算法历史与综述 1. 前言 其实之前对图像去雾也没有什么深入的理解,只是了解,实现过一些传统的图像去雾方法而已.个人感觉,在CNN模型大流行的今天,已经有很多人忽略了传统算法的发展,以至于你 ...

  6. AI学习笔记(七)图像滤波器、OpenCV算法解析

    AI学习笔记之图像滤波器.OpenCV算法解析 图像滤波器 图像噪声 噪声的产生 信噪比 高斯噪声 椒盐噪声 其他噪声 图像滤波 滤波的目的 滤波的要求 各种滤波器 均值滤波 中值滤波 最大最小值滤波 ...

  7. <医学断层图像三维重建面绘制算法的研究>——第一遍阅读

    医学断层图像三维重建面绘制算法的研究 参考文献:段正华. 医学断层图像三维重建面绘制算法的研究[D].哈尔滨理工大学,2020. 基于边增长的三维重建面绘制算法.在整个算法三维重建的插值上,提出了一种 ...

  8. 图像保边滤波算法集锦系列

    在美颜算法的实现中,如何既能把人脸皮肤磨得光滑,雀斑磨得干净,又能保留五官的自然清晰,这就需要一种能保留边缘信息的平滑滤波器,这种滤波器的好坏在一定程度上,也就影响了美颜磨皮效果的好坏,对此,本人将在 ...

  9. 目标检测论文解读复现之十五:基于YOLOv5的光学遥感图像舰船 目标检测算法

    前言 此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文,帮 ...

最新文章

  1. 关于使用python logging模块的几点总结
  2. pandas drop 删除行和列的方法
  3. Http client 请求
  4. 归纳DOM事件中各种阻止方法
  5. 400页《TensorFlow 2.0 深度学习算法实战》中文版教材免费下载(附随书代码+pdf)...
  6. oracle中使用sys_connect_by_path进行表中行值连接
  7. EasyUI 扩展自定义EasyUI校验规则 验证规则(常用的)
  8. sql语句Order by 报错列名不明确
  9. C++学习之路 | PTA乙级—— 1046 划拳 (15 分)(精简)
  10. 【Machine Learning 六】梯度下降法(基于Matlab 求函数最小值)
  11. MATLAB绘制椭圆
  12. Pycharm 主题设置和修改
  13. 2018上半年掘金微信群日报优质文章合集:前端篇
  14. Java 应用SAXReader 解析网络地址 XML
  15. php微信问卷调查,We_Questionnaire: !!停止维护!!基于Thinkphp3.2.3 + jqueryMobile1.4.4的微信公众号应用 -- 移动端问卷调查...
  16. 云计算与虚拟化的关系是什么?
  17. 如何在win10下安装Docker
  18. 剑指 Offer 24. 反转链表java
  19. CISCO ISIS
  20. 使用CDN后网页无法访问怎么解决

热门文章

  1. 网页改成html后缀,自定义网页后缀名-网页后缀名HTML、HTM、SHTml、STHM的区别
  2. android小球移动代码,Android中如何绘制一个跟随手指移动的小球
  3. 从高排到低变成小楼梯儿歌_幼儿数学儿歌,转发收藏!
  4. lua 去除小数点有效数字后面的0_【物联网学习番外篇】Lua脚本编程扫盲
  5. 每年都有人问“IT行业还能再火几年”,现实给出最好的答案
  6. 还原oracle控制文件位置,oracle 11.2 控制文件还原
  7. oracle 导出写入文件失败怎么办,编辑dmp文件解决导入导出问题(oracle 922错误 ,缺少或无效选项)...
  8. 小程序 背景图 repeat_简单可爱的微信聊天背景图片
  9. Mac/IOS Xcode Instruments资源统计及自动化相关
  10. selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element