图像处理(二)——使用HSI和HSV颜色空间来调整图像颜色
图像颜色调整
1. 介绍
编写一段Matlab代码使用HSI和HSV颜色空间来调整图像颜色。
2. 实验方法
输入为图像以及三个通道的调整系数,输出为调整后的图片。代码中首先将三个通道提取出来,按调整系数进行调整,之后再将三通道合并,生成输出的图像。最后将调整后的图像与photoshop中对应的结果进行对比,描述photoshop中颜色调整可能用到的方法。
3. 实验结果及分析
3.1 色度调整:增加50和减少40色度值
3.2 饱和度调整:增加30和减少20饱和度
3.3 明度调整:增加60和减少30明度
4. matlab代码
4.1 process_hsv_hsi.m
clc, clear;
close all;
h = input('Adjust hue by: '); % 输入色度调整参数h
s = input('Adjust saturation by: '); % 输入饱和度调整参数s
v = input('Adjust intensity by: '); % 输入明度调整参数v
I = imread('Lenna.png'); % 读取源图像并显示
figure(1);
imshow(I);
% HSV颜色空间处理
hsv_image = rgb2hsv(I); % 将rgb颜色空间转换为hsv颜色空间
hue = hsv_image(:,:,1); % 提取色度通道
sat = hsv_image(:,:,2); % 提取饱和度通道
int = hsv_image(:,:,3); % 提取明度通道
hue = hue + 1 / 360 * h; % 对各通道进行处理
sat = sat + 0.01 * s;
int = int + 0.01 * v;
%hue(hue>1)=hue(hue>1) - 1; hue(hue<0)=1 - hue(hue<0);
hue(hue>1)=1; hue(hue<0)=0;
sat(sat>1)=1; sat(sat<0)=0;
int(int>1)=1; int(int<0)=0;
hsv_image(:,:,1) = hue; % 运算后的各通道返回原图
hsv_image(:,:,2) = sat;
hsv_image(:,:,3) = int;
% matlab 无法直接显示hsv和hsi图像,还要先转换为rgb
rgb = hsv2rgb(hsv_image); % 将hsv颜色空间转换为rgb颜色空间,并显示
figure(2);
imshow(rgb);
% HSI颜色空间处理
hsi_image = rgb2hsi(I); % 将rgb颜色空间转换为hsi颜色空间
hue = hsi_image(:,:,1); % 提取色度通道
sat = hsi_image(:,:,2); % 提取饱和度通道
int = hsi_image(:,:,3); % 提取明度通道
hue = hue + 1 / 360 * h; % % 对各通道进行处理
sat = sat + 0.01 * s;
int = int + 0.01 * v;
%hue(hue>1)=hue(hue>1) - 1; hue(hue<0)=1 - hue(hue<0);
hue(hue>1)=1; hue(hue<0)=0;
sat(sat>1)=1; sat(sat<0)=0;
int(int>1)=1; int(int<0)=0;
hsi_image(:,:,1) = hue; % 运算后的各通道返回原图
hsi_image(:,:,2) = sat;
hsi_image(:,:,3) = int;
rgb = hsi2rgb(hsi_image); % 将hsi颜色空间转换为rgb颜色空间,并显示
figure(3);
imshow(rgb);
4.2 rgb2hsi.m
由于matlab没有rgb2hsi函数所以要自己写一个,直接命名为abc.m就可以在同目录下其他.m文件中调用。
MATLAB的m文件分为两种。
一种为脚本文件,就是由一堆命令构成的,里面第一行不是function开头,这种文件比如是myfun.m 就在命令窗口里输入myfun回车就行,matlab会把m文件中的命令都运行一次。
另一种为函数文件,第一行为function ,比如说 function y=myfun(x),这种文件函数名与文件名必须是一致的,在命令窗口里输入myfun(x), x是运行参数,回车即运行。
要注意的是,不同于C语言,matlab的m文件不允许脚本和函数在同一个m文件中。
代码:
function hsi=rgb2hsi(rgb)
%根据书上P260-261页公式实现本函数
rgb=im2double(rgb);
r=rgb(:,:,1);
g=rgb(:,:,2);
b=rgb(:,:,3);
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);
num=min(min(r,g),b);
den=r+g+b;
den(den==0)=eps;
S=1-3.*num./den;
H(S==0)=0;
I=(r+g+b)/3;
hsi=cat(3,H,S,I);
4.3 hsi2rgb.m
同样需要写一个hsi2rgb.m
代码:
function rgb=hsi2rgb(hsi)
%根据书上P260-261页公式实现本函数
H=hsi(:,:,1)*2*pi;
S=hsi(:,:,2);
I=hsi(:,:,3);
R=zeros(size(hsi,1),size(hsi,2));
G=zeros(size(hsi,1),size(hsi,2));
B=zeros(size(hsi,1),size(hsi,2));
idx=find((0<=H)&(H<2*pi/3));
B(idx)=I(idx).*(1-S(idx));
R(idx)=I(idx).*(1+S(idx).*cos(H(idx))./cos(pi/3-H(idx)));
G(idx)=3*I(idx)-(R(idx)+B(idx));
idx=find((2*pi/3<=H)&(H<4*pi/3));
R(idx)=I(idx).*(1-S(idx));
G(idx)=I(idx).*(1+S(idx).*cos(H(idx)-2*pi/3)./cos(pi-H(idx)));
B(idx)=3*I(idx)-(R(idx)+G(idx));
idx=find((4*pi/3<=H)&(H<=2*pi));
G(idx)=I(idx).*(1-S(idx));
B(idx)=I(idx).*(1+S(idx).*cos(H(idx)-4*pi/3)./cos(5*pi/3-H(idx)));
R(idx)=3*I(idx)-(G(idx)+B(idx));
rgb=cat(3,R,G,B);
rgb=max(min(rgb,1),0);