圖像顏色調整
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);