灰度图像可以简单理解为一个灰度值矩阵,其中灰度值的取值范围是[0, 255],且灰度值为整数。
现在需要将这个灰度值矩阵中的每一个值拆分成3个通道(RGB),分别是红色通道(red, R)、绿色通道(green, G)和蓝色通道(blue, B)。这里就需要自己定义一个映射函数,比如我规定灰度值小于128的点,它们对应的红色通道的值为30,就可以写作
这里的R是红色通道矩阵,X是灰度值矩阵。
一般地,给出一个任意的映射函数如下
则其对应的matlab的转换函数如下
%% 红色通道映射函数
function R = redTransformer(X)
R = zeros(size(X));
R(X < 128) = 30;
R(128 <= X & X < 192) = 2*X(128 <= X & X < 192)-150;
R(192 <= X) = 234;
end
这里的转换函数使用了索引矩阵来简化代码,提高效率,对matlab索引不熟悉的小伙伴可以参考我的这篇博客
matlab核心知识点-索引index运用_ 一只博客-CSDN博客https://blog.csdn.net/qq_42276781/article/details/121715378为了方便理解,这里给出一个一般写法的转换函数
%% 红色通道映射函数,一般写法,不推荐
function R = redTransformer(X)
[row, col] = size(X);
R = zeros(row, col);
for i = 1: rowfor j = 1: colif X(i,j) < 128R(i,j) = 30;elseif X(i,j) < 192R(i,j) = 2*X(i,j)-150;elseR(i,j) = 234;end end
end
end
类似地,给出三个通道的函数表达式和matlab代码
matlab中的函数可以嵌套,于是我将RGB三色的映射函数均放置在gray2rgb.m文件中。
gray2rgb.m
%% 灰度图转换为彩色图
function I = gray2rgb(X)
R = redTransformer(X);
G = greenTransformer(X);
B = blueTransformer(X);
I(:,:,1) = R;
I(:,:,2) = G;
I(:,:,3) = B;
I = uint8(I);
end%% 红色通道映射函数
function R = redTransformer(X)
R = zeros(size(X));
R(X < 128) = 30;
R(128 <= X & X < 192) = 2*X(128 <= X & X < 192)-150;
R(192 <= X) = 234;
end
%% 绿色通道映射函数
function G = greenTransformer(X)
G = zeros(size(X));
G(X < 90) = 2*X(X < 90)+40;
G(90 <= X & X < 160) = 180;
G(160 <= X) = 0;
end
%% 蓝色通道映射函数
function B = blueTransformer(X)
B = zeros(size(X));
B(X < 64) = 115;
B(64 <= X & X < 128) = 510-4*X(64 <= X & X < 128);
B(128 <= X) = 36;
end
主函数
clear, close all
% 辣椒彩色图
im_rgb = imread('peppers.png');
subplot(1,3,1), imshow(im_rgb)
% 彩色图转灰度图
im_gray = rgb2gray(im_rgb);
subplot(1,3,2), imshow(im_gray)
% 灰度图转彩色图
im_gray2rgb = gray2rgb(im_gray);
subplot(1,3,3), imshow(im_gray2rgb)
运行结果
代码获取
关注公众号,回复“数字图像处理”即可获得代码