Как раскрасить объекты на изображении разными цветами каждый - PullRequest
2 голосов
/ 21 марта 2020

У меня следующая проблема: у меня есть черно-белые изображения, которые я должен раскрасить: каждый белый «шарик» на изображении представляет собой экземпляр объекта, и я хочу покрасить каждый объект новым цветом, но для каждого изображения я хочу использовать одну и ту же цветовую схему:

Например:

  • 1-е изображение: 3 объекта -> используемые цвета: красный, зеленый, желтый
  • 2-е изображение: 2 объекта -> используемые цвета: красный, зеленый
  • 3-е изображение: 5 объектов -> используемые цвета: красный, зеленый, желтый, розовый, оранжевый

I ' Мы вручную раскрасили пару изображений, чтобы показать, как должен выглядеть результат:

Черно-белая маска, которую нужно раскрасить

image

2 объекта, 2 цвета: зеленый, желтый

image

4 объекта, 4 цвета: зеленый, желтый, красный, светло-серый

image

Чтобы сделать это автоматически, я попробовал подход здесь :

import scipy
from scipy import ndimage
import matplotlib.pyplot as plt
import matplotlib
from random import random

colors = [(1,1,1)] + [(random(),random(),random()) for i in xrange(255)]
new_map = matplotlib.colors.LinearSegmentedColormap.from_list('new_map', colors, N=256)

im = scipy.misc.imread('blobs.jpg',flatten=1)
blobs, number_of_blobs = ndimage.label(im)

plt.imshow(blobs, cmap=new_map)
plt.imsave('jj2.png',blobs, cmap=new_map)
plt.show()

Проблема в том, что что если я ру На моих изображениях объекты окрашиваются по-разному в зависимости от количества объектов на каждом изображении:

Например:

  • 1-е изображение: 3 объекта -> используемые цвета: красный, зеленый, желтый

  • 2-е изображение: 2 объекта -> используемые цвета: оранжевый, желтый

  • 3-е изображение: 5 объектов -> используемые цвета: красный, оранжевый, зеленый, салатовый, желтый

  • 4 изображение: 3 объекта -> использованные цвета: красный, зеленый, желтый

Вот несколько картинок для визуализации неправильной окраски 3-го изображения:

2 объекта, оранжевого и розового цвета

image

Еще одно изображение с 2 объектами, окрашенными в оранжевый и розовый цвета

image

Изображение с 3 объектами, теперь цвета меняются: оранжевый, желтый и зеленый (что мне нужно : оранжевый, розовый и новый цвет

image

1 Ответ

1 голос
/ 21 марта 2020

Поскольку вы генерируете случайную цветовую карту, неудивительно, что цвета не согласованы.

Вы хотите создать одну цветовую карту с выбранными цветами и передавать эту цветовую карту каждому изображению, независимо от количества капель настоящего. Обратите внимание, что по умолчанию цветовые карты нормализуются к диапазону ваших данных. Поскольку диапазон данных изменяется в зависимости от количества найденных больших двоичных объектов, вам необходимо явно установить нормализацию, используя vmin= и vmax. Вот демонстрация с использованием 4 разных изображений:

import imageio
from scipy import ndimage

colors = ['black','red', 'green', 'yellow', 'pink', 'orange']
vmin = 0
vmax = len(colors)
cmap = matplotlib.colors.ListedColormap(colors)


fig, axs = plt.subplots(4,1, figsize=(3,3*4))
for file,ax in zip(['test1.png','test2.png','test3.png','test4.png'], axs):
    im = imageio.imread(file)
    blobs, number_of_blobs = ndimage.label(im)
    ax.imshow(blobs, cmap=cmap, vmin=vmin, vmax=vmax)

enter image description here

...