Java参考博主思路和程序基本上都是小修改

 2024-01-07 00:03:27  阅读 0

主要思路和程序基本都是基于博主的,只是在思路理解上做了一些小修改。

首先介绍一下算法原理:

图像细化:

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

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

细化涉及从原始图中删除点,同时仍保持原始形状。 事实上,原始图像的骨架被保留了。 判断一个点是否可以去除是根据8个相邻点(8个连通点)的条件。 具体标准是:

1. 内部积分无法删除

2. 鼓励点不能删除

3. 线端点无法删除。

4、如果P是边界点,去掉P后,如果连通分量没有增加,那么可以去掉P

看上面的点,它们是3*3矩阵中的中心点。

第一个点无法删除,因为它是内部点

第二个点无法移除,它也是一个内部点

第三点不能去掉。 删除它会导致原来连接的部分断开。

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

第五点不能去掉,它是直线的端点

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

等等~图片无法列出所有的情况,所以我们会有一个算法和映射,以表格的形式列出所有的情况——

也就是说,假设我们问某个点是否需要细化(去除)。 我们需要将其周围的所有八个点列出来形成一个带有良好标签的矩阵,如上图1所示,然后为每个位置分配不同的点。 权重值,即右边的表格值,可以列出每种情况。

原文的解释是——

对于黑色像素,我们为其周围的八个点分配不同的权重。 如果周围是黑色,我们认为它的权重是0。如果是白色,我们在九个方格中取相应的权重。 这其实取决于你对自己形象的价值的确定。 如果你的目标值本身就是白色的话,效果肯定会适得其反。

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

上图中的第二个点周围有三个白点。 其总值为1+4+32=37,对应索引表中的第三十八项。

我们使用这种方法将所有点映射到一个范围从0到255的索引表。

索引表是如下16*16的矩阵:

数组 = [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)

可以看到效果图:

opencv二值化区域范围_opencv二值化_opencv二值化头文件

opencv二值化区域范围_opencv二值化_opencv二值化头文件

显然没有博主原版好看啊~

博主原话如下:

opencv二值化区域范围_opencv二值化_opencv二值化头文件

我不知道原因是什么。 也许我的二值化处理得不好? 我的图是截图的,不是很干净吗?

标签: 骨架 去除 细化

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码