张氏矢量化骨骼化细化算法

https://blog.csdn.net/weixin_40977054/article/details/96888371

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
''''''''''''''''''''''''''''
# @Time    : 2020/12/9 14:47
# @Author  : Arrow and Bullet
# @FileName: zhangvector.py
# @Description: <张氏骨骼化算法>
'''''''''''''''''''''''''''
import cv2
import time# 将char类型的01的图转为int的二位list
def intarray(binstring):'''Change a 2D matrix of 01 chars into a list of lists of ints'''return [[1 if ch == '1' else 0 for ch in line]for line in binstring.strip().split()]def toTxt(intmatrix):'''Change a 2d list of lists of 1/0 ints into lines of '#' and '.' chars'''return '\n'.join(''.join(('#' if p else '.') for p in row) for row in intmatrix)# 定义像素周围的8领域
#   P9 P2 P3
#   P8 P1 P4
#   P7 P6 P5
def neighbours(x, y, image):'''Return 8-neighbours of point p1 of picture, in order'''i = imagex1, y1, x_1, y_1 = x + 1, y - 1, x - 1, y + 1# print ((x,y))return [i[y1][x], i[y1][x1], i[y][x1], i[y_1][x1],  # P2,P3,P4,P5i[y_1][x], i[y_1][x_1], i[y][x_1], i[y1][x_1]]  # P6,P7,P8,P9# 计算领域中像素从0-1变化的次数
def transitions(neighbours):n = neighbours + neighbours[0:1]  # P2, ... P9, P2return sum((n1, n2) == (0, 1) for n1, n2 in zip(n, n[1:]))def zhangSuen(image):changing1 = changing2 = [(-1, -1)]num = 1while changing1 or changing2:print('num: ', num)num += 1# Step 1  循环所有前景像素点,符合条件的像素点标记为删除changing1 = []for y in range(1, len(image) - 1):for x in range(1, len(image[0]) - 1):P2, P3, P4, P5, P6, P7, P8, P9 = n = neighbours(x, y, image)if (image[y][x] == 1 and  # (Condition 0)P4 * P6 * P8 == 0 and  # Condition 4P2 * P4 * P6 == 0 and  # Condition 3transitions(n) == 1 and  # Condition 22 <= sum(n) <= 6):  # Condition 1changing1.append((x, y))# 步骤一结束后删除changing1中所有标记的点for x, y in changing1: image[y][x] = 0# Step 2 重复遍历图片,标记所有需要删除的点changing2 = []for y in range(1, len(image) - 1):for x in range(1, len(image[0]) - 1):P2, P3, P4, P5, P6, P7, P8, P9 = n = neighbours(x, y, image)if (image[y][x] == 1 and  # (Condition 0)P2 * P6 * P8 == 0 and  # Condition 4P2 * P4 * P8 == 0 and  # Condition 3transitions(n) == 1 and  # Condition 22 <= sum(n) <= 6):  # Condition 1changing2.append((x, y))# 步骤二结束后删除changing2中所有标记的点for x, y in changing2: image[y][x] = 0# 不断重复当changing1,changing2都为空的时候返回图像# print("c1: ", changing1)# print("c2", changing2)return imageif __name__ == '__main__':img = cv2.imread('mask_1024.png', 0)time_s = time.time()img_zhang = zhangSuen(img)time_e = time.time()print('time: ', time_e - time_s)cv2.imwrite('po_zhang_1024.png', img_zhang)


细化后:

张氏矢量化骨骼化细化算法相关推荐

  1. OTSU_图像二值化分割阈值的算法

    简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景 ...

  2. 线索二叉树中序非递归线索化以及递归线索化构建和遍历算法

    引文 大部分教材给出了 线索二叉树的中序递归线索化以及中序遍历,但是没给出非递归,现在网上大部分非递归算法代码各种条件判断写的比较离谱,所以干脆自己总结了一个清晰的.线索二叉树中序非递归线索化以及递归 ...

  3. otsu阈值分割算法原理_OTSU_图像二值化分割阈值的算法

    简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景 ...

  4. 图片怎么转为html5,将图片转化为矢量并canvas化的容易工具(基于Node.js + HTML5 canvas)...

    将图片转化为矢量并canvas化的简单工具(基于Node.js + HTML5 canvas) 一.前言 最近需要做一个图标的矢量化,但是没有数据,因此采用了node.js作为数据处理工具,canva ...

  5. zhang快速并行细化算法

    相关介绍  http://www.doc88.com/p-7724593025971.html 比较好的介绍  https://www.cnblogs.com/xianglan/archive/201 ...

  6. 改进的脱机手写体汉字细化算法

    摘要:基础数据来源于23名同学手写的100个汉字,共计2300个,然后对这组数据进行二值化,去噪,分割,归一化后所得数据. 作者:刘亚宁,2010年9月10日 在进行细化之前首先以说明为什么要将手写体 ...

  7. 图像处理之细化算法(Thinning Algorithm)C++实现

    最近在实验室里遇到了一个问题,就是在有一张轮廓二值图的情况下,如何才能将轮廓进行细化,得到轮廓的骨架. 效果如图: 可以看到,右边图中的数字变瘦了,这就是细化算法的作用 下面我们来讲一下,Thinin ...

  8. Rosenfeld细化算法 matlab(速度超慢)

    其中Rosenfeld细化算法为并行算法,可以将图像进行分割计算 clear clc close all tic; img = rgb2gray(imread('3.png')); bw = imbi ...

  9. 手指静脉细化算法过程原理解析 以及python实现细化算法

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/8672489.html 文中的一些图片以及思想很多都是参考https://www.cnblogs ...

最新文章

  1. 寄存器和常用的汇编指令
  2. LAMP 啟動 WWW 服務與測試 PHP 模組
  3. 如何设计一门语言(九)——类型
  4. Python语言学习之时间那些事:python和时间的使用方法之详细攻略
  5. Android CardView卡片布局 标签: 控件
  6. 【原】通过npm script运行webpack的原理
  7. python(十):模块相关、操作Redis、操作Excel
  8. 使用Excel公式,获取 当前 Excel 的Sheet页 的 名字
  9. ADO 访问数据库常见方法
  10. 1200多套微信小程序源码-史上最全的不同行业的源码集合
  11. 数据结构PTA期末复习题集
  12. DOS命令窗口基本操作
  13. H3C交换机堆叠配置
  14. seo与sem的区别
  15. 人工智能:智能优化算法
  16. html embed高度自适应,腾讯优酷视频分享iframe,embed高度多种比例控制
  17. matlab用DFT分析三频频谱,设计一DFT在信号频谱分析中的应用
  18. 微信小程序,物流助手对接(中通篇)待续
  19. React中文文档之introducing JSX
  20. 常用的CDN 链接 http://cdn.code.baidu.com/ http://www.bootcdn.cn/

热门文章

  1. VPN 虚拟专用网络隧道
  2. 2022 IDEA全家桶使用最新主题(免申请)
  3. 扫码反馈,“码”上回复:二维码在业主意见反馈中的应用
  4. linux自动wifi断开重连,49.Linux-wpa_cli使用之WIFI开启,扫描热点,连接热点,断开热点,WIFI关闭(49)...
  5. 案例1—MP3在线搜索下载程序
  6. 俞敏洪:35岁前如何实现自我增值?
  7. 双馈风机并网simulink模型
  8. Python一键更换证件照背景色
  9. html5 全景 源码,krpano 全景图 html5源码
  10. 5分钟成为车联网专家 | 全球首个C-V2X车联网城市级规模示范应用