カラー画像の色空間
三原色の原理
国際照明委員会(CIE)は規格化のため、赤(R)、緑(G)、青の三原色として波長700nm、546.1nm、435.8nmの単色光を使用することを定めています( B)それぞれ。赤、緑、青の三原色を比例的に混ぜることでさまざまな色が得られ、等色式は C=aR+bG+cB となります。
カラーモデル (カラースペースまたはカラーシステムとも呼ばれます): 簡略化されたカラー仕様
- 座標系 - 部分空間:各色は座標系の 1 つの点で表されます。
- 多くのカラーモデルがあり、RGB、CMY (CMYK)、HSI、YUv、YCbCr、Labなどが実際のプロジェクト開発やアプリケーションで広く使用されています。
RGBモデルと色空間座標系
- 一般的に使われる色情報の表現方法
- 赤・緑・青の三原色の明るさを利用して色を定量的に表現します。
- このモデルは加法混色モデルとしても知られています。
- RGBの3色の光を重ね合わせて混色する方式
- モニターなどの光源の表示に最適
図 1 RGB 色空間座標系
- 図 1 に示すように、RGB 色空間は、R、G、B の 3 つの元のスペクトル成分を含む3 次元デカルト座標系に基づいています。
- RGB 色空間の R、G、B コンポーネントの値は、それぞれ赤、緑、青の明るさの値を表します。
- 説明の便宜上、3 つの成分は正規化されており、トリプレットの各値は赤、緑、青の比率を表します。図 1 では、原点 (0, 0, 0) は黒、点 (1, 1, 1) は白、点 (1, 0, 0) は赤、点 (0, 1, 0) はそれぞれを表します。緑、点 (0, 0, 1) は青を表します。
RGB画像のサイズ
- 赤、青、緑の各画像は 8 ビット画像です
- RGB 画像の各ピクセルには 24 ビットのビット深度が含まれます
- 24 ビットのビット深度を持つカラー画像は、フル (トゥルー) カラー画像と呼ばれます。
- フルカラー画像の色の種類の総数は 2 の 24 乗、16777216 です。
HSI カラーモデルと色空間
HSI (色相-彩度-強度、HSI) モデルは、H、S、および I の 3 つのパラメーターを使用して色の特性を記述します。
- H (色相)は角度で表され、色の色相はその色がどのスペクトル波長に最も近いかを反映します。
- S (彩度)は色の深さを示し、彩度が高いほど色は暗くなります。
- I(明るさ)は物体の反射率によって決まります。反射係数が大きいほどオブジェクトの明るさは大きくなり、その逆も同様です。
- I コンポーネントは、画像の色情報に依存しない強度または明るさです。
- H 成分と S 成分は、色の情報と人間の色の認識方法に密接に関係しています。
図 2 HSI 色空間
- 図 2 に示すように、HSI 色空間の円錐の中央の断面はカラー サークルと呼ばれ、カラー サークルは色相と彩度の2 つのパラメーターをより明確に示します。
- 明るさをカラーサークルの垂直線とみなすと、H、S、I は円筒形の色空間を形成します。HSI モデルの 3 つの属性は、3 次元の色空間を定義します。
- 色相 H は、色がどのスペクトル波長に最も近いかを反映する角度で表されます。カラー ホイールでは、0°は赤色のスペクトルを表し、120°は緑色のスペクトルを表し、240°は青色のスペクトルを表します。彩度Sはカラーサークルの中心からカラーポイントまでの半径で表され、距離が長いほど彩度が高く、色が明るくなります。
RGBとHSI間の変換
RGB 色空間形式の画像を指定して、画像の R コンポーネント、G コンポーネント、および B コンポーネントをそれぞれ正規化します。RGB 色空間では、(x, y) 空間位置にあるピクセルの色は、R 成分 R (x, y)、G 成分 G (x, y)、および B 成分 B (x, y) によって決まります。 y) ピクセルの 3 つの値で表されます。HSI 色空間では、その空間位置のピクセルの H 成分 H (x, y)、S 成分 S (x, y)、I 成分 I (x, y) は次の式で計算できます。 :
(1) H(x, y) ∈ [00, 1200) の場合、換算式は次のようになります。
(2) H(x, y) ∈ [1200, 2400) の場合、換算式は次のようになります。
(3) H(x, y) ∈ [2400, 3600) の場合、換算式は次のようになります。
RGB および HSI 色空間変換実験の作成
カラー画像のヒストグラム等化を行うには、まず HSI 関数を使用して画像を HSI 色空間に変換し、次に設計された RGB 関数を使用して画像を HSI 色空間から表示用の RGB 色空間に変換する必要があります。 。最後に、テスト結果に従って、リンゴの切断、炎の検出など、カラー画像に対して画像の切断と検出操作を実行します。
コード
RGBからHISへの変換機能;
1 # RGB から HSI 色空間へ
2 def HSI(self,img): 3 r = img[:,:,0].astype(np.float32) 4 g = img[:,:,1 ].astype(np. float32) 5 b = img[:,:,2 ].astype(np.float32) 6
7 I = (r+g+b)/3
8 I = I/255
9 img_min = np.min(img,axis= -1 ) 10 S = 1 - (3/(r+g+b)* img_min) 11 a = 0.5*((rg)+(r- b)) 12 ボタン = ((rg)**2+(( rb)*(gb))+sys.float_info.min)**0.5
13 デン =a /ボタン 14 den[den>1]=1
15 den[den<-1]=-1
16 H = np.arccos(den) 17 インデックス = np.where(g< b) 18 H[インデックス]= 2*m.pi - H[インデックス] 19 H /= 2 * m.pi 20 H[S == 0] = 0 21
22 hsi = np.zeros([img.shape[0],img.shape[1],img.shape) [2]],dtype= np.float32) 23 hsi[:,:,0] = H 24 hsi[:,:,1] = S 25 hsi[:,:,2] = I 26 return hsi
HISからRGBへの変換機能;
1 # HSI转RGB颜色空间
2 def RGB(self,hsi): 3 # rgb
4 H = hsi[:,:,0] 5 S = hsi[:,:,1 ] 6 I = hsi[:,:, 2 ] 7 H *=2* m.pi 8
9 rgb = np.zeros(hsi.shape,np.uint8) 10 R = np.zeros(H.shape, dtype= np.float32) 11 G = np.zeros (H.shape, dtype= np.float32) 12 B = np.zeros(H.shape, dtype= np.float32) 13
14 Index = np.where((H>=0)&(H<2*m.円周率/3)) 15 R[インデックス] = I[インデックス] * (1+(S[インデックス]*np.cos(H[インデックス]))/(np.cos(m.pi/3- H[インデックス])) ) 16 B[インデックス] = I[インデックス]*(1- S[インデックス]) 17 G[インデックス] = 3*I[インデックス]-(B[インデックス]+ R[インデックス]) 18
19 インデックス = np。 where((H>=2*m.pi/3)&(H<4*m.pi/3 )) 20 R[インデックス] = I[インデックス]*(1- S[インデックス]) 21 G[インデックス] ] = I[インデックス] * (1+(S[インデックス]*np.cos(H[インデックス]-2*m.pi/3))/(np.cos(m.pi- H[インデックス])) ) 22 B[インデックス] = 3*I[インデックス]-(R[インデックス]+ G[インデックス]) 23
24 インデックス = np.where((H>=4*m.pi/3)&(H<2) * m.pi)) 25 B[インデックス] = I[インデックス] * (1+(S[インデックス]*np.cos(H[インデックス]-4*m.pi/3))/(np.cos(5*m.pi/3) - H[インデックス]))) 26 G[インデックス] = I[インデックス]*(1- S[インデックス]) 27 R[インデックス] = 3*I[インデックス]-(G[インデックス]+ B[インデックス] ) 28
29 rgb[:,:,0] = (255* R).astype(np.uint8) 30 rgb[:,:,1] = (255* G).astype(np.uint8) 31 rgb[: ,:,2] = (255* B).astype(np.uint8) 32 return rgb
リンゴを切ります。
1 #苹果检测
2 def appleDetect(self,img): 3 # img = img.astype(np.float32)
4 r = img[:,:,0] 5 g = img[:,:,1 ] 6 b = img[:,:,2 ] 7 hsi = self.HSI(img) 8 H = hsi[:,:,0] 9 H *=2* m.pi 10 print (img.shape) 11 apple = np.zeros (img.shape,dtype= np.uint32) 12 detect_ground = np.where(((H>=0)&(H<=m.pi/3.6))|((H>m.pi*1.3)&( H<=2* m.pi))) 13 apple[:,:,0][detect_ground] = r[detect_ground] 14 apple[:,:,1][detect_ground] = g[detect_ground] 15 apple[:,:,2][detect_ground] = b[detect_ground] 16 apple = apple.astype(np.uint8) 17 cv.imshow( " apple_img " ,apple)
炎を検知するには
1 #火焰检测
2 def fireDetect(self,img): 3
4 r = img[:,:,0] 5 g = img[:,:,1 ] 6 b = img[:,:,2 ] 7 hsi = self.HSI(img) 8 H = hsi[:,:,0] 9 S = hsi[:,:,1 ] 10 I = hsi[:,:,2 ] 11 S *= 100
12 I *= 255
13 H *=2* m.pi 14 # rgb = self.RGB(hsi)
15 detect_ground = np.where((H >= 2*m.pi/3) & (H< 2 * m.pi) & (S >= 20 )& (I >=100 )) 16 fire = np.zeros ( img.shape,dtype= np.uint32) 17 # print(detect_ground)
18 fire[:,:,0][detect_ground] = r[detect_ground] 19 fire[:,:,1][detect_ground] = g[detect_ground] 20 fire[:,:,2][detect_ground] = b[detect_ground] 21 # print(fire)
22 fire = fire.astype(np.uint8) 23 cv.imshow( " fire " ,fire)
画像表示;
1 #画像显表示
2 def main(self): 3 img_apple = cv.imread( " ./data/images/apple.jpg " ) 4 img_fire = cv.imread( " ./data/images/fire.jpg " ) 5 hsi = self.HSI(img_apple) 6 rgb = self.RGB(hsi) 7 self.appleDetect(img_apple) 8 self.fireDetect(img_fire) 9 cv.imshow( " orgin_apple " ,img_apple) 10 # cv.imshow("I "、I)
11 #cv.imshow("S",S)
12 # cv.imshow("H",H)
13 cv.imshow( " hsi " ,hsi) 14 cv.imshow( " hsi_to_rgb_img " ,rgb)
プログラムの実行。
1 if __name__ == " __main__ " : 2 PicDetect().main() 3 k = cv.waitKey(0)&0xFF
4 if k == 27 : 5 cv.destroyAllWindows() 6