圖像處理(二)——使用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