首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使彩色地图数字化

使彩色地图数字化
EN

Stack Overflow用户
提问于 2017-05-08 08:48:56
回答 2查看 1.4K关注 0票数 5

请考虑以下图像:

我想把它打印成灰度图像。我可以用scikit-image进行转换

代码语言:javascript
复制
from skimage.io import imread
from matplotlib import pyplot as plt
from skimage.color import rgb2gray


img = imread('image.jpg')

plt.grid(which = 'both')
plt.imshow(rgb2gray(img), cmap=plt.cm.gray)

我得到:

那就是显然不是我想要的

我的问题是:是否有一种使用scikit-image或原始numpy和/或mathplotlib实现图像数字化的方法,以便我得到一个3D数组(一维:X索引,第二维:y索引,三维:根据颜色地图的值)。然后,我可以很容易地改变到彩色地图,结果是有更好的结果时,打印在灰度?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-08 09:31:07

下面的示例演示了撤消彩色映射的value -> RGB映射的简单方法。

代码语言:javascript
复制
def unmap_nearest(img, rgb):
    """ img is an image of shape [n, m, 3], and rgb is a colormap of shape [k, 3]. """
    d = np.sum(np.abs(img[np.newaxis, ...] - rgb[:, np.newaxis, np.newaxis, :]), axis=-1)    
    i = np.argmin(d, axis=0)
    return i / (rgb.shape[0] - 1)

该函数的工作方式是获取每个像素的RGB值,并在彩色地图中查找最佳匹配颜色的索引。使用索引和广播的一些技巧可以有效地向量化(代价是花费在临时数组上的内存):

  • img[np.newaxis, ...]将图像从n,m,3转换为1,n,m,3
  • rgb[:, np.newaxis, np.newaxis, :]将颜色图从k,3转换为k,1,1,3。
  • 减去得到的数组,形成一个形状为k,n,m,3的数组,它对应着每个颜色分量的每个颜色映射指数k和像素n, m之间的差异。
  • sum(abs(..), axis=-1)取差值的绝对值,并对所有颜色分量(最后一维)求和,得到所有像素与彩色地图条目(形状为k,n,m的数组)之间的总差值。
  • i = np.argmin(d, axis=0)沿着第一维查找最小元素的索引。得到的结果是每个像素n,m的最佳匹配颜色图条目的索引。
  • return i / (rgb.shape[0] - 1)最终返回按颜色地图大小标准化的索引,以便结果在0-1范围内。

对于这种方法,一汽有一个警告:

  1. 它不能重建原始值范围。
  2. 它将把所有像素作为颜色地图的一部分来处理(例如,大陆轮廓也将被映射)。
  3. 如果您使用错误的颜色地图,它将失败令人高兴。

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt
from skimage.color import rgb2gray


def unmap_nearest(img, rgb):
    """ img is an image of shape [n, m, 3], and rgb is a colormap of shape [k, 3]. """
    d = np.sum(np.abs(img[np.newaxis, ...] - rgb[:, np.newaxis, np.newaxis, :]), axis=-1)    
    i = np.argmin(d, axis=0)
    return i / (rgb.shape[0] - 1)


cmap = plt.cm.jet
rgb = cmap(np.linspace(0, 1, cmap.N))[:, :3]


original = (np.arange(10)[:, None] + np.arange(10)[None, :])

plt.subplot(2, 2, 1)
plt.imshow(original, cmap='gray')
plt.colorbar()
plt.title('original')


plt.subplot(2, 2, 2)
rgb_img = cmap(original / 18)[..., :-1]
plt.imshow(rgb_img)
plt.title('color-mapped')

plt.subplot(2, 2, 3)
wrong = rgb2gray(rgb_img)
plt.imshow(wrong, cmap='gray')
plt.title('rgb2gray')

plt.subplot(2, 2, 4)
reconstructed = unmap_nearest(rgb_img, rgb)
plt.imshow(reconstructed, cmap='gray')
plt.colorbar()
plt.title('reconstructed')

plt.show()
票数 5
EN

Stack Overflow用户

发布于 2018-02-23 21:46:02

基于@kazemakmakase的回答,如果你正在数字化一个数字,你可能正在处理一个被转换的原件的副本,甚至可能在某个时候打印和扫描。这些东西可以扭曲原来使用的“真”彩色地图上的颜色。

您可以通过通过图形的颜色条中的切片作为“模式”(rgb)进行匹配来处理这一问题。具体来说,将图形裁剪到颜色坡道(在本例中为景观方向),然后将@kazemakmakase示例中的rgb变量替换为:

代码语言:javascript
复制
cmapimg = plt.imread('cropped_colorbar.png')
rgb = cmapimg[cmapimg.shape[0]/2,:,:3]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43843381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档