본문 바로가기
AI/컴퓨터 비전

03. 영상 화소처리

by 사라리24 2024. 7. 17.



1. 영상의 화소처리

영상의 특정 좌표 픽셀값을 변경하여 출력 영상의 좌표 픽셀을 설정하는 모든 연산

 

 

🔴 밝기 조절: 영상을 전체적으로 밝게하거나 어둡게 하는 연산


       
          cv2.add(첫번째 영상, 두번째 영상)
          cv2.substract(첫번째 영상, 두번째 영상)
          cv2.multiply(첫번째 영상, 두번째 영상)
          cv2.divide(첫번째 영상, 두번째 영상)

          cv2.addWeighted (첫번째 영상, 알파값, 두번째 영상, 1-알파값, 감마값)
          # 두 영상의 같은 위치에 존재하는 칙셀값에 대하여 가중합을 계산해서 결과 영상의 칙셀값으로 설정

          cv2.absdiff(첫번째 영상, 두번째 영상)
          # 두 영상의 픽셀 값을 빼면 음수가 나올 수 있는데, 해당 값에 절대값을 취한 값


  • 알파값: 두 영상의 가중치를 설정할 때 사용하는 값입니다. 두 영상의 가중치 합은 항상 1이 되어야 합니다. 첫 번째 영상에 지정할 가중치를 알파값이라고 합니다.
    예를 들어, 첫 번째 영상에 0.6, 두 번째 영상에 0.4의 가중치를 주고 싶다면 알파값은 0.6이 됩니다. 두 영상의 가중치 합이 1이 되도록 합니다.
  • 감마값: 연산 결과에 추가적으로 더하거나 뺄 값을 의미합니다. 기본값은 0입니다.

 

 

밝기조절(밝게하기)


       

            import cv2
           
            img1 = cv2.imread('./dog.bmp', cv2.IMREAD_GRAYSCALE)
            img2 = cv2.imread('./dog.bmp')
           
            dst1 = cv2.add(img1, 100)
            dst2 = cv2.add(img2, (100, 100, 100), 0)
           
            cv2.imshow('img', img1)
            cv2.imshow('img', img2)
            cv2.imshow('dst1', dst1)
            cv2.imshow('dst2', dst2)
           
            cv2.waitKey()

 


 

 

 

밝기조절


      
      dst3 = cv2.subtract(img1, 100)
      dst4 = cv2.multiply(img1, 10)
      dst5 = cv2.divide(img1, 10)
 
      cv2.imshow('dst3', dst3)
      cv2.imshow('dst4', dst4)
      cv2.imshow('dst5', dst5)
 



 

 

◼ 이미지 더하기 할 때 + 보다 add를 써야하는 이유


     
        import cv2
        import matplotlib.pyplot as plt

        img1 = cv2.imread('./man.jpg')
        img2 = cv2.imread('./turkey.jpg')

        # img + img: 255를 넘어갈 경우 해당값의 256을 떼서 표현
        dst1 = img1 + img2
        # cv2.add():255를 넘어갈 경우 255로 고정
        dst2 = cv2.add(img1, img2)

        cv2.imshow('dst1', dst1)
        cv2.imshow('dst2', dst2)
        cv2.waitKey()

 

 

 

더한 이미지 matplot으로 보기


       
        img = {'img1': img1, 'img2': img2, 'dst1':dst1, 'dst2':dst2}

        for i, (k, v) in enumerate(img.items()):
            plt.subplot(2, 2, i+1)
            plt.imshow(v[:, :, ::-1])
            plt.title(k)
            plt.show()

 

 

 

두 이미지를 블렌딩


   
        import cv2
        import matplotlib.pyplot as plt
        import numpy as np

        img1 = cv2.imread('./man.jpg')
        img2 = cv2.imread('./turkey.jpg')

        alpha = 0.7
        dst1 = cv2.addWeighted(img1, alpha, img2, (1-alpha), 0)
        dst2 = img1 * alpha + img2 * (1 - alpha)
        dst2 = dst1.astype(np.uint8)


        img = {'img1': img1, 'img2': img2, 'dst1':dst1, 'dst2':dst2}

        for i, (k, v) in enumerate(img.items()):
            plt.subplot(2, 2, i+1)
            plt.imshow(v[:, :, ::-1])
            plt.title(k)
        plt.show()
 

 


 

 

