【图像处理】如何使用matplotlib 库显示灰度图像为自定义颜色

项目场景

我这里有一张名为airplane.jpg的灰度图像灰度图像image
使用 matplotlib 库读取并显示:

import matplotlib.pyplot as plt

root="D:\Python\数据集VOC2007\SegmentationClass"
fname=r"\2007_000033"
#带坐标和像素值!!好极了
im = plt.imread('%s/%s.png' % (root, fname))
plt.imshow(im)
plt.show()

显示结果如下:
image

问题描述

如上图,显示的是紫色的图片,且这是两种不同的紫色。如果不喜欢紫色,并且希望这两种颜色区分更加明显,那么该怎么实现呢?

原因分析

根据官方文档可知:
image
matplotlib.pyplot.imshow 有一个 cmap 参数,用该参数来控制图像显示色彩。对于 RGB 或 RGBA 图像忽略该参数,即直接显示原图。而对于单通道的灰度图像,默认色彩是viridis(翠绿)。因此,设置 cmap 参数的值即可正确显示灰度图像,可接受的输入类型为字符串或者 Corlormap 对象。

解决方案

import matplotlib.pyplot as plt
plt.imshow(plt.imread('camera.jpg'), cmap='gray')
plt.show()

或:

import matplotlib.pyplot as plt
plt.imshow(plt.imread('camera.jpg'), plt.cm.gray)
plt.show()

在matplotlib中自定义colormap

颜色的定义

在matplotlib中预定义了大量的颜色,如我们熟悉的简写‘b’代表blue,‘r’代表red,‘k’代表black等。除了这些色彩外,其实还有一些预定义的颜色可以参考下面的网页。List of named colors
当然如果这些预定义的颜色也还不满足你的需求,在matplotlib中,任何设置color的地方,都可以使用RGB或者RGBA以及16进制表示颜色。以RGB为例,一般的RGB是三个0-255的数值组成,这里用0-1的小数表示,例如:
color = (1,0,0) #红色

自定义调色板

这里提供一种最简单的方案使用 LinearSegmentedColormap.from_list函数。首先定义一组颜色,如下:


'''自定义灰度图调色板'''
from pylab import *
from matplotlib.colors import LinearSegmentedColormap
clist=[(1,0,0),(0,1,0),(0,0,1),(1,0.5,0),(1,0,0.5),(0.5,1,0)]
newcmp = LinearSegmentedColormap.from_list('chaos',clist)

root="D:\Python\数据集VOC2007\SegmentationClass"
fname=r"\2007_000033"

# 带坐标和像素值!!好极了
im = plt.imread('%s/%s.png' % (root, fname))
print(im[56,322],im[132,151])
plt.imshow(im,cmap=newcmp)
plt.show()

最后看一下效果:
image
当然这里重点不是看审美。特别是clist中的色彩完全可以用rgb或者是16进制,因此搭配方式会非常地多。
通过上面的了解,基本上可以调用已经存在的色彩,或者通过自定义的方式,实现更加合理的颜色搭配。

新方法

【图像处理】使用matplotlib库显示灰度图像为自定义颜色(2)

参考文献

[1]【Python】如何使用matplotlib 库正确的显示灰度图像
[2]在matplotlib中自定义colormap

posted @ 2022-09-19 21:59  雨天尊  阅读(523)  评论(0编辑  收藏  举报