将轮廓(MatplotLib 或 OpenCV)转换为与原始大小相同的图像

Posted

技术标签:

【中文标题】将轮廓(MatplotLib 或 OpenCV)转换为与原始大小相同的图像【英文标题】:Convert contour (MatplotLib or OpenCV) to image of the same size as the original 【发布时间】: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=[])

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

【问题讨论】:

【参考方案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=[]) 行,它必须在它之前。非常感谢您的帮助!

以上是关于将轮廓(MatplotLib 或 OpenCV)转换为与原始大小相同的图像的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib 直方图或 Seaborn 分布图的 bin 上没有轮廓

OpenCV——图像的矩(计算矩轮廓面积轮廓或曲线长度)

matplotlib 中的轮廓标签填充轮廓错误?

最大轮廓和投影 转

matplotlib 中的曲面和 3d 轮廓

OpenCV竟然可以这样学!成神之路终将不远(十七)