繁体   English   中英

如何使用Python更改轮廓的颜色(从非Python获取)?

[英]How can I change colors in contours (obtained from non-Python) with Python?

我正在尝试转换从非Python应用程序生成的轮廓的颜色图。 我尝试使用此处提供的Matthias Bussonnier的代码,但无法完全转换。 我试图截断颜色图以进行完整的转换,但再次没有提供完整的转换。

微机

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.colors as colors
import matplotlib.image as mpimg
from scipy.spatial import cKDTree
import matplotlib


import matplotlib.cm as mplcm

def truncate_colormap(cmap, minval=0.0, maxval=1.0, n=100):
    new_cmap = colors.LinearSegmentedColormap.from_list(
        'trunc({n},{a:.2f},{b:.2f})'.format(n=cmap.name, a=minval, b=maxval),
        cmap(np.linspace(minval, maxval, n)))
    return new_cmap
cmap = plt.get_cmap('jet')
cmap = truncate_colormap(cmap, 0.1, 0.9)
img = mpimg.imread('./test.png')[:,:,:3]

#@interact(sub=(0, 500), d=(0,1,0.05))
def convert(sub=256,d=0.1, cin=cmap, cout='viridis'):
    viridis = plt.get_cmap(cout)
    jet = plt.get_cmap(cin)
    jet256 = colors.makeMappingArray(sub, jet)[:, :3]
    K = cKDTree(jet256)
    oshape = img.shape
    img_data = img.reshape((-1,3))
    res = K.query(img_data, distance_upper_bound=d)
    indices = res[1]
    l = len(jet256)
    indices = indices.reshape(oshape[:2])
    remapped = indices

    indices.max()

    mask = (indices == l)

    remapped = remapped / (l-1)
    mask = np.stack( [mask]*3, axis=-1)

    blend = np.where(mask, img, viridis(remapped)[:,:,:3])
    fig, ax = plt.subplots()
    fig.set_figheight(10)
    fig.set_figwidth(10)
    ax.imshow(blend)
    fig.savefig('viridize.pdf')
convert()    

输入图像

在此处输入图片说明

输出图像

在此处输入图片说明

如何使用Python将颜色图(在这种情况下为喷射色)完全转换为viridis?

如前所述,“ 如何指定如何将彩虹配色方案转换为灰度”中的解决方案将起作用,但需要进行一些小的修改。

也就是说,您需要将目标颜色图应用到该解决方案获得的值,然后将结果数组大小修改为3D。

这项工作的条件是:

  • 您知道使用( origin_cmap )生成原始图像的颜色图
  • 该图像中的所有颜色均为灰度(轴,文本等)或该origin_cmap一部分。 也就是说,图中不应有任何其他折线图或类似的线图。
  • 原始颜色图是明确的,即不包含两次相同的颜色。
  • 原始色彩图的整个范围已用于创建输入图像,并且将针对目标色彩图的整个范围。 (这种情况可以在需要时被虽然weakend,通过指定一个不同的norm和/或r安格)

因此,以下内容将“验证”给定的图像。

import numpy as np
import matplotlib.colors
import matplotlib.pyplot as plt

image = plt.imread("https://i.stack.imgur.com/NyLq2.png")

def changecolormap(image, origin_cmap, target_cmap):
    r = np.linspace(0,1, 256)
    norm = matplotlib.colors.Normalize(0,1)
    mapvals = origin_cmap(norm(r))[:,:3]

    def get_value_from_cm(color):
        color=matplotlib.colors.to_rgb(color)
        #if color is already gray scale, dont change it
        if np.std(color) < 0.1:
            return color
        #otherwise return value from colormap
        distance = np.sum((mapvals - color)**2, axis=1)
        return target_cmap(r[np.argmin(distance)])[:3]

    newim = np.zeros_like(image)
    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            c = image[i,j,:3]
            newim[i,j, :3] =  get_value_from_cm(c)
    return newim


fig, (ax,ax2) = plt.subplots(ncols=2)
ax.imshow(image)
ax2.imshow(changecolormap(image, plt.cm.jet, plt.cm.viridis))

ax.axis("off")
ax2.axis("off")
plt.show()

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM