图像处理(二)——使用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);

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM