直接用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)
原图:
处理后:
部分依然没达到效果。或许细化或是骨架提取对于图片分类并不能产生什么帮助。