细化/ Skeletenization扭曲了我的形象

时间:2018-03-04 17:03:26

标签: python opencv image-processing computer-vision scikit-image

我试图将这张图片缩小,但它会一直变形。

enter image description here

enter image description here

这是我应用细化的相关代码。我也尝试过“瘦身”。功能而不是' skeletonize'但结果是相似的。

$.getScript("script1.js", function() {
   console.log("script1 loaded. You can use script1 variables here!");
});

我的目标是在变薄后获得与此相似的形状:

enter image description here

我做错了什么?我在网上看到,有时jpg文件会导致问题,但是我没有这方面的经验来证实这一点。

2 个答案:

答案 0 :(得分:1)

我不确定您从输入图像到二进制文件的转换是否正确。这是一个使用scikit-image函数的版本,似乎可以做你想要的:

from skimage import img_as_float
from skimage import io, color, morphology
import matplotlib.pyplot as plt

image = img_as_float(color.rgb2gray(io.imread('char.png')))
image_binary = image < 0.5
out_skeletonize = morphology.skeletonize(image_binary)
out_thin = morphology.thin(image_binary)


f, (ax0, ax1, ax2) = plt.subplots(1, 3, figsize=(10, 3))

ax0.imshow(image, cmap='gray')
ax0.set_title('Input')

ax1.imshow(out_skeletonize, cmap='gray')
ax1.set_title('Skeletonize')

ax2.imshow(out_thin, cmap='gray')
ax2.set_title('Thin')

plt.savefig('/tmp/char_out.png')
plt.show()

skeletonization and thinning in skimage

答案 1 :(得分:0)

从您的示例中,由于您的图像是二进制的,我认为您想要做的事情是通过(二进制)侵蚀更好地实现的。 Wikipedia很好地解释了这个概念。直观地(如果您没有时间阅读维基百科链接),想象您有一个二进制图像A,就像您给出的那个,并且让我们调用A_1 A的像素集,其值为1。然后,您定义一个&#34;结构元素&#34; K,例如可以是大小为n*n的方形补丁。然后是伪代码

for pixel in A_1:
    center K at pixel, and call this centered version K_pixel 
    if(K_pixel is contained in A_1):
        keep pixel
    else:
        discard pixel

因此,这会使图像中的连接组件变薄。

此函数是标准的,在opencv中实现,here是一些python示例,here是文档的链接(c ++)。