색 공간 변환

컬러 이미지의 색 공간

삼원색의 원리

     국제조명위원회(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         

 

추천

출처blog.csdn.net/qq_42829848/article/details/126875344