nvImageCodec batch processing examples#

[1]:
import os
import os.path
from matplotlib import pyplot as plt
from nvidia import nvimgcodec

Setting resource folder

[2]:
resources_dir = os.getenv("PYNVIMGCODEC_EXAMPLES_RESOURCES_DIR", "../assets/images/")

Load images

[3]:
image_paths = [resources_dir + "cat-1046544_640.jp2", resources_dir + "tabby_tiger_cat.jpg",
               resources_dir + "Weimaraner.bmp"]
batch_size = len(image_paths)

data_list = []
for p in image_paths:
    with open(p, 'rb') as in_file:
        data = in_file.read()
        data_list.append(data)

Create decoder

[4]:
dec = nvimgcodec.Decoder()

Decode data

[5]:
image_list = dec.decode(data_list)

Decode files

[6]:
image_list = dec.read(image_paths)

Show decoded images

[7]:
for img in image_list:
    print(img.__cuda_array_interface__)
    plt.figure()
    plt.imshow(img.cpu())
{'shape': (475, 640, 3), 'strides': None, 'typestr': '|u1', 'data': (13425796096, False), 'version': 3, 'stream': 1}
{'shape': (720, 720, 3), 'strides': None, 'typestr': '|u1', 'data': (13426708480, False), 'version': 3, 'stream': 1}
{'shape': (720, 720, 3), 'strides': None, 'typestr': '|u1', 'data': (13428263936, False), 'version': 3, 'stream': 1}
../_images/samples_batch_sample_13_1.png
../_images/samples_batch_sample_13_2.png
../_images/samples_batch_sample_13_3.png
[8]:
enc = nvimgcodec.Encoder()
[9]:
encoded_imgs = enc.encode(image_list, ".jpg")

Write data to file

[10]:
i = 0
for enc_img in encoded_imgs:
    out_file_name = os.path.splitext(os.path.basename(image_paths[i]))[0]+ "_out.jpg"
    with open(out_file_name, "wb") as out_file:
        out_file.write(enc_img)
    i+=1

Encode and write images to file in one write function

[11]:
out_file_names = [os.path.splitext(os.path.basename(p))[0] + "_out.jpg" for p in image_paths]
enc.write(out_file_names, image_list, ".jpg")
[11]:
['cat-1046544_640_out.jpg', 'tabby_tiger_cat_out.jpg', 'Weimaraner_out.jpg']

if we skip codec argument, files will be encoded to codec deducted based on file extension

[12]:
enc.write(out_file_names, image_list)
[12]:
['cat-1046544_640_out.jpg', 'tabby_tiger_cat_out.jpg', 'Weimaraner_out.jpg']

Decode multiple files in batches

[13]:
image_paths = [
    resources_dir + "Alex_2016-01-14_1300Z_(Geotiff).tif",
    resources_dir + "cat-1046544_640.jp2",
    resources_dir + "f-exif-8.jpg",
    resources_dir + "tabby_tiger_cat.jpg",
    resources_dir + "tiled-cat-1046544_640.jp2",
    resources_dir + "Weimaraner.bmp"]

batch_size = 3
file_name_batches = [image_paths[i: i + batch_size] for i in range(0, len(image_paths), batch_size)]
for file_name_batch in file_name_batches:
    #Alternatively, load data from each file and pass data_list to decode
    """data_list = []
    for path in file_name_batch:
        with open(path, "rb") as in_file:
            data_list.append(in_file.read())
    image_list = dec.decode(data_list)"""

    image_list = dec.read(file_name_batch)

    for img in image_list:
        h_img = img.cpu()
        plt.figure()
        plt.imshow(h_img)

../_images/samples_batch_sample_23_0.png
../_images/samples_batch_sample_23_1.png
../_images/samples_batch_sample_23_2.png
../_images/samples_batch_sample_23_3.png
../_images/samples_batch_sample_23_4.png
../_images/samples_batch_sample_23_5.png