图像细化(骨骼获取)OpenCV3.0 Python

OpenCV图像细化与骨架提取实战:从原理到工业级应用 在计算机视觉与图像处理领域,形态学操作是分析和处理二值图像形状的基础技术。其核心原理是通过结构元素与图像的相互作用,实现区域的膨胀、腐蚀、开闭运算等,从而提取或修改目标的拓扑与几何特征。这项技术的核心价值在于,它能将复杂的、具有宽度的物体区域,转化为单像素宽、保留原始拓扑结构的“骨架”表示,极大地简化了后续的形状分析与特征提取。在工业视觉检测、医学图像分析(如血管网络提取)和文档处理(如OCR字符细化)等场景中,骨架提取是进行精确测量、路径追踪和模式识别的关键预处理步骤。本文聚焦于实现鲁棒的细化算法,针对现 阅读详情

原作者(opencv 2):https://www.cnblogs.com/xianglan/archive/2011/01/01/1923779.html

方法1(python版):https://blog.youkuaiyun.com/hehedadaq/article/details/80303218

最近做项目用到图像细化算法,上网找了一下很少有用python的,找到一个还是opencv2的,无法使用,简单加以修改.

其中第一种算法速度较快,但效果并不理想;第二种算法效果比较理想,但速度很慢.


首先介绍图像细化:

图像细化主要是针对二值图而言,所谓骨架,可以理解为图像的中轴,,一个长方形的骨架,是它的长方向上的中轴线,圆的骨架是它的圆心,直线的骨架是它自身,孤立点的骨架也是自身。我们来看看典型的图形的骨架(用粗线表示)

细化的算法有很多种,但比较常用的算法是查表法

细化是从原来的图中去掉一些点,但仍要保持原来的形状。实际上是保持原图的骨架。判断一个点是否能去掉是以8个相邻点(八连通)的情况来作为判据的,具体判据为:

  1. 内部点不能删除
  2. 孤立点不能删除
  3. 直线端点不能删除
  4. 如果P是边界点,去掉P后,如果连通分量不增加,则P可删除

看看上面那些点,就是3*3矩阵中的中心点。

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

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

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

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

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

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

等等~图中无法列举出所有的情况,所以我们将有一个算法和映射,将所有的情况用表格的形式列举出来,如下图所示

即假设我们要求,某个点是否需要被细化(去除),我们需要将它周围的八个点都列出来,形成一个矩阵,标号好,如上图,然后每个位置的点,赋予不同的权值,即右边的表格值,就可以将每一种情况列举出来了。

我们对于黑色的像素点,对于它周围的8个点,我们赋予不同的权值,若周围为黑色,我们认为其权值为0,为白色则取九宫格中对应的权值,这个其实根据你自己图像中的值来确定,如果你的目标值本身就是白色,那么效果肯定相反。

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

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

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

 索引表也就是下面的16*16矩阵:

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]

方法一:

# -*- coding: utf-8 -*-
"""
Created on Sat May 12 16:36:06 2018
@author: lele
"""
import cv2
 
#细化函数,输入需要细化的图片(经过二值化处理的图片)和映射矩阵array
#这个函数将根据算法,运算出中心点的对应值
def Thin(image,array):
    h,w = image.shape
    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):
                    for l in range(3):
                        #如果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[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的那一点进行赋值。
                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('letter.jpg',0) #直接读为灰度图像
cv2.imshow('image',img)
cv2.waitKey(0)
 
#自适应二值化函数,需要修改的是55那个位置的数字,越小越精细,细节越好,噪点更多,最大不超过图片大小
th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,55,2) #换行符号 \
cv2.imshow('iTwo',th3)
cv2.waitKey(0)
 
#获取自适应二值化的细化图,并显示
iThin = Thin(th3,array)
cv2.imshow('iThin',iThin)
cv2.waitKey(0)
 
#获取简单二值化的细化图,并显示
iTwo = Two(img)
iThin_2 = Thin(iTwo,array)
cv2.imshow('iTwo_2',iThin_2)
cv2.waitKey(0)
 
cv2.destroyAllWindows()

