如何为图像中的对象着色每个颜色不同
How to color objects in an image with different color each
我遇到以下问题:
我有 black/white 图像,我必须给它们着色:图像中的每个白色 "blob" 代表一个对象的实例,我想用新颜色为每个对象着色,但是对于我想要的每个图像使用相同的配色方案:
例如:
- 第一张图片:3 个对象 -> 使用的颜色:红色、绿色、黄色
- 第二张图片:2 个对象 -> 使用的颜色:红色、绿色
- 第三张图片:5 个对象 -> 使用的颜色:红色、绿色、黄色、粉色、橙色
我手动给几张图片上色以显示结果应该是什么样子:
需要上色的黑/白面具
2 个对象,2 种颜色:绿色、黄色
4 个物体,4 种颜色:绿色、黄色、红色、浅灰色
为了自动完成,我已经尝试了 here:
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()
问题是,如果我 运行 在我的图像上,对象会根据每个图像中有多少对象而得到不同的颜色:
例如:
第一张图片:3 个对象 -> 使用的颜色:红色、绿色、黄色
第二张图片:2 个对象 -> 使用的颜色:橙色、黄色
第 3 张图片:5 个对象 -> 使用的颜色:红色、橙色、绿色、柠檬绿、黄色
第 4 张图片:3 个对象 -> 使用的颜色:红色、绿色、黄色
这里有一些图片可以形象化第三张图片的不正确着色:
2 个对象,颜色为橙色和粉色
另一张有 2 个对象的图像,颜色为橙色和粉色
包含 3 个对象的图像,现在颜色发生变化:橙色、黄色和绿色(我需要的是:橙色、粉色和新颜色
由于您生成的是随机颜色图,因此颜色不一致也就不足为奇了。
您想用您选择的颜色创建一个颜色图,并将该颜色图传递给每个图像,而不管存在的斑点数量。但请注意,默认情况下,颜色图已标准化为数据范围。由于数据范围会根据找到的 blob 数量而变化,因此您需要使用 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)
我遇到以下问题: 我有 black/white 图像,我必须给它们着色:图像中的每个白色 "blob" 代表一个对象的实例,我想用新颜色为每个对象着色,但是对于我想要的每个图像使用相同的配色方案:
例如:
- 第一张图片:3 个对象 -> 使用的颜色:红色、绿色、黄色
- 第二张图片:2 个对象 -> 使用的颜色:红色、绿色
- 第三张图片:5 个对象 -> 使用的颜色:红色、绿色、黄色、粉色、橙色
我手动给几张图片上色以显示结果应该是什么样子:
需要上色的黑/白面具
2 个对象,2 种颜色:绿色、黄色
4 个物体,4 种颜色:绿色、黄色、红色、浅灰色
为了自动完成,我已经尝试了 here:
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()
问题是,如果我 运行 在我的图像上,对象会根据每个图像中有多少对象而得到不同的颜色:
例如:
第一张图片:3 个对象 -> 使用的颜色:红色、绿色、黄色
第二张图片:2 个对象 -> 使用的颜色:橙色、黄色
第 3 张图片:5 个对象 -> 使用的颜色:红色、橙色、绿色、柠檬绿、黄色
第 4 张图片:3 个对象 -> 使用的颜色:红色、绿色、黄色
这里有一些图片可以形象化第三张图片的不正确着色:
2 个对象,颜色为橙色和粉色
另一张有 2 个对象的图像,颜色为橙色和粉色
包含 3 个对象的图像,现在颜色发生变化:橙色、黄色和绿色(我需要的是:橙色、粉色和新颜色
由于您生成的是随机颜色图,因此颜色不一致也就不足为奇了。
您想用您选择的颜色创建一个颜色图,并将该颜色图传递给每个图像,而不管存在的斑点数量。但请注意,默认情况下,颜色图已标准化为数据范围。由于数据范围会根据找到的 blob 数量而变化,因此您需要使用 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)