1、RGB 影像轉 HSI 影像
具體實作步驟:
- 通過 im2double() 函式將輸入影像轉成 double 型別并作歸一化處理;
- 雙重回圈遍歷影像的每一個像素點:分別獲取 R,G,B 三個分量,帶入轉換公式進行計算求解,計算公式如下:

1) 函式介面實作:
function HSI = myRGB2HSI(RGB)
% 從RGB顏色空間向HSI顏色空間的轉換
% RGB(uint8):輸入的RGB彩色影像
% HSI(double):轉換后的HSI彩色影像
img1_double = im2double(RGB); % 轉成double并作歸一化處理
[r, c, k] = size(img1_double);
H = zeros(r, c);
S = zeros(r, c);
I = zeros(r, c);
for i = 1 : r
for j = 1 : c
% 分別獲取R,G,B分量
R = img1_double(i,j,1);
G = img1_double(i,j,2);
B = img1_double(i,j,3);
fenzi = 0.5 * ( (R-G)+(R-B) );
fenmu = sqrt( (R-G)^2 + (R-B)*(G-B) );
% 易錯點:分母需加上eps防止為0
xita = acos( fenzi/(fenmu+eps) );
if ( B<=G )
HSI(i,j,1) = xita;
else
HSI(i,j,1) = 2*pi-xita;
end
HSI(i,j,1) = HSI(i,j,1) / (2*pi); % H分量需要除以2*pi進行歸一化
min_value = min(min(R,G),B);
% 易錯點:分母需加上eps防止為0
HSI(i,j,2) = 1 - ( 3/(R+G+B+eps) ) * min_value;
HSI(i,j,3) = (R+G+B)/3;
end
end
end
2) 注意點:
- 角度與弧度前后要一一對應,要么都使用角度,要么都使用弧度;
- 分母要加上 eps 防止為 0;
- 時刻對輸入輸出的資料范圍保持清醒,即要做好歸一化與放縮處理;
3) 處理結果:

2、HSI 影像轉 RGB 影像
具體實作步驟:
- 通過 im2double() 函式將輸入影像轉成 double 型別并作歸一化處理;
- 遍歷每一個像素點,首先對 H 分量乘以 2*pi 將其擴展,然后根據 H 的范圍按照公式進行計算對應的 R,G,B 分量即可,計算公式如下所示:

1) 函式介面實作:
function RGB = myHSI2RGB(HSI)
% 從HSI顏色空間向RGB顏色空間的轉換
% HSI(double):輸入的HSI彩色影像
% RGB(uint8): 轉換后的RGB彩色影像
HSI = im2double(HSI);
[r,c,k] = size(HSI);
RGB = zeros(r,c,k);
for i = 1 : r
for j = 1 : c
H = HSI(i,j,1)*2*pi;
S = HSI(i,j,2);
I = HSI(i,j,3);
if ( H>=0 && H<2/3*pi)
expression = S*cos( H )/(cos( pi/3-H ) + eps);
RGB(i,j,1) = I * ( 1+expression );
RGB(i,j,3) = I * (1-S);
RGB(i,j,2) = 3*I - ( RGB(i,j,1)+RGB(i,j,3) );
elseif ( H>=2/3*pi && H<4/3*pi)
H = H-2*pi/3;
RGB(i,j,1) = I * (1-S);
expression = S*cos( H )/(cos( pi/3-H ) + eps);
RGB(i,j,2) = I * ( 1+ expression );
RGB(i,j,3) = 3*I - ( RGB(i,j,1)+RGB(i,j,2) );
elseif (H>=4/3*pi && H<=2*pi)
H = H-4*pi/3;
RGB(i,j,2) = I * (1-S);
expression = S*cos( H )/(cos( pi/3-H ) + eps);
RGB(i,j,3) = I * ( 1+ expression );
RGB(i,j,1) = 3*I - ( RGB(i,j,2)+RGB(i,j,3) );
end
end
end
RGB = RGB * 255;
RGB = uint8(RGB);
end
2) 注意點:
- 角度與弧度前后要一一對應,要么都使用角度,要么都使用弧度;
- 分母要加上 eps 防止為 0;
- 時刻對輸入輸出的資料范圍保持清醒,即要做好歸一化與放縮處理;
3) 處理結果:

3、在 HSI 空間中進行均值濾波處理
具體實作步驟:
- 將 RGB影像轉換到 hsi 空間;
- 對 HSI 顏色空間中的亮度分量 I 進行均值濾波處理;
- 將均值濾波后的結果轉換至 RGB 空間;
注意點:提取I分量時要先乘以 255 擴展灰度級,濾波處理完成后要除以 255 再賦值給該 HSI 影像的第三個分量,濾波函式中需采用im2double 讀入影像,
1) 主函式呼叫:
clc;
clear all;
img1 = imread('images/EXP5.tif');
subplot(1,2,1);
imshow(img1);
title('輸入的 RGB 影像','FontSize',20,'FontName','微軟雅黑');
% 1.將rbg影像轉換到hsi空間
img_hsi = myRGB2HSI(img1);
% 2.對HSI顏色空間中的亮度分量I進行濾波處理
w = [1,2,3,2,1; 2,5,6,5,2; 3,6,8,6,3; 2,5,6,5,2; 1,2,3,2,1];
i = img_hsi(:,:,3) * 255;
temp = mySpatialFilter(i,[5,5],w);
temp = temp/255;
% 3.將濾波后的結果轉回至RGB空間中
img_hsi(:,:,3) = temp;
img2 = myHSI2RGB(img_hsi);
subplot(1,2,2);
imshow(img2);
title('在HSI空間濾波后的影像','FontSize',20,'FontName','微軟雅黑');
2) 均值濾波函式介面實作:
function img_enhanced = mySpatialFilter( img1 ,fsize, w )
% 均值濾波函式
% img1:輸入的rgb影像;img_enhanced:輸出影像;fsize:濾波器掩模尺寸
% w:濾波器系數
img1_double = im2double(img1);
[r c] = size(img1_double);
% 獲取濾波器模板尺寸
m = fsize(1);
n = fsize(2);
% 補邊后的總邊數
row_fill = r + m - 1;
col_fill = c + n - 1;
% 用 0 填充邊界
img2 = zeros(row_fill, col_fill);
img2(1+(m-1)/2:row_fill-(m-1)/2,1+(n-1)/2:col_fill-(n-1)/2) = img1_double;
img2_copy = img2;
for i = 1 : r
for j = 1 : c
% 提取與濾波器模板等大的區域
img_area = img2_copy(i:i+m-1,j:j+n-1);
x_center = i + (m-1)/2;
y_center = j + (n-1)/2;
% 計算濾波處理后的影像
img2(x_center,y_center) = sum(w(:).*img_area(:))/sum(w(:));
end
end
img_enhanced= img2(1+(m-1)/2:row_fill-(m-1)/2,1+(n-1)/2:col_fill-(n-1)/2);
end
3) 注意點:
- 均值濾波函式中需采用 im2double 讀入影像;
4) 處理結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/226325.html
標籤:其他
上一篇:數字信號處理8——多目標跟蹤原理
下一篇:天池 在線編程 分割陣列
