图像细化_八连通法

图像细化

图像细化的方法

八连通-查表法

zhang的快速并行细化算法

八连通-查表法的改进

附上参考链接:https://www.cnblogs.com/xianglan/archive/2011/01/01/1923779.html

这个链接的博主写的很清楚

图像细化

图像的细化主要是针对二值图而言

所谓骨架,可以理解为图像的中轴,长方形的骨架,是它的长方向上的中轴线,圆的骨架是它的圆心,直线的骨架是它自身,孤立点的骨架也是自身。

图像细化的方法

八连通-查表法

判断一个点是否能去掉是以8个相邻点(八连通)的情况来作为判据的,具体判据为:

1,内部点不能删除

2,鼓励点不能删除

3,直线端点不能删除

4,如果P是边界点,去掉P后,如果连通分量不增加,则P可删除

看看上面那些点。

第一个点不能去除,因为它是内部点

第二个点不能去除,它也是内部点

第三个点不能去除,删除后会使原来相连的部分断开

第四个点可以去除,这个点不是骨架

第五个点不可以去除,它是直线的端点

第六个点不可以去除,它是直线的端点

对于所有的这样的点,我们可以做出一张表,来判断这样的点能不能删除

对于黑色的像素点,它周围的8个点,我们赋予不同的价值。若周围某黑色,我们认为其价值为0,为白色则取九宫格中对应的价值。

对于前面那幅图中第一个点,也就是内部点,它周围的点都是黑色,所以他的总价值是0,对应于索引表的第一项。

前面那幅图中第二点,它周围有三个白色点,它的总价值为1+4+32=37,对应于索引表中第三十八项

我们用这种方法,把所有点的情况映射到0~255的索引表中。

我们扫描原图,对于黑色的像素点,根据周围八点的情况计算它的价值,然后查看索引表中对应项来决定是否要保留这一点。

附上代码

import cv2

# 输入需要细化的图片(经过二值化处理的图片)和映射矩阵array

def Thin(image, array):

h, w = image.shape

# height 图像的高度 weight 图像的宽度

iThin = image

for i in range(h):

for j in range(w):

if image[i, j] == 0: # 如果图像的这个点是黑色的点

a = [1] * 9 # 先默认周围八个点都是白色的

for k in range(3): # range(3):0 1 2

for l in range(3):

# 如果3*3矩阵的点不在边界

# 且是黑色的点

# 这一段的难点是用k,l来精确的表示3*3的矩阵

if -1 < (i - 1 + k) < h and -1 < (j - 1 + l) < w and iThin[i - 1 + k, j - 1 + l] == 0:

a[k + 3 * l] = 0

# sum没有a[4],a[4]刚好就是中心的黑点,不需要加进去计算

sum = a[0] * 1 + a[1] * 2 + a[2] * 4 + a[3] * 8 + a[5] * 16 + a[6] * 32 + a[7] * 64 + a[8] * 128

# 然后根据array表,对iThin的那一点进行赋值。

# 将所有点的总价值映射到[0,255]的表中,返回的结果保存到iThin中

iThin[i, j] = array[sum] * 255

return iThin

# 最简单的二值化函数,阈值根据图片的昏暗程度自己设定,即180这个数字是可以修改的

def Two(image):

w, h = image.shape

# size = (w, h)

iTwo = image

for i in range(w):

for j in range(h):

if image[i, j] < 180:

iTwo[i, j] = 0

else:

iTwo[i, j] = 255

return iTwo

# 映射表

array = [0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, \

1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, \

0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, \

1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, \

1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \

1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, \

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \

0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, \

1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, \

0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, \

1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, \

1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \

1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, \

1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, \

1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0]

# 读取图片,并显示

img = cv2.imread('testimg/c.png', 0)

cv2.namedWindow("image", cv2.WINDOW_NORMAL) # 解决图片太大,显示不全

cv2.imshow('image', img)

cv2.waitKey(0)

# 获取简单二值化的细化图,并显示

iTwo = Two(img)

iThin_2 = Thin(iTwo, array)

cv2.namedWindow("iTwo_2", cv2.WINDOW_NORMAL) # 解决图片太大,显示不全

cv2.imshow('iTwo_2', iThin_2)

cv2.waitKey(0)

cv2.destroyAllWindows()

zhang的快速并行细化算法

A Fast Parallel Algorithm for Thinning Digital Patterns

八连通-查表法的改进

问题:从上到下,从左到右扫描的时候,遇到第一个点,查表可以删除,遇到第二个点,查表也可以删除,整个第一行都可以删除。扫描第二行时,和第一行一样,也被整个删除了。这样一直到最后一行。

解决办法:在每行水平扫描的过程中,先判断每一点的左右邻居,如果都是黑点,则该点不做处理。另外,如果某个黑店被删除了,则跳过它的右邻居,处理下一点。对矩形这样做完一遍,水平方向会减少两像素。垂直方向扫描方法同理,判断上下邻居。

这样做一次水平扫描和垂直扫描,原图会“瘦”一圈,多次重复上面的步骤,知道图形不在变化为止。