方法二: 我自己在中间加了高斯滤波和腐蚀操作,使图像效果更好一些.另外直接用自适应二值化函数获取二值化图像.

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

import cv2


def VThin(image,array):

    h,w = image.shape
    NEXT = 1
    for i in range(h):
        for j in range(w):
            if NEXT == 0:
                NEXT = 1
            else:
                M = int(image[i,j-1])+int(image[i,j])+int(image[i,j+1]) if 0<j<w-1 else 1
                if image[i,j] == 0  and M != 0:                  
                    a = [0]*9
                    for k in range(3):
                        for l in range(3):
                            if -1<(i-1+k)<h and -1<(j-1+l)<w and image[i-1+k,j-1+l]==255:
                                a[k*3+l] = 1
                    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
                    image[i,j] = array[sum]*255
                    if array[sum] == 1:
                        NEXT = 0
    return image  
      
    
def HThin(image,array):

    h,w = image.shape
    NEXT = 1
    for j in range(w):
        for i in range(h):
            if NEXT == 0:
                NEXT = 1
            else:
                M = int(image[i-1,j])+int(image[i,j])+int(image[i+1,j]) if 0<i<h-1 else 1   
                if image[i,j] == 0 and M != 0:                  
                    a = [0]*9
                    for k in range(3):
                        for l in range(3):
                            if -1<(i-1+k)<h and -1<(j-1+l)<w and image[i-1+k,j-1+l]==255:
                                a[k*3+l] = 1
                    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
                    image[i,j] = array[sum]*255
                    if array[sum] == 1:
                        NEXT = 0
    return image

def Xihua(image,array,num=10):
    for i in range(num):
        VThin(image,array)
        HThin(image,array)
    return image

 
def main(path):
    #映射表
    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(path,0) #直接读为灰度图像
    cv2.imshow('image',img)
    cv2.waitKey(0)
     
    gaussian_img = cv2.GaussianBlur(img, (5, 5),5)  
    kernel3 = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3)) 
    dilate_img = cv2.dilate(gaussian_img,kernel3)
    binary_img = cv2.adaptiveThreshold(dilate_img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,99,5)

    cv2.imshow('binary',binary_img)
    cv2.waitKey(0)
      
    xihua_img = Xihua(binary_img,array)
    cv2.imshow('xihua',xihua_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

Kinect2.0+Opencv人体骨骼捕捉及绘制VisualStudio2015工程文件 使用Kinect2.0获取人体骨骼,并使用openCV实时绘制,里面为VisualStudio2015工程文件,配置好Kinect开发环境可直接用VS2015打开并运行 立即下载

相关推荐

C++实现灰度图像的腐蚀、膨胀、细化运算

C++实现灰度图像的腐蚀、膨胀、细化运算(bmp灰度图片),vc6.0运行无误

图像细化原理

Zhang-Suen 算法原理Zhang-Suen 算法每运行一次, 需要遍历所有的不为0的像素。在对每个像素(P1)进行删除或保留的判断时,我们需要关注其周围的8个邻居像素(P2, P3, P4, P5, P6, P7, P8)的值。其中 P2 到 P8 的顺序是算法规定,用于后面判断。

weixin_43763292的博客 3410

ASF-YOLO:一种基于注意尺度序列融合的细胞实例分割YOLO模型

随着样本制备技术和显微成像技术的快速发展,细胞图像的定量处理和分析在医学、细胞生物学等领域发挥着重要作用。基于卷积神经网络(CNN),可以通过神经网络训练学习不同细胞图像的特征信息,具有很强的泛化性能。两阶段的R-CNN系列[1,2,3]及其一阶段变体[4,5]是实例分割任务的经典CNN基础框架。在最近的研究中,You Only Look Once(YOLO)系列[6,7,8,9]已经成为实时实例分割中速度最快、最准确的模型之一。

m0_47867638的博客 9798

形态学图像处理(二)

本文主要包括以下内容 二值形态学的经典应用, 细化和像素化, 以及凸壳 灰度图像的形态学运算, 包括灰度腐蚀、灰度膨胀、灰度开和灰度闭 本章的典型案例分析 在人脸局部图像中定位嘴的中心 显微镜下图像的细菌计数 利用顶帽变换(top-hat)技术解决光照不均问题 细化算法 “骨架”是指一副图像的骨髓部分,它描述物体的几何形状和拓扑结构,是重要的图像描绘...

weixin_30723433的博客 778

为什么你的XGBoost多分类效果不如预期?可能是这5个参数没调对

本文深度剖析了XGBoost模型在处理多分类问题时效果不佳的五大关键参数陷阱。针对多分类问题的独特性,文章提供了max_depth、learning_rate、采样参数及正则化参数等核心参数的量化调整策略与诊断方法,帮助开发者精准调优,有效提升模型在各类别上的均衡性能与泛化能力。

weixin_29182481的博客 296

Proteus仿真实战:用STM32F103C8T6输入捕获模式精准测量PWM频率(附完整代码)

本文详细解析了如何在Proteus仿真环境中,利用STM32F103C8T6的输入捕获模式精准测量PWM频率。文章从输入捕获的工作原理、Proteus电路搭建、模块化代码实现到调试优化,提供了完整的实战指南和代码示例,帮助开发者深入理解并掌握这一关键技术。

weixin_29158047的博客 257

【OpenCV-Python】:查找物体轮廓+计算轮廓面积、长度、重心

😺一、查找物体轮廓 🐶1.1 函数API 函数:img, contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]]) .

