Convert an rgb mask image to coco json format
Closed this issue · 4 comments
I annotated images using PixelAnnotationTool provided here: https://github.com/abreheret/PixelAnnotationTool and using the provided dictionary:
{ "labels": { "unlabeled": { "categorie": "void", "color": [ 0, 0, 0 ], "id": 0, "id_categorie": 0, "name": "unlabeled" }, "bicycle_motorcycle": { "categorie": "bicycle_motorcycle", "color": [ 119, 11, 32 ], "id": 1, "id_categorie": 1, "name": "bicycle_motorcycle" }, "bus": { "categorie": "bus", "color": [ 102, 51, 0 ], "id": 2, "id_categorie": 2, "name": "bus" }, "truck": { "categorie": "truck", "color": [ 0, 0, 70 ], "id": 3, "id_categorie": 3, "name": "truck" }, "pedestrian": { "categorie": "pedestrian", "color": [ 0, 2, 180 ], "id": 4, "id_categorie": 4, "name": "pedestrian" }, "car": { "categorie": "car", "color": [ 0, 180, 0 ], "id": 5, "id_categorie": 5, "name": "car" }, "out_of_roi": { "categorie": "out_of_roi", "color": [ 0, 0, 0 ], "id": 6, "id_categorie": 6, "name": "out_of_roi" } } }
I want to convert these RGB masks into json polygon format so that I can use them in Mask R-CNN: I posted this question in stackoverflow here: https://stackoverflow.com/questions/54802089/convert-an-rgb-mask-image-to-coco-json-polygon-format
Here's a python function that will take in a mask Image object and return a dictionary of sub-masks, keyed by RGB color.
from PIL import Image # (pip install Pillow)
def create_sub_masks(mask_image):
width, height = mask_image.size
# Initialize a dictionary of sub-masks indexed by RGB colors
sub_masks = {}
for x in range(width):
for y in range(height):
# Get the RGB values of the pixel
pixel = mask_image.getpixel((x,y))[:3]
# If the pixel is not black...
if pixel != (0, 0, 0):
# Check to see if we've created a sub-mask...
pixel_str = str(pixel)
sub_mask = sub_masks.get(pixel_str)
if sub_mask is None:
# Create a sub-mask (one bit per pixel) and add to the dictionary
# Note: we add 1 pixel of padding in each direction
# because the contours module doesn't handle cases
# where pixels bleed to the edge of the image
sub_masks[pixel_str] = Image.new('1', (width+2, height+2))
# Set the pixel value to 1 (default is 0), accounting for padding
sub_masks[pixel_str].putpixel((x+1, y+1), 1)
return sub_masks
@jsbroks Thanks a lot for the reponse, How to convert these mask to json coco annotation?