두 개의 이미지를 더하고 블렌딩, 결과를 Matplotlib를 사용하여 서브플롯으로 표시하기


       
        import cv2
        import matplotlib.pyplot as plt
        import numpy as np

        img1 = cv2.imread('./dog.jpg')
        img2 = cv2.imread('./square.bmp')

        dst1 = cv2.add(img1, img2)
        dst2 = cv2.addWeighted(img1,0.5, img2, 0.5, 0)
        dst3 = cv2.subtract(img1, img2)
        dst4 = cv2.absdiff(img1, img2)

        img = {'dst1':dst1, 'dst2':dst2, 'dst3':dst3, 'dsㅅ4':dst4}

        for i, (k, v) in enumerate(img.items()):
            plt.subplot(2, 2, i+1)
            plt.imshow(v[:, :, ::-1])
            plt.title(k)
        plt.show()

 

 

 

🔴 컬러 영상과 색

  • 컬러 영상은 3차원 배열
  • numpy.ndarray
  • img.shape: (h, w, 3), opencv에서는 BGR, (높이, 너비, 채널)

 

색상 채널 분리, 결합


     
      # 색상 채널 분리
      cv2.split(영상)

      # 색상 채널 결합
      cv2.merge(입력 영상 리스트 또는 튜플)


 

색상 RGB 분리하기


       
      import cv2

      img = cv2.imread('./candies.png')
      print('shape: ', img.shape)
      print('dtype: ', img.dtype)

      '''
      b = img[:, :, 0]
      g = img[:, :, 1]
      r = img[:, :, 2]
      '''

      b, g, r = cv2.split(img)

      cv2.imshow('src', img)
      cv2.imshow('b', b)
      cv2.imshow('g', g)
      cv2.imshow('r', r)
      cv2.waitKey()



 

🔴 히스토그램 : 영상의 픽셀값 분표를 그래츠 형태로 표현


       
       cv2.calcHist(영상, 채널, None, 빈의 개수를 나타내는 리스트, 히스토그램 각 차원의 최소값으로 구성된 리스트)


예) 그레이스케일 영상에서 밝기 정보에 해당하는 픽셀의 개수를 구하고 막대 그래프로 표현

- 어두운 영상이면 히스토그램이 전체적으러 왼쪽으로 치우쳐져 있음
- 명암비가 확실한 영상이면 히스토그램이 양쪽으로 분표해 있음

 

 

히스토그램을 계산하고, Matplotlib를 사용하여 그래프로 표시하기


     
        import cv2
        import matplotlib.pyplot as plt

        img = cv2.imread('./dog.bmp', cv2.IMREAD_GRAYSCALE)

        hist = cv2.calcHist([img], [0], None, [256], [0, 255])
        cv2.imshow('img', img)
        plt.plot(hist)
        plt.show()
        cv2.waitKey()

 

 

 

색상 채널(BGR)의 히스토그램을 하나의 플롯에 그리기


     
      # dog.bmp 영상을 컬러로 불러와 3채널을 계산하여 히스토그램 그리기
      # 단, 하나의 plot에서 BGR 그래프를 그리기 (색상을 다르게 표현)

      import cv2
      import matplotlib.pyplot as plt

      img = cv2.imread('./dog.jpg')

      colors = ['b', 'g', 'r']
      bgr = cv2.split(img)

      for (b, c) in zip(bgr, colors):
          hist = cv2.calcHist([b], [0], None, [256], [0, 256])
          plt.plot(hist, color = c)

      cv2.imshow('img', img)
      plt.show()

      cv2.waitKey()

 

 

'AI > 컴퓨터 비전' 카테고리의 다른 글

06. 이진화  (0) 2024.07.18
05. 마스크, 관심영역  (0) 2024.07.18
04. 평활화, 색공간, CLAHE, 정규화  (1) 2024.07.17
02. OpenCV 라이브러리  (3) 2024.07.16
01. 컴퓨터 비전  (3) 2024.07.16