在不保存图像的情况下使用matplotlib时删除图像周围的白色边框

时间:2018-04-06 13:07:55

标签: python matplotlib

我有以下代码:

#load in image
image = cv2.imread('lenna.png')
title = "foo"

ax = plt.axes([0,0,1,1])
ax.clear()
height, width = image.shape[:2]
ax.axis('off')
ax.set_title(title)

#some things plotted etc.

但是我需要将这个数字作为numpy数组进行进一步的计算,所以我正在做以下事情:

masked_image = image
ax.imshow(masked_image.astype(np.uint8),interpolation="nearest")
ax.figure.canvas.draw()
w,h = ax.figure.get_size_inches()*ax.figure.get_dpi()
I = np.fromstring(ax.figure.canvas.tostring_rgb(),dtype=np.uint8).reshape(int(h),int(w),3)

#Has the white borders around it
Image.fromarray(I)

然而,I现在仍然有白色边框,是否有一种简单的方法可以删除白色边框而不保存图形?

我使用的图像如下:

enter image description here

它周围没有任何白色边框

但是在上面的代码之后,它看起来如下: enter image description here

现在它周围有白条。

其他已经发布的解决方案都依赖于保存图像,我不想要

1 个答案:

答案 0 :(得分:3)

如果您保存图形并不重要。在图像周围没有空格需要满足两个条件。

1。图边距

您需要在轴和图形边缘之间没有空间。这可以通过设置subplot params

来实现
fig, ax = plt.subplots()
fig.subplots_adjust(0,0,1,1)

或通过手动设置轴位置

fig= plt.figure()
fig.add_axes([0,0,1,1])

后者是你在问题中采用的方法,所以这部分很好。

2。图方面

图像以相同的方式显示,这意味着每个像素都是平方的。这通常是图像所需要的,但它会导致轴不能同等地向两个方向扩展 您在这里遇到的问题是由于图形与图像具有不同的方面。

假设您有一个形状(n,m)m像素宽,n像素高)的图像;那么在图像周围没有空白的必要条件是

n/m == h/w

其中wh分别是图的宽度和高度。

因此,您可以直接将数字大小设置为数组形状乘以dpi,

fig, ax = plt.subplots(figsize=(m*100,n*100), dpi=100)

或任何其他倍数,以防输出中每个像素不需要一个像素。如果您根本不关心图形尺寸,但仍需要与图像具有相同方面的图形,您可以使用figaspect

figsize=plt.figaspect(image)

为了在此提供完整的工作示例,下面创建一个图像,其中图像周围没有空格。

import matplotlib.pyplot as plt
import numpy as np

a = np.random.rand(5,3)

fig, ax = plt.subplots(figsize=plt.figaspect(a))
fig.subplots_adjust(0,0,1,1)
ax.imshow(a)

plt.show()