如何解决Python中图像和绘图之间的不对齐问题?

Dav*_*vid 1 python pdf matplotlib

我的目标是显示二值图像,然后将边界轮廓绘制为覆盖图像的线。如果我这样做并将结果导出为 PDF,当人们从左下角移过图像时,我会看到图像和轮廓之间的错位逐渐恶化。因此,背景图像或轮廓的位置似乎存在乘法误差。

我认为这个问题是由 PDF 渲染器引起的。如果我以非常高的 DPI 以 PNG 格式输出结果,我可以解决该问题,但由于其他原因我更喜欢 PDF。有谁知道我是否可以更改设置以使 PDF 正确渲染?

这是一个示例和生成的图像。您可以看到左下角图像和轮廓之间的对齐情况良好,右上角最差。

import numpy as np
import matplotlib.pyplot as plt
import cv2

# Make a test image
img = np.zeros((100,100), dtype=np.uint8)
img[20:99,1:80] = 1
img = np.matlib.repmat(img, 9, 6)

# Extract contours
cntrs, hier = cv2.findContours(img, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)

# Make overlay
fig = plt.figure(figsize=(6,9), dpi=300)
ax = fig.add_subplot()
ax.imshow(img, interpolation='none', cmap=plt.cm.gray)
for cntr in cntrs:
    x = np.append(cntr[:, 0, 0], cntr[0, 0, 0])
    y = np.append(cntr[:, 0, 1], cntr[0, 0, 1])
    ax.plot(x, y, c='r', linewidth=0.5, alpha=0.7)
ax.axis('off')

# Save overlay
plt.savefig('test.pdf', dpi=fig.dpi)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Ste*_*tef 5

您可以使用pgf后端而不是默认的pdf后端:

\n
plt.savefig(\'test.pdf\', dpi=fig.dpi, backend=\'pgf\')\n
Run Code Online (Sandbox Code Playgroud)\n

这给出了与 png 文件相同的正确 pdf:链接到生成的 pdf 文件

\n

在此输入图像描述

\n
\n不匹配的原因是图像的缩放比例不同:虽然 pdf 和 pgf 后端之间的红线位置差异最大为 2.6 \xc2\xb5m (即视觉上无法辨别),但图像尺寸相差约 0.3 mm: \n

pdf:115.358 x 172.861 毫米,左下角位于 20.574 / 28.575 毫米,
\npgf:115.057 x 172.606 毫米,左下角位于 20.574 / 28.606 毫米。

\n