王乐予的博客 2万+

物理信息神经网络(PINNs)在交通运输领域的应用

物理信息神经网络(PINNs)在交通运输领域的应用研究结合了数据驱动与物理模型约束,通过嵌入交通流守恒定律等物理信息,显著提升了交通状态估计与预测的精度。该技术仅需少量观测数据(流量、速度、密度等),即可实现高精度建模,尤其适用于数据稀疏场景。研究重点包括:交通状态估计与预测、参数辨识、交通控制优化等领域,同时面临计算成本高、物理模型依赖性等挑战。未来需解决大规模异构数据处理问题,以进一步推动智能交通系统发展。

qq_49609070的博客 944

OpenCV—python 图片细化(骨架提取)一

文章目录一、前言二、第一种算法描述三、第二种算法 一、前言 Hilditch算法参看资料:http://cis.k.hosei.ac.jp/~wakahara/Hilditch.c Hilditch第二种算法:http://cgm.cs.mcgill.ca/~godfried/teaching/projects97/azar/skeleton.html#algorithm 图像细化: 图像细化主要...

红叶谷 wsp_1138886114的博客 2万+

OpenClaw插件配置错误修复完全指南

插件文件名是插件目录结构正确package.json配置正确OpenClaw的插件系统还在快速迭代,偶尔会遇到这种配置问题。看错误信息检查配置文件检查实际文件对比差异修复问题大部分问题都能解决。查看官方文档:https://openclaw.ai/docs提Issue:https://github.com/openclaw/openclaw/issues加入Discord社区求助快速修复命令汇总。

Maynor的博客 4092

2020年大连理工大学《计算机控制技术》期末试卷

2020年大连理工大学《计算机控制技术》期末试卷 2020年大连理工大学《计算机控制技术》期末试卷 2020年大连理工大学《计算机控制技术》期末试卷 2020年大连理工大学《计算机控制技术》期末试卷 ...

无名何许人的博客 650

opencv实现二值图像细化的算法

opencv实现二值图像细化的算法

hggugfn的博客 743

Zemax与Matlab交互:双胶合优化详细流程

Zemax与Matlab交互:双胶合优化详细流程

weixin_72050316的博客 629

数字图像处理上机实验之医学骨骼增强(OpenCv+Python)

利用OpenCv对医学骨骼图像进行增强操作,欢迎大家阅读!

m0_73962294的博客 2320

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【youcans 的 OpenCV 例程200篇】127. 形态算法之细化

细化是将图像的线条从多像素宽度减少到单位像素宽度的过程,也称为"骨架化"、"中轴转换"和"对称轴转换"。 形态骨架(morphological skeleton)是一种细化的结构,指图像的骨骼部分,用于描述物体的几何形状和拓扑结构,是目标物体重要的拓扑描述。图像的细化是对二值图像进行骨架提取,删除不需要的轮廓点,只保留其骨架点。

