我有以下代码:
#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
现在仍然有白色边框,是否有一种简单的方法可以删除白色边框而不保存图形?
我使用的图像如下:
它周围没有任何白色边框
现在它周围有白条。
其他已经发布的解决方案都依赖于保存图像,我不想要
答案 0 :(得分:3)
如果您保存图形并不重要。在图像周围没有空格需要满足两个条件。
您需要在轴和图形边缘之间没有空间。这可以通过设置subplot params
来实现fig, ax = plt.subplots()
fig.subplots_adjust(0,0,1,1)
或通过手动设置轴位置
fig= plt.figure()
fig.add_axes([0,0,1,1])
后者是你在问题中采用的方法,所以这部分很好。
图像以相同的方式显示,这意味着每个像素都是平方的。这通常是图像所需要的,但它会导致轴不能同等地向两个方向扩展 您在这里遇到的问题是由于图形与图像具有不同的方面。
假设您有一个形状(n,m)
(m
像素宽,n
像素高)的图像;那么在图像周围没有空白的必要条件是
n/m == h/w
其中w
,h
分别是图的宽度和高度。
因此,您可以直接将数字大小设置为数组形状乘以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()