伪彩色处理(pseudocoloring)是指根据一定准则给灰度值赋予彩色值的处理。宏观来说就是将黑白图像转化为彩色图像,或者是将单色图像变换成给定彩色分布的图像。由于人眼对彩色的分辨能力远远高于对灰度的分辨能力,所以将灰度图像转化成彩色表示,就可以提高对图像细节的辨别力。因此,伪彩色处理的主要目的是提高人眼对图像的细节分辨能力,以达到图像增强的目的。

目录

强度分层

灰度值到彩色变化

强度分层

强度分层也叫灰度分层或灰度分割。将灰度图像按照灰度范围划分为不同的层级,然后给每个层级赋予不同颜色,从而增强不同层级的对比度。强度分层技术将灰度图转换为伪彩色图像,而且伪彩色图像颜色种类数目与强度分层数目一致。

令f(x,y)表示位于空间位置(x,y)处像素的灰度值,[0,L]表示灰度值范围,0代表黑色,L代表白色。假定分割值l1,l2,l3….(0<l1<l2…..<L),将图像灰度划分为M+1个区间V1,V2….VM+1。灰度值到彩色的映射关系为,,其中是第k个灰度区间有关的颜色。

from skimage import color, iofrom matplotlib import pyplot as pltimport numpy as npimg = io.imread('a.jpg')grayimg = color.rgb2gray(img)# 转换为灰度图plt.figure()plt.imshow(grayimg, cmap='gray')plt.axis('off')plt.show()rows, cols = grayimg.shapelabels = np.zeros([rows, cols])for i in range(rows):for j in range(cols):if (grayimg[i, j] < 0.4):labels[i, j] = 1elif (grayimg[i, j] < 0.8):labels[i, j] = 2else:labels[i, j] = 3psdimg = color.label2rgb(labels)# 不同灰度区间采用不同颜色plt.figureplt.axis('off')plt.imshow(psdimg)plt.show()

灰度图:

强度分层图:

你也可以修改灰度区间来改变颜色。

灰度值到彩色变化

灰度值到彩色变换首先是对任何像素的灰度值进行三个独立的变换,然后将三个变换结果分别做为伪彩色图像的红,绿,蓝通道的亮度值。与强度分层技术相比,灰度值到彩色变换技术更通用。

表示位于空间(x,y)处的像素灰度值,,,表示经过变换后不同通道的亮度值。合成RGB彩色图像在空间位置(x,y)处颜色

变换函数:

from matplotlib import pyplot as plt# 定义灰度值到彩色变换L = 255def GetR(gray):if gray  L / 4 * 3:return Lelse:return 4 * gray - 2 * Ldef GetG(gray):if gray  L / 4 * 3:return 4 * L - 4 * grayelse:return Ldef GetB(gray):if gray  L / 2:return 0else:return 2 * L - 4 * gray# 设置字体格式plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falseplt.rcParams['font.size'] = 15x = [0, 64, 127, 191, 255]# 绘制灰度图像到不同通道的映射关系plt.figure()R = []for i in x:R.append(GetR(i))plt.plot(x, R, 'r--', label='红色变换')plt.legend(loc='best')plt.figure()G = []for i in x:G.append(GetG(i))plt.plot(x, G, 'g--', label='绿色变换')plt.legend(loc='best')plt.figure()B = []for i in x:B.append(GetB(i))plt.plot(x, B, 'o--', markersize=5, label='蓝色变换')plt.legend(loc='best')# 绘制灰度图像到RGB映射关系plt.figure()plt.plot(x, R, 'r--')plt.plot(x, G, 'g')plt.plot(x, B, 'b')plt.show()

按照映射关系转换成为彩色图像:

from matplotlib import pyplot as pltfrom skimage import io, colorimport numpy as np# 定义灰度值到彩色变换L = 255def GetR(gray):if gray  L / 4 * 3:return Lelse:return 4 * gray - 2 * Ldef GetG(gray):if gray  L / 4 * 3:return 4 * L - 4 * grayelse:return Ldef GetB(gray):if gray  L / 2:return 0else:return 2 * L - 4 * grayimg=io.imread('G.jpg')gray = color.rgb2gray(img)*255# 彩色转换灰度图color = np.zeros(img.shape, dtype='uint8')for i in range(img.shape[0]):for j in range(img.shape[1]):r, g, b = GetR(gray[i, j]), GetG(gray[i, j]), GetB(gray[i, j])color[i, j, :] = (r, g, b)# 显示plt.figure()plt.axis('off')plt.imshow(img)plt.figure()plt.axis('off')plt.imshow(gray, cmap='gray')# 显示灰度图plt.figure()plt.axis('off')plt.imshow(color)#显示伪彩色图像plt.show()

原图:

灰度图:

伪彩色图像:

你可以自己使用自己的图片,如果使用自己的图片:读取时标明路径,一般我放在与程序同一路径下:

你也可以使用skimage.data库里自带的图片,例如:

from matplotlib import pyplot as pltfrom skimage import dataimg=data.astronaut()plt.imshow(img)plt.axis('off')plt.show()