目录
一、实验目的
- 理解不同的彩色图像格式。
- 掌握伪彩色图像增强、真彩色图像变换基本知识。
- 掌握彩色图像的空间滤波基本操作。
二、实验原理
1. 常见彩色图像格式
RGB:RGB 是一种广泛使用的颜色模型,代表红(Red)、绿(Green)、蓝(Blue)三种颜色。在 RGB 图像格式中,每个像素都由这三个颜色通道的值来确定其颜色。通过不同的红、绿、蓝的强度组合,可以表示出丰富的色彩。优点是直观、易于理解和实现,在显示器、图像采集设备等中应用广泛。缺点是它不太符合人类对颜色的感知方式。
HSI:HSI 即色调(Hue)、饱和度(Saturation)、亮度(Intensity)。色调表示颜色的种类,如红色、绿色等;饱和度表示颜色的纯度,饱和度越高,颜色越鲜艳;亮度则反映了颜色的明暗程度。HSI 格式的优点是它更接近人类对颜色的描述和感知方式,在一些需要基于颜色特征进行处理和分析的应用中具有优势。例如,在图像识别、颜色分类等任务中,HSI 格式可能更便于处理。
2. 伪彩色图像
伪彩色图像是将灰度图像或者单一波段的图像通过特定的映射关系转换为彩色图像的一种图像表示形式,但这种色彩的分配并非基于真实的颜色信息,而是根据设定的规则来进行映射。
通过这种变化,可以突出显示图像中不同区域的差异,使原本不太容易分辨的细节变得更加明显,提高了图像的可读性和可理解性。
3. 彩色图像滤波
对于一般RGB图像滤波,首先读取彩色图像并将其分解为R、G、B三个分量图像。然后,分别对每个分量图像进行滤波处理。最后,将滤波后的分量图像重新组合成彩色图像并显示结果。
但是需要注意的是,彩色图像的空间滤波可能会涉及到颜色空间的转换(如RGB与HSI相互转换)和处理,具体的实现方式可能因应用需求和图像特点而有所不同。此外,还可以根据需要选择其他滤波方法或进一步调整滤波参数来获得更好的滤波效果。
三、实验内容
- 伪彩色图像增强处理:选择任意一幅灰度图像,采用上图所示的传递函数实现灰色-彩色图像的变换处理,得到伪彩色图像。
- 任意选择彩色图像,显示其R,G,B分量图像,并使用5*5均值滤波器分别对彩色图像的RGB分量进行平滑滤波,显示R,G,B分量平滑滤波图像。叠加所有的彩色分量图像,形成平滑后的全彩色图像。比较原彩色图像和平滑后的彩色图像。
- 将(3) 的彩色图像,显示其HSI图像,并对强度I分量进行均值滤波平滑,再转换为RGB图像进行显示,与(3)中的平滑后的彩色图像进行比较并相减,用图像显示两种结果的差别。
- 任选一幅彩色图像,对其实现拉普拉斯锐化增强。
四、源程序和结果
(1) 主程序(matlab
clc; close all; clear;
%% task 1
% 读取灰度图像数据
img = imread("lena.bmp");
falseRgb_img = FalseRgbTransf(img);
figure;
subplot(1,2,1);
imshow(img); title("原图");
subplot(1,2,2);
imshow(falseRgb_img); title("伪彩色图");
%% task 2
% 读取彩色图像数据
img_rgb = imread("lena.jpg");
filter_kernel = ones(5,5)/25;
mean_img_rgb = RgbFilter(img_rgb,filter_kernel);
figure;
subplot(1,2,1);
imshow(img_rgb); title("原图");
subplot(1,2,2);
imshow(mean_img_rgb); title("平滑图像");
%% task 3
% RGB转HSI
hsi = rgb2hsi(img_rgb);
I = hsi(:,:,3);
mean_kernal = [1, 1, 1, 1; 1, 1, 1, 1; 1, 1, 1, 1] / 16;
I_mean = GrayscaleFilter(I, mean_kernal, 0);
hsi(:,:,3) = I_mean;
% HSI转RGB
rgb = uint8(hsi2rgb(hsi));
diff = img_rgb - rgb;
figure;
subplot(2,2,1); imshow(img_rgb); title("原图");
subplot(2,2,2); imshow(hsi); title('RGB转HSI');
subplot(2,2,3); imshow(rgb); title('HSI(4×4平滑滤波)转RGB');
subplot(2,2,4); imshow(diff,[]); title('两者相减的图像');
%% task 4
% 定义拉普拉斯核
lab_kernel = [1,1,1;1,-8,1;1,1,1];
lab_img_rgb = RgbFilter(img_rgb,lab_kernel);
figure;
subplot(1,2,1);
imshow(img_rgb); title("原图");
subplot(1,2,2);
imshow(lab_img_rgb + img_rgb); title("锐化图像");
(2) 函数FalseRgbTransf
% 对灰度图像进行伪彩色变换
function falseRgb_img = FalseRgbTransf(img)
[height, width, ~] = size(img);
R_img = img(:,:,1);
G_img = img(:,:,2);
B_img = img(:,:,3);
% 定义灰度变换函数
R_transf = zeros(1,256);
R_transf(129:192) = 0:255/63:255;
R_transf(193:256) = 255;
% plot(R_transf);
G_transf = zeros(1,256);
G_transf(1:64) = 0:255/63:255;
G_transf(65:192) = 255;
G_transf(193:256) = 255:-255/63:0;
% plot(G_transf);
B_transf = zeros(1,256);
B_transf(1:64) = 255;
B_transf(65:128) = 255:-255/63:0;
% plot(B_transf);
% 进行变换
for i = 1:height
for j = 1:width
R_img(i,j) = R_transf(R_img(i,j) + 1);
G_img(i,j) = G_transf(G_img(i,j) + 1);
B_img(i,j) = B_transf(B_img(i,j) + 1);
end
end
falseRgb_img = cat(3,R_img,G_img,B_img);
End
(3) 函数hsi2rgb
function rgb_image = hsi2rgb(hsi_image)
% 将 HSI 图像转换为 RGB 图像
% 输入参数:rgb_image - RGB 彩色图像
% 返回值:hsi_image - HSI 彩色图像
[rows, cols, ~] = size(hsi_image);
% 提取 H、S、I 通道
H = hsi_image(:,:,1) * 2 * pi;
S = hsi_image(:,:,2);
I = hsi_image(:,:,3);
% 初始化 RGB 通道
R = zeros(rows, cols);
G = zeros(rows, cols);
B = zeros(rows, cols);
% 计算 RGB 通道
for i = 1:rows
for j = 1:cols
if H(i,j) < 2*pi/3
B(i,j) = I(i,j) * (1 - S(i,j));
R(i,j) = I(i,j) * (1 + S(i,j) * cos(H(i,j)) / cos(pi/3 - H(i,j)));
G(i,j) = 3 * I(i,j) - (R(i,j) + B(i,j));
elseif H(i,j) >= 2*pi/3 && H(i,j) < 4*pi/3
H(i,j) = H(i,j) - 2*pi/3;
R(i,j) = I(i,j) * (1 - S(i,j));
G(i,j) = I(i,j) * (1 + S(i,j) * cos(H(i,j)) / cos(pi/3 - H(i,j)));
B(i,j) = 3 * I(i,j) - (R(i,j) + G(i,j));
else
H(i,j) = H(i,j) - 4*pi/3;
G(i,j) = I(i,j) * (1 - S(i,j));
B(i,j) = I(i,j) * (1 + S(i,j) * cos(H(i,j)) / cos(pi/3 - H(i,j)));
R(i,j) = 3 * I(i,j) - (G(i,j) + B(i,j));
end
end
end
% 合并 RGB 通道
rgb_image = cat(3, R, G, B) * 255;
End
(4) 函数rgb2hsi
function hsi_image = rgb2hsi(rgb_image)
% 将 RGB 图像转换为 HSI 图像
% 输入参数:rgb_image - 归一化 RGB 彩色图像
% 返回值:hsi_image - HSI 彩色图像
% 将 RGB 图像归一化到 [0, 1] 范围
rgb_image = double(rgb_image);
rgb_image = im2double(rgb_image) / 255.0;
% 提取 R、G、B 通道
R = rgb_image(:,:,1);
G = rgb_image(:,:,2);
B = rgb_image(:,:,3);
% 计算亮度成分(Intensity)
I = (R + G + B) / 3;
% 计算饱和度(Saturation)
S = 1 - min(min(R, G), B) ./ I;
% 计算色调(Hue)
num = 0.5 * ((R - G) + (R - B));
den = sqrt((R - G).^2 + (R - B) .* (G - B));
theta = acos(num ./ (den + eps));
H = theta;
H(B > G) = 2 * pi - H(B > G);
H = H / (2 * pi);
% 组合 H、S、I 通道
hsi_image = cat(3, H, S, I);
End
(5) 函数GrayscaleFilter
% 功能:输入灰度图和滤波核,输出滤波图像
function filtered_image = GrayscaleFilter(gray_image, filter_kernel, double2uint8)
% 读取行列值
[rows, cols] = size(gray_image);
[krows, kcols] = size(filter_kernel);
% 计算边界填充(零填充)
pad_rows = floor(krows/2);
pad_cols = floor(kcols/2);
padded_image = zeros(rows + 2*pad_rows, cols + 2*pad_cols);
padded_image(pad_rows+1:end-pad_rows, pad_cols+1:end-pad_cols) = gray_image;
% 对图像进行滤波
filtered_image = zeros(rows, cols);
for i = 1:rows
for j = 1:cols
patch = padded_image(i:i+krows-1, j:j+kcols-1);
filtered_image(i, j) = sum(patch(:) .* filter_kernel(:)); % 卷积运算
end
end
if double2uint8
% 还原到0~255的灰度像素范围
filtered_image = uint8(filtered_image);
end
End
(6) 函数RgbFilter
% 对彩色图片滤波
function filered_img_rgb = RgbFilter(img_rgb, filter_kernel)
R_img = img_rgb(:,:,1);
G_img = img_rgb(:,:,2);
B_img = img_rgb(:,:,3);
filered_R_img = GrayscaleFilter(R_img, filter_kernel, 1);
filered_G_img = GrayscaleFilter(G_img, filter_kernel, 1);
filered_B_img = GrayscaleFilter(B_img, filter_kernel, 1);
filered_img_rgb = cat(3,filered_R_img,filered_G_img,filered_B_img);
end
五、结果分析
1. 实验内容1
观察下图,下面的灰度图经变换规则变换成伪彩色图像后,在亮暗方面变得更加直观,原始灰度图越亮的地方越区域红色,越暗的地方越趋于蓝色。
伪彩色图像
2. 实验内容2
经平滑后图像如下图所示,相较于原图,图像变的模糊了起来,与对灰度图的处理结果是一样的。
平滑处理
3. 实验内容3
观察下图,对RGB图像转换为HSI图像后用imshow函数显示,其图像是不能正常显示的,因为imshow函数只能显示RGB格式的图像。对转换的HSI图像中亮度分量I进行4×4平滑滤波后再转化为RGB图像,可以看到图像变暗了,且有点变糊(亮暗细节少了)。与原始图像相减,图像内容不变,但是亮度很低,即幅值较低,可见分量I确实与RGB图像幅度有关。
RGB与HSI变换处理
4. 实验内容4
对彩色图像进行拉普拉斯锐化,其结果与对灰度图锐化效果类似,都是在图像边缘出现白色条带。
锐化处理