代价:这一改进让算法的复杂度的运行时间增大一个数量级

(代码见第一个链接博主写的代码)

https://www.cnblogs.com/xianglan/archive/2011/01/01/1923779.html

细化后的图像还存在毛刺,还需要对图像细化算法做进一步的优化。

python图像线条提取_python3 图像细化(提取骨架线)相关推荐

  1. 【Python图像线条坐标提取】

    问题描述: 在进行图像处理时,有时需要对图像上的坐标点进行提取,然后进行曲线拟合,如下图,但是提取的xy坐标会有许多重复的值,影响曲线拟合效果.这里提供三种方法,其它的方法大家可以自行补充. warn ...

  2. python opencv二值化图像_python opencv,读取彩色图像,提取三通道,图像二值化,提取图像的边缘...

    python opencv,读取彩色图像,提取三通道,图像二值化,提取图像的边缘 python opencv 1,读取图像 2,图像变矩阵 3,图像转灰度图像 4,彩色图像是3D数组 5,灰度图像是2 ...

  3. 利用Python提取函数图像数据并拟合曲线

    目录 1. 前言 2. 数据提取 2.1 图像预处理 2.2 提取数据 3. 曲线拟合 4. 优化代码 1. 前言 学校导师要求拟合曲线,但只有函数图像没有数据,图像和公式都不懂就负责把系数算出来. ...

  4. python图片保存为txt文件_python + opencv实现提取png图像的像素信息并存储到txt文件中(附安装指导)...

    相关库安装指导: 这里我们需要 opencv_python,numpy,matplotlib库,另外我用的是python3.6.1版本. 一般库大家都是用pip install命令安装的,不过不知道为 ...

  5. 《OpenCv视觉之眼》Python图像处理十二 :Opencv图像轮廓提取之基于一阶导数的Roberts算法、Prewitt算法及Sobel算法

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  6. (代码已更新)QT 环境下 用opencv 进行骨架细化(骨架提取)得到图像中心线

    之前的任务是把如下的一个直钢管图像进行处理,提取出中心线,用到了骨架细化算法以及一些常用的opencv处理.思路就是: 预处理通过灰度得到二值图像--二值图形态学处理--骨架细化提取中心线--霍夫概率 ...

  7. python实现cnn特征提取_使用PyTorch提取CNNs图像特征

    目录 简要介绍PyTorch.张量和NumPy 为什么选择卷积神经网络(CNNs)? 识别服装问题 使用PyTorch实现CNNs 1.简要介绍PyTorch.张量和NumPy 让我们快速回顾一下第一 ...

  8. python读取idx_通过Python从.idx3-ubyte文件或GZIP中提取图像 - python

    我已经使用OpenCV中的facerecognizer创建了一个简单的人脸识别功能.它可以很好地处理人的图像. 现在,我想通过使用手写字符而不是人来进行测试.我遇到了MNIST数据集,但它们将图像存储 ...

  9. 《OpenCv视觉之眼》Python图像处理十四 :Opencv图像轮廓提取之Scharr算法和Canny算法

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

最新文章

  1. android界面去掉标题栏和状态栏
  2. 2015 百度之星 1003 棋盘占领 dfs
  3. stm32IAP代码升级小结
  4. linux 线程pthread_detach,linux线程之pthread_join和pthread_detach
  5. 公共方法-利用for else搜索字典列表-for else
  6. 【解析】1013 Battle Over Cities (25 分)_31行代码AC
  7. C++ Prime:范围for语句
  8. ASCII码表及说明
  9. tomcat域名绑定设置
  10. Struts2的简单介绍
  11. 20180918-1 词频统计
  12. wd my book essential 不显示盘符_江西大规格WD无伸缩短式万向联轴器供应
  13. MySQL 数据库架构
  14. Insert Delete GetRandom O(1)
  15. 解决windows7系统netmeeting无法(安装)使用问题
  16. java 上传图片 并压缩图片大小
  17. 一元线性拟合的matlab,基于MATLAB的一元线性回归分析
  18. poj 4105 拯救公主(bfs+二进制状态压缩)
  19. CyanogenMod源码编译
  20. 计算机语言排行榜2015,2015年3月编程语言排行榜:F#排名达到11

热门文章

  1. php 显示html文件后缀,[求助]此jQuery在html后缀文件可用,在php后缀文件就用不了!...
  2. 同频切换的事件_LTE前台路测切换问题处理大礼包
  3. data的值 如何初始化vue_理解Vue响应式系统
  4. 单独组件_iOS组件化/模块化的方案总结
  5. 基于JAVA+SpringMVC+MYSQL的图书管理系统
  6. linux进程理解,进程资源 - 进程基础 - [ 理解Linux进程 ] - 手册网
  7. VIPKID:笔试题(数组中和为0的一对数的数量,十进制转二进制中1的个数)
  8. 洛谷P1098 字符串的展开【字符串】【模拟】
  9. 解决 iframe 后退不是主页面后退(浏览器 history)问题
  10. oracle监听的动态注册和静态注册