首先根据这篇博文https://www.cnblogs.com/xianglan/archive/2011/01/01/1923779.html,自己重新编写python代码,由于出现局部错误,导致出现了一些奇妙结果,因此写就过程如下:

结果一:

# -*- coding: utf-8 -*-

"""

Created on Mon Jun 10 14:35:27 2019

@author: 高行吟

"""

import numpy as np

def Get_skeleton_line(img):

table = [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]

r , c = img.shape

line_img = np.zeros((r , c))

new_img = np.zeros((r + 2 , c + 2))##由于本程序以窗口遍历,因此原矩阵四个方向均增加一个全零边,方便计算

new_img[1:-1 , 1:-1] = img

new_img = np.where(new_img == 1 , 0 , 1)###由于目标区域值为1,而查表法规定,一旦像素为目标,则其权重为0,因此将矩阵所有值全部反向,即是0→1,1→0,方便与权重模板temp做乘法计算

temp = np.array([[1 , 2 , 4] , [8 , 0 , 16] , [32 , 64 , 128]])###权重矩阵

for i in range(1 , r+1):

for j in range(1 , c+1):

line_img[i-1 , j-1] = table[(new_img[i-1:i+2 , j-1:j+2]*temp).sum()]###窗口矩阵与模板相乘,其和即为表索引

return line_img

上述代码处理一副图前后如下:

   

原图                                                                   二值图                                                  处理后

可以看到,本来使用查表法是提取骨骼线的,结果却得到了边界线,结果似乎还很好?也可能本人孤陋寡闻,大方勿笑,反正感觉很奇妙,因此记录下来,以便以后提取边界线时查看。

按照本人理解,应该是倒数第二行代码问题,该行代码将查表后计算的值赋予到一个新的矩阵,并没有对后续查表计算产生影影响,这是不合理的,当中心点完全处于二值图内部时(即是3×3矩阵完全在目标区域内),计算得到的表索引将为0,查表得到的值同样为0,最终在与二值图目标区域内部的相同位置上,新矩阵的值同样为0,因此导致上述情况。

结果二:

按上述理解改正代码后如下:

# -*- coding: utf-8 -*-

"""

Created on Mon Jun 10 14:35:27 2019

@author: 高行吟

"""

import numpy as np

def Get_skeleton_line(img):

table = [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]

r , c = img.shape

# line_img = np.zeros((r , c))

new_img = np.zeros((r + 2 , c + 2))##由于本程序以窗口遍历,因此原矩阵四个方向均增加一个全零边,方便计算

new_img[1:-1 , 1:-1] = img

new_img = np.where(new_img == 1 , 0 , 1)###由于目标区域值为1,而查表法规定,一旦像素为目标,则其权重为0,因此将矩阵所有值全部反向,即是0→1,1→0,方便与权重模板temp做乘法计算

temp = np.array([[1 , 2 , 4] , [8 , 0 , 16] , [32 , 64 , 128]])###权重矩阵

for i in range(1 , r+1):

for j in range(1 , c+1):

# line_img[i-1 , j-1] = table[(new_img[i-1:i+2 , j-1:j+2]*temp).sum()]######窗口矩阵与模板相乘,其和即为表索引

new_img[i , j] = table[(new_img[i-1:i+2 , j-1:j+2]*temp).sum()]

return new_img[1:-1 , 1:-1]#line_img

但结果仍然未达到目的,提取的仍然不是骨骼线,但生成的图案却,,,怎么说呢,反正是很特殊,是自己平时想要获取类似的图案都无法着手的那种,而且总感觉这种图案会有些用处,但目前还想不到可以用在什么地方。。。

结果图如下,还是上面那副素材:

   

原图                                                                   二值图                                                  处理后

经过与原博客代码对照,发现问题应出现在处理范围上,原博客仅针对目标像素处理,而上述一改之后的代码确是从第一个像素即开始处理,当中心像素窗口完全不在目标区域,其计算的所索引值将达到最大,从table表中可以看出,最终结果为0,与上面处理后图像的结果相符。

结果三:

按照上述理解,进行第二次修改,相对于第一修改后代码,仅增加了倒数第三行代码:

# -*- coding: utf-8 -*-

"""

Created on Mon Jun 10 14:35:27 2019

@author: 高行吟

"""

import numpy as np

def Get_skeleton_line(img):

table = [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]

r , c = img.shape

# line_img = np.zeros((r , c))

new_img = np.zeros((r + 2 , c + 2))##由于本程序以窗口遍历,因此原矩阵四个方向均增加一个全零边,方便计算

new_img[1:-1 , 1:-1] = img

new_img = np.where(new_img == 1 , 0 , 1)###由于目标区域值为1,而查表法规定,一旦像素为目标,则其权重为0,因此将矩阵所有值全部反向,即是0→1,1→0,方便与权重模板temp做乘法计算

temp = np.array([[1 , 2 , 4] , [8 , 0 , 16] , [32 , 64 , 128]])###权重矩阵

for i in range(1 , r+1):

for j in range(1 , c+1):

if new_img[i , j] == 0:####判断中心像素是否为目标像素,由于前面进行了像素值反转,因此,此处0值代表目标像素

# line_img[i-1 , j-1] = table[(new_img[i-1:i+2 , j-1:j+2]*temp).sum()]######窗口矩阵与模板相乘,其和即为表索引

