plt.imsave saves image incorrectly

Viewed 2320

I am trying to generate the CLEVR dataset with some random images of rectangles and circle. When I am debugging the code for every plt.imshow() statement I can see a new image with the shape generated alongwith the shapes generated in the last executed loops. Although, to my surprise everytime the 5th image generated never shows during the debugging mode.

Also when I save the images locally I see only two objects. Please find the images for reference purposes.

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)

The image generated during debugging. Image generated during debugging

Image stored locally.

Image saved locally

Could anyone explain the issue here? Thanks

1 Answers

To save the image use cv2.imwrite():

cv2.imwrite('..\\img\\train\\img_' + str(loop) + '.jpeg', img)

Also to correctly save it with plt.imsave, you need to divide by 255:

plt.imsave('..\\img\\train\\img_' + str(loop) + '.jpeg', img/255.0)

or convert them to 'uint8':

img = img.astype('uint8')
plt.imsave('..\\img\\train\\img_' + str(loop) + '.jpeg', img)
Related