Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 909
Steve Emman Avatar asked Oct 28 '25 04:10

Steve Emman


1 Answers

I followed the first recommendation of the accepted answer. Working version of my code :

import matplotlib.pyplot as plt
from skimage.segmentation import slic
from skimage.data import astronaut
from skimage.measure import regionprops

def paint_region_with_avg_intensity(rp, mi, channel):
    for i in range(rp.shape[0]):
        img[rp[i][0]][rp[i][1]][channel] = mi

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

for i in range(3):
    regions = regionprops(segments, intensity_image=img[:,:,i])
    for r in regions:
        paint_region_with_avg_intensity(r.coords, int(r.mean_intensity), i)

plt.imshow(img)
plt.show()

enter image description here

like image 177
Steve Emman Avatar answered Oct 30 '25 14:10

Steve Emman