将轮廓(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)转换为与原始大小相同的图像的主要内容,如果未能解决你的问题,请参考以下文章