new_img[i , j] = table[(new_img[i-1:i+2 , j-1:j+2]*temp).sum()]

return new_img[1:-1 , 1:-1]#line_img

按上述二改后代码运行结果正确,结果为单像素组成的连通边,如下:

原图                                                         二值图                                                    处理后

python查表法是什么_python查表法提取骨骼线经历相关推荐

  1. python中科学计数法怎么表示_python科学计数法转换

    python 输出数字,如何不以科学计数法输出? 概述利用numpy设置输出选项即可 代码解析 未使用numpy设置: import time # time 时间类 print(time*time*1 ...

  2. python获取数据库返回的结果_python 查数据库的数据返回的是没有数据?

    def process_item(self, item, spider): print('打印的文件地址和名字为') print(item['file_url'], item['name']) key ...

  3. python怎样显示表格数据匹配_Python根据表中每一行中的数据匹配txt文章中出现的次数,表格,每行,在,统计...

    用途: 根据表格每行数据,匹配在txt文章中出现的次数统计 示例: 注意事项: 1. 环境:pip install re & pandas & xlrd; python 3; 2. 表 ...

  4. python打印数字对应的星号_python打印表格式数据-星号或注释

    python打印表格式数据,留出正确的空格,格式化打出 代码如下: def printPicnic(itemsDict,leftWidth,rightWidth): print('PICNIC ITE ...

  5. python穷举法搬砖_python 穷举法 算24点(史上最简短代码)-阿里云开发者社区

    # 作者:hhh5460 # 时间:2017年6月3日 import itertools deftwentyfour(cards): '''史上最短计算24点代码''' for nums in ite ...

  6. python cv2 轮廓的包络 面积_Python + Opencv2 实现轮廓提取,轮廓区域面积计算

    对图像处理时,会遇到这样一个场景:找到图像主体轮廓,这是其一,可能为了凸显轮廓,需要用指定的颜色进行标记:轮廓标记完可能任务还没有结束,还需对轮廓所勾勒的像素面积区域统计计算. 本篇文章的主要内容就是 ...

  7. python统计图片的纹理信息_python实现LBP方法提取图像纹理特征实现分类

    题目描述 这篇博文是数字图像处理的大作业. 题目描述:给定40张不同风格的纹理图片,大小为512*512,要求将每张图片分为大小相同的9块,利用其中的5块作为训练集,剩余的4块作为测试集,构建适当的模 ...

  8. Django:数据库表的建立与增删查改(ForeignKey和ManytoMany)

    数据库表的创建: 1.Django工程项目建立,基础环境调试. 2.创建表 from django.db import models class Publisher(models.Model):    ...

  9. oracle 减少回表,減少oracle sql回表次數 提高SQL查詢性能 | 學步園

    要寫出高效的SQL,那麼必須必須得清楚SQL執行路徑,介紹如何提高SQL性能的文章很多,這裡不再贅述,本人來談談如何從 減少SQL回表次數 來提高查詢性能,因為回表將導致掃描更多的數據塊. 我們大家都 ...

最新文章

  1. 内连级元素有哪些_CSS里有哪些常见的块级元素和行内元素?
  2. [mmu/cache]-Cache Type Register(CTR)寄存器介绍-InProgress
  3. iOS 直播推流 - 搭建基于RTMP的本地Nginx服务器
  4. 日语学习-多邻国-关卡1-介绍2
  5. js字符串编码和unicode编码互转
  6. Jquery 网站保存信息提示消息实现,提示后自动消失
  7. 云承软件和云溪哪个好_多工序开料机的软件对接及注意事项
  8. 计算机程序设计语言发展经历了,简述计算机程序设计语言的发展历程
  9. Word文字处理技巧
  10. 新的抗VEGF药物——阿柏西普ELISA 试剂盒相关研究
  11. 纯CSS实现图片动画
  12. 2021年危险化学品经营单位安全管理人员考试内容及危险化学品经营单位安全管理人员考试资料
  13. GeoServer发布osm数据地图服务
  14. PAT乙级在霍格沃茨找零钱(20)
  15. 公众号开发教程:微信视频预览一半就要收费是怎么做的
  16. AIX之topas命令详解
  17. Mac AppStore 登陆提示 未知错误
  18. 关于在写代码时如何使用绝对路径与相对路径及其简单介绍
  19. Photoshop Dreamweaver CS4 错误148:3解决方案
  20. Wannafly挑战赛26: B. 冥土追魂(思维题)

热门文章

  1. There is no getter for property named ‘pCode‘ in ‘classXXX‘
  2. python一入深似海-模块化编程-钢铁侠战甲(二)
  3. 抖音上线“冬季山货节”,不声不响把拼多多老家“偷了”?
  4. trueOS能装linux软件,TrueOS 17.12发布下载,一款基于FreeBSD的桌面Linux系统
  5. Nape实现坐标旋转角度回弹
  6. 360浏览器怎么添加拓展(有图文步骤)
  7. VIVO NEX 3 5G版上手评测,除99.6%的屏占比,还有什么理由入手
  8. 项目需求变更原因及处理
  9. iPhone共享WIFI密码到Macbook - 无需在Mac上使用WIFI万能钥匙
  10. 基于AntV G2实现一个通用可视化Vue插件