去除保存图像周围的空白空间。

323

我需要获取一张图片并在处理后保存它。当我显示这个图像时,它看起来很好,但是在保存图像之后,图像周围出现了一些白色空间。我已经尝试使用'tight'选项和savefig方法,但都没能解决问题。代码如下:

import matplotlib.image as mpimg
import matplotlib.pyplot as plt

fig = plt.figure(1)
img = mpimg.imread("image.jpg")
plt.imshow(img)
ax = fig.add_subplot(1, 1, 1)

extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('1.png', bbox_inches=extent)

plt.axis('off') 
plt.show()

我正在尝试使用NetworkX在图形上绘制基本图形并保存它。我发现在没有图形的情况下它可以工作,但是一旦添加了图形,保存的图像周围就会出现白色空间;

import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import networkx as nx

G = nx.Graph()
G.add_node(1)
G.add_node(2)
G.add_node(3)
G.add_edge(1, 3)
G.add_edge(1, 2)
pos = {1:[100, 120], 2:[200, 300], 3:[50, 75]}

fig = plt.figure(1)
img = mpimg.imread("image.jpg")
plt.imshow(img)
ax = fig.add_subplot(1, 1, 1)

nx.draw(G, pos=pos)

extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('1.png', bbox_inches=extent)

plt.axis('off') 
plt.show()

15个回答

4

对于想要在像素而非英寸上工作的人来说,这将起作用。

此外,您还需要通常所需的内容。

from matplotlib.transforms import Bbox

接着您可以使用以下内容:

my_dpi = 100 # Good default - doesn't really matter

# Size of output in pixels
h = 224
w = 224

fig, ax = plt.subplots(1, figsize=(w/my_dpi, h/my_dpi), dpi=my_dpi)

ax.set_position([0, 0, 1, 1]) # Critical!

# Do some stuff
ax.imshow(img)
ax.imshow(heatmap) # 4-channel RGBA
ax.plot([50, 100, 150], [50, 100, 150], color="red")

ax.axis("off")

fig.savefig("saved_img.png",
            bbox_inches=Bbox([[0, 0], [w/my_dpi, h/my_dpi]]),
            dpi=my_dpi)

enter image description here


1
你不必指定dpi,可以使用默认值 fig.dpi - intsco

2
所以解决方案取决于您是否调整了子图。如果您指定plt.subplots_adjust(top,bottom,right,left),则不要在plt.savefig中使用bbox_inches ='tight'的kwargs,因为它会产生矛盾的空白填充。它还允许您将图像保存为与输入图像相同的尺寸(600x600输入图像保存为600x600像素的输出图像)。
如果您不关心输出图像大小的一致性,则可以省略plt.subplots_adjust属性,并只使用bbox_inches ='tight'和pad_inches = 0的kwargs与plt.savefig一起使用。
此解决方案适用于matplotlib版本3.0.1、3.0.3和3.2.1。当您有多个子图时也适用(例如plt.subplots(2,2,...)。
def save_inp_as_output(_img, c_name, dpi=100):
    h, w, _ = _img.shape
    fig, axes = plt.subplots(figsize=(h/dpi, w/dpi))
    fig.subplots_adjust(top=1.0, bottom=0, right=1.0, left=0, hspace=0, wspace=0) 
    axes.imshow(_img)
    axes.axis('off')
    plt.savefig(c_name, dpi=dpi, format='jpeg') 

0
在Jupyter笔记本中,可以添加这行代码:
%config InlineBackend.print_figure_kwargs = {'pad_inches':0}

这里是一个最简示例

import matplotlib.pyplot as plt
import numpy as np

%config InlineBackend.print_figure_kwargs = {'pad_inches':0}

fig, ax = plt.subplots()
ax.axis("off")
ax.imshow(np.fromfunction(lambda i, j: np.sin(j), (15, 15)), cmap="YlGnBu")

enter image description here


0
你可以试试这个。它解决了我的问题。
import matplotlib.image as mpimg
img = mpimg.imread("src.png")
mpimg.imsave("out.png", img, cmap=cmap)

-4

这对我有用,可以将使用imshow绘制的numpy数组保存到文件中

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10,10))
plt.imshow(img) # your image here
plt.axis("off")
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, 
        hspace = 0, wspace = 0)
plt.savefig("example2.png", box_inches='tight', dpi=100)
plt.show()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接