【问题标题】:Convert contour (MatplotLib or OpenCV) to image of the same size as the original将轮廓(MatplotLib 或 OpenCV)转换为与原始大小相同的图像
【发布时间】:2012-11-17 09:07:23
【问题描述】:

我用 MatplotLib 获得了这个轮廓:

现在,我想将它用作普通的 Python 图像(PIL 或数组),因为我想将它应用为掩码(通过 OpenCV 获得)。

问题是使用MatplotLib,带有轮廓的图像被调整大小,并添加了一个边距(对于轴,即使我不画轴),所以我从MatplotLib的图中获得的图像不适合使用 OpenCV 获得的掩码。

我尝试使用 OpenCV 获得相同的轮廓,但我没有使用 cv2.FindContours 和 cv2.DrawContours 函数获得任何结果(如果你知道如何做到这一点,请告诉我......在这个previous topic你可以看到原图和我想要的轮廓)

另一种可能的解决方案是将使用 MatplotLib 获得的轮廓转换为与原始大小相同且没有边距的图像(PIL 或数组)。

我希望您至少可以通过其中一种解决方案帮助我!

--------------------------- 编辑 ------------------- --------

Rutger Kassies 的回答是正确的。它对我不起作用,因为我写了这行......

ax = plt.axes([0, 0, 1, 1], frame_on=False, xticks=[], yticks=[])

... 使用轮廓函数后,必须在使用轮廓函数之前。请记住这一点!

【问题讨论】:

    标签: python image-processing opencv matplotlib contour


    【解决方案1】:

    我曾经发布过如何使用 .imshow 绘制图像并再次保存以使其与输入图像相等的问题。我得到的答复可能对您的情况有所帮助,这就是您可以保存具有相同尺寸的轮廓图像的方法:

    from PIL import Image
    
    im = np.array(Image.open('input_image.jpg').convert('L'))
    
    xpixels = im.shape[1]
    ypixels = im.shape[0]
    
    dpi = 72
    scalefactor = 1
    
    xinch = xpixels * scalefactor / dpi
    yinch = ypixels * scalefactor / dpi
    
    fig = plt.figure(figsize=(xinch,yinch))
    
    ax = plt.axes([0, 0, 1, 1], frame_on=False, xticks=[], yticks=[])
    
    contour(im, levels=[240], colors='black', origin='image')
    
    plt.savefig('same_size.png', dpi=dpi)
    

    【讨论】:

    • 使用OO接口而不是状态机接口会更好。即c = ax.contour(...)fig.savefig(...)
    • 我完全同意,OO 风格肯定更好。这段代码基本上是对提到的“以前”帖子中的代码的修改,我打算尽可能接近原始代码。
    • @Rutger Kassies 感谢您的回答。请在问题中查看我的编辑。不知道为什么还有余量。
    • @Xithas,我无法复制您的结果。我的完美重叠,也许你最初的数字有不同的 dpi 或什么?也许在声明时尝试添加 dpi=dpi 。查看我的结果:nbviewer.ipython.org/4190082
    • @RutgerKassies 您的代码是正确的。我在轮廓函数之后使用了plt.axes([0, 0, 1, 1], frame_on=False, xticks=[], yticks=[]) 行,它必须在它之前。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 2013-03-23
    • 2021-02-03
    相关资源
    最近更新 更多