为了账号安全,请及时绑定邮箱和手机立即绑定

如何从图像中提取平滑的骨架

如何从图像中提取平滑的骨架

慕斯王 2022-01-05 10:27:21
我有一些固定大小的字体字符图像,如输入图像示例下所示。我想提取字符骨架(单像素宽)。我尝试了如下所示的各种方法,但输出都不同且不流畅。我认为一像素宽的骨架会很平滑(像素不会破裂,也没有噪点像素)。有一个更好的方法吗?如果没有,这三个中哪个最好?输入图像样本1) 例子from skimage import img_as_bool, io, color, morphologyimport matplotlib.pyplot as pltimage = img_as_bool(color.rgb2gray(io.imread('image.jpeg')))out = morphology.medial_axis(image)f, (ax0, ax1) = plt.subplots(1, 2)ax0.imshow(image, cmap='gray', interpolation='nearest')ax1.imshow(out, cmap='gray', interpolation='nearest')plt.show()输出 12) 例子from PIL import Image, ImageDraw, ImageFontimport mahotas as mhimport numpy as npimage = Image.new("RGBA", (600,150), (255,255,255))draw = ImageDraw.Draw(image)fontsize = 150font = ImageFont.truetype("font.TTF", fontsize)txt = '가'draw.text((30, 5), txt, (0,0,0), font=font)img = image.resize((188,45), Image.ANTIALIAS)print(type(img))plt.imshow(img)img = np.array(img)im = img[:,0:50,0]im = im < 128skel = mh.thin(im)noholes = mh.morph.close_holes(skel)plt.subplot(311)plt.imshow(im)plt.subplot(312)plt.imshow(skel)输出 23) 例子from skimage.morphology import skeletonizefrom skimage import drawfrom skimage.io import imread, imshowfrom skimage.color import rgb2grayimport os# load image from fileimg_fname='D:\Ammar Data\Debbie_laptop_data\Ammar\sslab-deeplearning\GAN models\sslab_GAN\skeleton\hangul_1.jpeg' image=imread(img_fname)# Change RGB color to gray image=rgb2gray(image)# Change gray image to binaryimage=np.where(image>np.mean(image),1.0,0.0)# perform skeletonizationskeleton = skeletonize(image)plt.imshow(skeleton)输出3
查看完整描述

1 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

您的代码很好,但您可能需要更改将图像转换为二进制的方式。此外,为了避免看起来嘈杂的输出,您可以应用binary_closing到您的骨架图像。看看下面的代码——


import matplotlib.pyplot as plt

from skimage import img_as_bool

from skimage.io import imread

from skimage.color import rgb2gray

from skimage.morphology import skeletonize, binary_closing



im = img_as_bool(rgb2gray(imread('0jQjL.jpg')))

out = binary_closing(skeletonize(im))


f, (ax0, ax1) = plt.subplots(1, 2)

ax0.imshow(im, cmap='gray', interpolation='nearest')

ax1.imshow(out, cmap='gray', interpolation='nearest')

plt.show()

您的两个示例图像给了我以下输出 -

//img1.sycdn.imooc.com//61d50256000120fa03770384.jpg

编辑:为避免将图像转换为 bool 时的精度损失,您还可以使用可用的阈值算法之一对图像进行二值化。我更喜欢大津的。


import matplotlib.pyplot as plt

from skimage.io import imread

from skimage.filters import threshold_otsu

from skimage.color import rgb2gray

from skimage.morphology import skeletonize, binary_closing


def get_binary(img):    

    thresh = threshold_otsu(img)

    binary = img > thresh

    return binary


im = get_binary(rgb2gray(imread('Snip20190410_9.png')))

out = binary_closing(skeletonize(im))


f, (ax0, ax1) = plt.subplots(1, 2)

ax0.imshow(im, cmap='gray', interpolation='nearest')

ax1.imshow(out, cmap='gray', interpolation='nearest')

plt.show()


查看完整回答
反对 回复 2022-01-05
  • 1 回答
  • 0 关注
  • 221 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信