pythonimage-processingscikit-imagesuperpixels

Average colour of slic superpixel


I want to segment an image using slic superpixels and then replace the original colour of a superpixel with the average colour of said superpixel.

import numpy as np
import matplotlib.pyplot as plt
from skimage import io
from skimage.segmentation import slic, mark_boundaries
from skimage.data import astronaut
from skimage.measure import regionprops

img = astronaut()
segments = slic(img, n_segments=512, compactness=10,
            multichannel=True,
            enforce_connectivity=True,
            convert2lab=True)
regions = regionprops(segments, intensity_image=img)

I get the errorValueError: Label and intensity image must have thesame shape. Segments shape is (512,512) and img shape in (512,512,3). What is the correct use of regionprops in my case?


Solution

  • According to the documentation, regionprops can only quantify a grey-value image, and won't work for color.

    A simple solution would be to measure average intensity in each channel separately, and combine the results:

    out = np.empty_like(img)
    for ii in range(3):
       regions = regionprops(segments, intensity_image=img[:,:,ii])
       # paint, and write to out[:,:,ii]
    

    Using DIPlib this can be done quite simply (disclaimer: I'm an author):

    import diplib as dip
    
    segments = segments.astype('uint32')  # 64-bit types not accepted by DIPlib
    msr = dip.MeasurementTool.Measure(segments, img, ['Mean'])
    out = dip.ObjectToMeasurement(segments, msr['Mean'])
    out.Show()
    

    output of code above