我有一个代码可以将图片分解为多个部分,我想将它们一起打印出来(它们之间有一个很小的空间),但是要保留相同的尺寸,以便仍然清晰可见整个图像。
def crop_image(img, quadrant):
img = img_to_array(img)
d = img.shape
rows = int(d[0]*2/3)
cols = int(d[1]*2/3)
q = {"TL": img[:rows,:cols,:],
"TR": img[:rows,cols:,:],
"BL": img[rows:,:cols,:],
"BR": img[rows:,cols:,:]}
return array_to_img(q[quadrant])
img = load_img('./example1.jpeg', target_size=(224, 224))
cropped = crop_image(img, 'TR')
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2,2)
ax1.imshow(crop_image(img, 'TL'))
ax1.axis('off')
ax2.imshow(crop_image(img, 'TR'))
ax2.axis('off')
ax3.imshow(crop_image(img, 'BL'))
ax3.axis('off')
ax4.imshow(crop_image(img, 'BR'))
ax4.axis('off')
fig.subplots_adjust(hspace=0.1)
plt.tight_layout()
答案 0 :(得分:1)
子图的高度和宽度之比必须恰好是图中各个部分的行数和列数之比。
这可以通过使用的gridspec的height_ratios
和width_ratios
参数来实现。
import matplotlib.pyplot as plt
img = plt.imread("https://i.stack.imgur.com/9qe6z.png")
d = img.shape
rows = int(d[0]*2/3)
cols = int(d[1]*2/3)
q = {"TL": img[:rows,:cols,:],
"TR": img[:rows,cols:,:],
"BL": img[rows:,:cols,:],
"BR": img[rows:,cols:,:]}
kw = dict(height_ratios=[rows, d[0]-rows], width_ratios=[cols, d[1]-cols])
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2,2, gridspec_kw=kw)
ax1.imshow(q['TL'])
ax2.imshow(q['TR'])
ax3.imshow(q['BL'])
ax4.imshow(q['BR'])
for ax in (ax1, ax2, ax3, ax4):
ax.axis("off")
fig.subplots_adjust(hspace=0.1)
plt.show()