冈萨雷斯数字图像处理
伪彩色图像(也称假彩色图像)图像处理包含根据特定标准对灰度值赋予颜色。
伪彩色图像用于区分对单色图像赋予彩色的处理和与真彩色图像相关的处理。因为人眼对彩色图像更为敏感。(人眼可以辨别几千种色调和强度,相比之下却只能辨别20几种灰度。)可以说,伪彩色图像是对灰度图像灰度级的可视化和解释。
最简单的对于一张灰度图像,每一个像素点都对应一个灰度值。我们在灰度轴设置一个阈值,低于该阈值的像素点对应一种颜色,高于该阈值对应另一种颜色(理解为将图像二值化)。可以设置多个阈值,函数呈现阶梯式。
进一步,对于用于目标检测的灰度图像,我们只关注图像的某一物理特性时,将一种颜色赋给某一特定的灰度值,而将另一种颜色赋给所有其他灰度级。
举例:1.甲状腺模型的灰度图像和伪彩色图像2.焊缝孔隙的灰度图像和伪图像。
彩色图像由三个通道(RGB),而灰度图像只有一个通道。
对于灰度图像,可以将灰度值执行三个独立的变换,将变换的结果作为三个通道合成一张彩色图片。变换函数可以根据特定的情况进行调制。上一节的灰度分层身成为彩色图像使用的是分段线性函数。而这种变换是以平滑的非线性函数为基础的。
选择合适的变换函数可以对伪彩色图像进行进一步的彩色增强。
书中举例将三个颜色通道的变换函数分别设置成具有不同相位的正弦函数。因为不同物体的灰度值有差别,而变换函数的纵坐标分别对应三个颜色的强度。由于正弦函数呈周期性变化,所以选择特定的灰度级区段表示不同的物体,是不同的物体呈现出不同的颜色。
1、
2、
图1中爆炸物和背景有不同的灰度级,能够很容易识别到爆炸物。而图2中爆炸物和背景在三个变换函数的映射相差很小,区分效果不好。
和第二部分的方法相似,将灰度图像通过三个变换函数(这里的变换函数就是分段的线性函数),转化成三个灰度值,作为彩色图像的三个通道。
matlab程序:
% 输入灰度级 输出彩色
% 0~63 1/4 蓝色
% 64~127 2/4 紫色
% 128~191 3/4 黄色
% 192~255 4/4 红色
clc;
clear;
grayImage=rgb2gray(imread('D:\Code\Image\girl.jpg'));
figure,imshow(grayImage);
[row,col]=size(grayImage);
range=255;%每个通道的最大灰度值
R = zeros(row,col);
G = zeros(row,col);
B = zeros(row,col);
for i=1:row
for j=1:col
if grayImage(i,j)<=range/4% [0,64]偏蓝
R(i,j)=0;
G(i,j)=4*grayImage(i,j);
B(i,j)=range;
else if grayImage(i,j)<=range/2% (64,128] 偏紫
R(i,j)=0;
G(i,j)=range;
B(i,j)=-4*grayImage(i,j)+2*range;
else if grayImage(i,j)<=3*range/4% (128, 192]
R(i,j)=4*grayImage(i,j)-2*range;
G(i,j)=range;
B(i,j)=0;
else
R(i,j)=range;
G(i,j)=4*(range-grayImage(i,j));
B(i,j)=0;
end
end
end
end
end
out = zeros(row,col);
for i=1:row
for j=1:col
out(i,j,1)=R(i,j);
out(i,j,2)=G(i,j);
out(i,j,3)=B(i,j);
end
end
out=out/256;
figure,imshow(out);
python代码,还是用了opencv 待完善
import cv2
import numpy as np
def to_gray(path):
img = cv2.imread(path)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
return img_gray
'''
输入灰度级 输出彩色
0~63 1/4 蓝色
64~127 2/4 紫色
128~191 3/4 黄色
192~255 4/4 红色
'''
def show(img):
cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()
def color(img_gray):
row, col = img_gray.shape[:]
print(row, col)
b = np.zeros((row, col))
print('b', b, b.shape[:])
g = np.zeros((row, col))
r = np.zeros((row, col))
for i in range(row):
for j in range(col):
if(img_gray[i, j]<255//4):
b[i, j] = 255
g[i, j] = 4 * img_gray[i, j]
while (g[i, j]>255):
g[i, j] -= 255
r[i, j] = 0
elif(img_gray[i, j]<255//2):
b[i, j] = -4 * img_gray[i, j]
while (b[i, j]<0):
b[i, j]+=255
g[i, j] = 255
r[i, j] = 0
elif(img_gray[i, j]<3*255//4):
b[i, j] = 0
g[i, j] = 255
r[i, j] = 4*img_gray[i, j]-255*2
while (r[i, j]>255):
r[i, j]-=255
else:
b[i, j] = 0
g[i, j] = -4*img_gray[i, j]+0*255
while (g[i, j]<0):
g[i, j] += 255
r[i, j] = 255
img_color = cv2.merge([b, g, r])
return img_color
img_gray = to_gray('a.jpg')
img_color = color(img_gray)
show(img_gray)
show(img_color)
感谢
https://blog.csdn.net/weixin_41004352/article/details/90711499
https://blog.csdn.net/jizhidexiaoming/article/details/80255383
冈萨雷斯《数字图像处理》第三版