Средний цвет среза суперпикселя - PullRequest
0 голосов
/ 05 ноября 2018

Я хочу сегментировать изображение, используя разрезанные суперпиксели, а затем заменить исходный цвет суперпикселя средним цветом указанного суперпикселя.

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)

Я получаю ошибку ValueError: Label and intensity image must have thesame shape. Форма сегментов (512,512) и img (512,512,3). Как правильно использовать regionprops в моем случае?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Я последовал первой рекомендации принятого ответа. Рабочая версия моего кода:

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

0 голосов
/ 05 ноября 2018

Согласно документации , regionprops может только определять количество серого изображения и не будет работать с цветом.

Простым решением было бы измерить среднюю интенсивность в каждом канале отдельно и объединить результаты:

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

Используя PyDIP это можно сделать довольно просто (отказ от ответственности: я автор):

import PyDIP as dip

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

output of code above

...