解决matplotlib画图去除非常多的白色边框

解决matplotlib画图去除非常多的白色边框

本文说明

本博文旨在说明为什么plt绘图会存在很多白边,并且给出如何去除白边的方法。

为什么matplotlib画图会默认有很多白色边框?

Matplotlib 的默认行为是在图像周围留出一些空白边框,以确保图像的完整性和可读性。这些边框被称为 “whitespace”,也称为 “padding” 或 “margin”。

默认情况下,Matplotlib 在创建 Figure 对象时会为其添加一些默认的空白边框。这些边框可以通过调整 Figure 对象的大小和位置来控制。在使用 “subplots” 方法创建多个子图时,Matplotlib 会自动计算每个子图的位置和大小,并添加适当的空白边框,以保证子图之间有足够的间距和边框。

绘图

我们使用如下两幅图作为例子。
在这里插入图片描述
在这里插入图片描述

默认绘图

默认绘图如下,使两幅图在一个画框中显示。

import cv2
import matplotlib.pyplot as plt

# 读取图像并将其转换为 RGB 颜色空间
img_1 = cv2.imread('img.png')
img_1 = cv2.cvtColor(img_1, cv2.COLOR_BGR2RGB)

img_2 = cv2.imread('soft.png')
img_2 = cv2.cvtColor(img_2, cv2.COLOR_BGR2RGB)

# 创建一个包含两个子图的 Figure 对象
fig, axs = plt.subplots(1, 2, figsize=(10, 5))

# 在左侧的子图中显示第一幅图像
axs[0].imshow(img_1)
axs[0].set_title('Blur')

# 在右侧的子图中显示第二幅图像
axs[1].imshow(img_2)
axs[1].set_title('Sharp')

#------------------ 默认保存图像--------------------------------------
plt.savefig('coup.png', dpi=300)

# 显示图像
plt.show()

保存的图像如下所示,我这个是截图展示,否则全部是白屏,看不出白边。

在这里插入图片描述

去除白边方法一,修改保存图像的代码

取消白边

如果有时候图片小,白边占比非常多,我们应该怎么去除呢,实际上很简单,修改默认保存的图像代码就可以了,改为如下所示。

plt.savefig('coup1.png', bbox_inches='tight', pad_inches=0.0, dpi=300)

此代码参数说明:

  • “plt”:表示 matplotlib.pyplot 模块的别名,它包含了许多绘制图形、设置图形属性和保存图形的函数。
  • “savefig”:表示保存图形函数,用于将当前绘制的图形保存为文件。
  • “coup1.png”:表示要保存的文件名,可以是任何有效的文件名,包括路径和扩展名。
  • “bbox_inches=‘tight’”:表示要保存的图像边界框,这里设置为 “tight”,意味着要紧密地裁剪图像周围的空白边距。
  • “pad_inches=0.0”:表示图像周围的空白边距大小,这里设置为 0.0,表示不添加额外的空白边距。
  • “dpi=300”:表示图像的分辨率,这里设置为 300 DPI,即每英寸包含 300 个像素。

此时重新运行代码,即可看到保存的图像如下,白边几乎全部消失,边框紧挨着图像。

在这里插入图片描述

略微增加白边

如果感觉边框又太挤了,可以修改pad_inches参数,可以修改为0.2试一下,修改之后如下所示。可以根据自己的喜好,调整白边的大小以符合自己的要求

在这里插入图片描述

去除白边方法二,修改显示图像的代码

把代码改为如下所示,这个tight_layout会自动调整图像的白边布局,自己试一下把。

import cv2
import matplotlib.pyplot as plt

# 读取图像并将其转换为 RGB 颜色空间
img_1 = cv2.imread('img.png')
img_1 = cv2.cvtColor(img_1, cv2.COLOR_BGR2RGB)

img_2 = cv2.imread('soft.png')
img_2 = cv2.cvtColor(img_2, cv2.COLOR_BGR2RGB)

# 创建一个包含两个子图的 Figure 对象
fig, axs = plt.subplots(1, 2, figsize=(10, 5))

# 在左侧的子图中显示第一幅图像
axs[0].imshow(img_1)
axs[0].set_title('Blur')

# 在右侧的子图中显示第二幅图像
axs[1].imshow(img_2)
axs[1].set_title('Sharp')

#-------------------------下面这一行是新增的--------------------------#
plt.tight_layout()

#------------------ 默认保存图像-------------------------------------#
plt.savefig('coup.png', dpi=300)

# 显示图像
plt.show()

也可以修改tight_layout的参数。

Matplotlib 的 “tight_layout” 方法有一些可选的参数,可以用来调整图像边框的大小和间距。下面是 “tight_layout” 方法的参数列表:

  • pad: 控制子图之间的距离,默认为 1.08。
  • h_pad: 控制水平方向上的子图之间的距离,默认为 0.0。
  • w_pad: 控制垂直方向上的子图之间的距离,默认为 0.0。
  • rect: 可选的参数,用于指定图像的区域,格式为左、下、右、上的四元组,取值范围为 0 到 1。

您可以根据需要制定不同的参数值,以获得适合您的图像的边框大小和间距。以下是一个示例代码:

import cv2
import matplotlib.pyplot as plt

# 读取图像并将其转换为 RGB 颜色空间
blur = cv2.imread('blur_image.jpg')
blur = cv2.cvtColor(blur, cv2.COLOR_BGR2RGB)

sharp = cv2.imread('sharp_image.jpg')
sharp = cv2.cvtColor(sharp, cv2.COLOR_BGR2RGB)

# 在两个子图中显示图像
plt.subplot(121), plt.imshow(blur)
plt.subplot(122), plt.imshow(sharp)

# 调整图像边框的大小和间距
plt.tight_layout(pad=0.4, h_pad=1.0, w_pad=1.0, rect=[0, 0, 0.9, 1])

# 显示图像
plt.show()

在这个代码中,我们使用 “tight_layout” 方法的 “pad” 参数将子图之间的距离设置为 0.4;使用 “h_pad” 和 “w_pad” 参数将水平和垂直方向上的子图间距都设置为 1.0;使用 “rect” 参数将图像区域设置为左边 90% 的位置。您可以根据需要调整这些参数的值,以适应您的图像和显示需求。

请注意,如果您同时使用了 “tight_layout” 和 “subplots_adjust” 方法来调整图像边框大小和间距,可能会导致这些方法的效果相互冲突,因此您需要根据具体情况进行选择和调整。

请注意,调用 “tight_layout” 方法只会调整图像边框的大小,而不会改变图像本身的大小或比例。如果您需要调整图像的比例或大小,可以使用其他的方法或工具实现。

总结

通过本文可以去除plt绘图的白边,也可以根据自己的喜好添加白边的多少。

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百年孤独百年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值