算法:通过三个不同函数(这里是三个分段线性函数),将一个灰度值映射三个不同灰度值,分别保存在三个不同的矩阵中,
再把三个矩阵的值分别赋值到一个新矩阵的三个通道中,这个新矩阵就是伪彩色图像矩阵,这样就由一张灰度图,得到一张伪彩色图片。
三个映射函数如下:
1. 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);
2. C++实现:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat grayImg = imread("D:/Code/Image/girl.jpg", 0);
imshow("原图", grayImg);
Mat R = grayImg.clone();
Mat G = grayImg.clone();
Mat B = grayImg.clone();
int rows = grayImg.rows;
int cols = grayImg.cols;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
int current = grayImg.at<uchar>(i, j);
if (0 < current && current <= 64)
{
R.at<uchar>(i, j) = 0;
G.at<uchar>(i, j) = 4 * current;
B.at<uchar>(i, j) = 255;
}
else if (64 < current && current <= 128)
{
R.at<uchar>(i, j) = 0;
G.at<uchar>(i, j) = 255;
B.at<uchar>(i, j) = -4 * (current - 64) + 255;
}
else if (128 < current && current <= 192)
{
R.at<uchar>(i, j) = 4 * (current - 128);
G.at<uchar>(i, j) = 255;
B.at<uchar>(i, j) = 0;
}
else
{
R.at<uchar>(i, j) = 255;
G.at<uchar>(i, j) = -4 * (current - 255);
B.at<uchar>(i, j) = 0;
}
}
}
Mat channels[3]; //定义对象数组,分别存储三个通道
Mat pseuMat; //融合三个通道,存储在一个Mat里
channels[0] = B;
channels[1] = G;
channels[2] = R;
merge(channels, 3, pseuMat);
imshow("效果图", pseuMat);
waitKey(0);
return 0;
}
效果如下: