plt.imsave保存图像时出现错误。

3
我正在尝试使用一些矩形和圆形的随机图像生成CLEVR数据集。当我在调试代码时,每次出现plt.imshow()语句时,我都会看到一个新的带有形状的图像,并且该图像中包含了上次执行循环时生成的形状。但令我惊讶的是,每次调试模式下生成的第5个图像从未显示。

此外,当我将图像保存到本地时,我只能看到两个对象。请参考附带的图片。

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

colors = [
    (0, 0, 255),      # r
    (0, 255, 0),      # g
    (255, 0, 0),      # b
    (0, 156, 255),    # o
    (128, 128, 128),  # k
    (0, 255, 255)     # y
]

img_size = 75
size = 5

def center_generate(objects):
    while True:
        pas = True
        center = np.random.randint(0+size, img_size - size, 2)        
        if len(objects) > 0:
            for name, c, shape in objects:
                """this condition checks if the new object generated is not completely covered by the already 
            generated objects"""
                if ((center - c) ** 2).sum() < ((size * 2) ** 2):
                    pas = False
        if pas:
            return center

def build_dataset(dataset_type, loopnumber):
    objects = []
    img = np.ones((img_size, img_size, 3)) * 255
    for color_id, color in enumerate(colors):
        center = center_generate(objects)
        if random.random() < 0.5:
            start = (center[0]-size, center[1]-size)
            end = (center[0]+size, center[1]+size)
            img = cv2.rectangle(img, start, end, color, -1)
            plt.imshow(img)
            objects.append((color_id, center, 'r'))
        else:
            center_ = (center[0], center[1])
            img = cv2.circle(img, center_, size, color, -1)
            plt.imshow(img)
            objects.append((color_id, center, 'c'))

        if dataset_type == 'test':
            plt.imsave('..\\img\\test\\img_' + str(loop) + '.jpeg', img)
        else:
            plt.imsave('..\\img\\train\\img_' + str(loop) + '.jpeg', img)

在调试期间生成的图像。 调试期间生成的图像

图像已本地存储。

本地保存的图像

请问有人能解释一下这里的问题吗? 谢谢


img_size和center_generate是什么? - Mohit Motwani
@MohitMotwani 图像大小为75,center_generate只是一个生成对象中心的函数。我将在问题中更新center_generate代码。 - Rishik Mani
1个回答

2
为保存图像,请使用cv2.imwrite(): 最初的回答
cv2.imwrite('..\\img\\train\\img_' + str(loop) + '.jpeg', img)

同时,为了使用plt.imsave正确保存图像,你需要除以255
plt.imsave('..\\img\\train\\img_' + str(loop) + '.jpeg', img/255.0)

或者将它们转换为'uint8':
img = img.astype('uint8')
plt.imsave('..\\img\\train\\img_' + str(loop) + '.jpeg', img)

非常感谢。您能告诉我为什么除以255会发生这种情况吗? - Rishik Mani
其实我也不确定。我在谷歌上搜索了一下,然后通过一些试错来解决问题。 - Mohit Motwani
2
好的,没问题。我会尽力找到它的。无论如何,谢谢你! - Rishik Mani

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