二值图像的骨架提取

直接用python的skimage库中的morphology, 效果不好。明天再换个其他算法试试。

# 骨架提取 效果不好。
path = 'F:/0/'
files = os.listdir(path)
for i in range(len(files)):
    print(files[i])
    file = Image.open(path+files[i])
    f = file.convert('L')
    if i == 36:
        f.save('F:/10.jpg')
    array = np.array(f)
    x = array.shape[0]
    y = array.shape[1]
    # 黑白反色
    for m in range(x):
        for n in range(y):
            if array[m][n] == 0:
                array[m][n] = 1
            else:
                array[m][n] = 0

    skeleton = morphology.skeletonize(array)
    scipy.misc.imsave('F:/1/{}.jpg'.format(i), skeleton)

morphology函数的参数是图像的数组,这里用numpy转化了下。

函数返回是ndarray, 最后用scipy.misc转成图片保存。

不是对于所有图片效果都好:例如

原图:


处理后:变成了不连续的像素。




另外发现os.listdir(path)方法得到的list不是按照存储的顺序,而是重新排序。

   


又尝试了查表法细化:

算法参考:https://www.cnblogs.com/xianglan/archive/2011/01/01/1923779.html

python 实现:

import cv2
import numpy as np
import os


# 查表法细化
def to_thin(image, array):
    (height, width) = image.shape
    i_thin = np.zeros((width, height), np.uint8)
    i_thin = image
    for h in range(height):
        for w in range(width):
            if image[h, w] == 0:
                a = [1] * 9
                for i in range(3):
                    for j in range(3):
                        if -1 < h-1+i < height and -1 < w-1+j < width and i_thin[h-1+i, w-1+j] == 0:
                            a[j*3+i] = 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
                i_thin[h, w] = array[sum] * 255
    return i_thin




def to_binary(image):
    (h, w) = image.shape
    i_binary = np.zeros((h, w), np.uint8)
    for i in range(h):
        for j in range(w):
            i_binary[i, j] = 0 if image[i, j] < 100 else 255
    return i_binary



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]

path ='F:/0/'
files = os.listdir(path)

for i in range(len(files)):
    img = cv2.imread(path+files[i], 0)
    binary = to_binary(img)
    thin = to_thin(binary, array)
    cv2.imwrite('F:/3/{}.jpg'.format(i), thin)

原图:


处理后:


部分依然没达到效果。或许细化或是骨架提取对于图片分类并不能产生什么帮助。

猜你喜欢

转载自blog.csdn.net/ll523587181/article/details/79581568