youcans的博客 3115

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

基于OpenCV实现二值图细化,骨骼化并求出端点和交叉点

转载自:http://m.blog.csdn.net/article/details?id=53135866         所谓细化就是经过一层层的剥离,从原来的图中去掉一些点,但仍要保持原来的形状,直到得到图像的骨架。骨架,可以理解为物体的中轴,例如一个长方形的骨架是它的长方向上的中轴线;正方形的骨架是它的中心点;圆的骨架是它的圆心,直线的骨架是它自身,孤立点的骨架也是自身。得到了骨架,

zilanpotou182的博客 4383

zhang 快速并行细化方法_zhang快速并行细化算法

//#include "stdafx.h"#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include #include using namespace cv;using namespace std;/** @brief 对输入图像进行细化,骨骼化* @param src为输入图像,用cvT...

weixin_36087674的博客 384

骨骼细化

# -*- coding: utf-8 -*- """ Created on Sat May 12 16:36:06 2018 @author: lele """ import cv2 # 细化函数,输入需要细化的图片(经过二值化处理的图片)和映射矩阵array # 这个函数将根据算法,运算出中心点的对应值 def Thin(image, array): h, w = image.shape iThin = image for i in range(h): fo

weixin_43014882的博客 212

AI骨骼检测WebUI怎么用?上传图像自动生成火柴人实战指南

本文介绍了基于星图GPU平台自动化部署AI人体骨骼关键点检测镜像的完整实践。该镜像集成MediaPipe Pose模型,支持上传图像后自动生成火柴人骨架图,适用于动作分析、健身指导等场景的本地化AI应用开发,无需联网即可实现高精度姿态估计。

weixin_29323977的博客 927

python批量图像骨架提取

参考文章:OpenCV—python 图片细化(骨架提取) 安装库pip install scikit-image -i https://pypi.tuna.tsinghua.edu.cn/simple import cv2 from skimage import morphology import numpy as np img = cv2.imread('xihua_test.png',0) _,binary = cv2.threshold(img,200,255,cv2.THRESH_BINARY

weixin_42505757的博客 3632

AI人体骨骼检测代码实例:Python调用MediaPipe关键点提取

本文介绍了基于星图GPU平台自动化部署AI人体骨骼关键点检测镜像的实践方法。该镜像集成MediaPipe Pose模型,支持在无GPU环境下高效运行,适用于动作识别、姿态分析等场景。开发者可快速实现关键点提取与模型微调,广泛应用于智能健身、虚拟试衣等AI应用开发,提升部署效率与系统稳定性。

weixin_30336531的博客 719

AI人体骨骼检测代码实例:Python调用核心函数详解

本文介绍了基于星图GPU平台自动化部署AI人体骨骼关键点检测镜像的完整方案。该镜像集成MediaPipe Pose模型,支持Python调用核心函数实现姿态估计,并可快速应用于动作识别、健身指导等场景的模型微调与AI应用开发,具备高精度、低延迟、本地化运行等优势。

weixin_30700095的博客 615

AI骨骼关键点检测完整流程:数据输入-推理-可视化输出详解

本文介绍了基于星图GPU平台自动化部署AI人体骨骼关键点检测镜像的完整流程。该镜像集成MediaPipe Pose模型,支持从图像输入到姿态推理再到骨架可视化输出的全流程处理,适用于健身动作分析、行为识别等场景的模型微调与AI应用开发,助力开发者高效构建私有化部署方案。

weixin_35307279的博客 952

【youcans 的 OpenCV 例程200篇】129. 形态算法之骨架 (重建开运算)

形态骨架(morphological skeleton)是一种细化的结构,指图像的骨骼部分,用于描述物体的几何形状和拓扑结构,是目标物体重要的拓扑描述。图像的细化是对二值图像进行骨架提取,删除不需要的轮廓点,只保留其骨架点。 骨架可以用腐蚀和开运算来表示,,可以用重建开运算来实现。

youcans的博客 5289
上一篇: LeetCode242. Valid Anagram
下一篇: Python 给多个变量同时赋值
船桥
博客等级 码龄9年 5粉丝 194原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值