컬러 이미지의 색 공간
삼원색의 원리
국제조명위원회(CIE)에서는 표준화를 위해 700nm, 546.1nm, 435.8nm 파장의 단색광을 빨강(R), 초록(G), 파랑의 삼원색으로 사용하도록 규정하고 있다 . 나) 각각 . 빨강, 초록, 파랑의 삼원색을 비율로 혼합하면 다양한 색상을 얻을 수 있으며, 색상 매칭 방정식은 C=aR+bG+cB입니다.
색상 모델(색상 공간 또는 색상 시스템이라고도 함): 단순화된 색상 사양
- 좌표계 - 부분 공간: 각 색상은 좌표계 의 단일 점으로 표현됩니다.
- RGB, CMY(CMYK), HSI, YUv, YCbCr, Lab 등 다양한 색상 모델이 실제 프로젝트 개발에 널리 사용됩니다 .
RGB 모델 및 색 공간 좌표계
- 일반적으로 사용되는 색상 정보 표현 방법
- 빨강, 초록, 파랑의 삼원색 의 밝기를 이용하여 색상을 정량적으로 표현
- 이 모델은 가산 혼합 모델 이라고도 합니다.
- RGB 3색 빛을 서로 중첩시켜 색을 혼합하는 방식
- 모니터 등의 광원 표시 에 적합
그림 1 RGB 색 공간 좌표계
- 그림 1에서 볼 수 있듯이 RGB 색 공간은 R, G 및 B의 세 가지 원래 스펙트럼 구성 요소를 포함하는 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(Hue-Saturation-Intensity, HSI) 모델은 H, S, I의 세 가지 매개변수를 사용하여 색상 특성을 설명합니다.
- H(색조) 는 각도 로 표시되며 색상의 색조는 색상이 가장 가까운 스펙트럼 파장을 반영합니다.
- S(채도)는 색상의 깊이를 나타내며 채도가 높을수록 색상이 어두워집니다.
- I(밝기)는 물체의 반사율 에 의해 결정됩니다 . 반사 계수가 클수록 물체의 밝기가 커지고 그 반대도 마찬가지입니다.
- I 구성 요소 는 이미지의 색상 정보와 무관한 강도 또는 밝기입니다 .
- H 및 S 구성 요소는 색상 정보 및 사람들이 색상을 인식하는 방식과 밀접한 관련 이 있습니다.
그림 2 HSI 색 공간
- 그림 2에서 볼 수 있듯이 HSI 색 공간 원뿔의 중간 단면을 색상환이라고 하며 색상환은 색상과 채도의 두 가지 매개변수를 보다 명확하게 보여줍니다 .
- 밝기를 색상환의 수직선으로 간주하면 H, S 및 I는 원통형 색상 공간을 형성합니다. HSI 모델의 세 가지 속성은 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) 픽셀의 세 가지 값으로 표시됩니다. 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 botton = ((rg)**2+(( rb)*(gb))+ sys.float_info.min)**0.5
13 den =a / botton 14 den[den>1]=1
15 den[den<-1]=-1
16 H = np.arccos(den) 17 index = np.where(g< b) 18 H[index]= 2*m.pi - H[index] 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. 여기서((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 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.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 화재 = 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 ",나)
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