파이썬(Python)/opencv

[Python]OpenCV 이미지 픽셀로 변경하여 수정하기(Numpy array)

끄적끄적아무거나 2022. 3. 22. 19:05
반응형

 

목차

     

     

    OpenCV 이미지 픽셀(Pixel)값 확인하기

     

    우리가 사용하는 컴퓨터의 이미지 파일은 아시다 시피 디지털(Digital)로 되어 있습니다. 화면으로 보이는 값은 실상 픽셀이라는 작은 단위를 BGR(Blue, Green, Red)의 비율로 원하는 색상을 표현해주는 것입니다. 

     

    파이썬의 OpenCV 라이브러리를 사용해서 이미지 파일을 읽으면 출력 값은 Numpy(넘파이) array 형태로 숫자로 나옵니다. 즉 픽셀 위치에 따라 배열로 구성되고 구성 값은 BGR값이 되는 것입니다.

     

     

    아래 예제는 이미지 파일을 읽고 읽은 파일의 종류와 값을 확이하는 작업입니다. 

     

    이미지는 무료이미지 사이트에서 포르쉐 자동차 사진을 다운 받아서 사용하였습니다.

     

     

    예제 코드>>

    import cv2
    
    img=cv2.imread("porsche.jpg")
    print("Size info : ",img.shape)
    print('Height : ',img.shape[0])
    print('Info type : ',type(img.shape[0]))
    
    print(type(img))
    print(img)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    3번 라인: imread 함수를 사용해서 jpg 파일을 읽어서 img에 저장합니다.

    4~6번 라인: jpg 이미지(image)파일의 넓이 높이 정보를 가져 옵니다.

    8번 라인: img 변수에 들어간 데이터 형태를 확인합니다.

    9번 라인: img 변수의 데이터 값을 확인합니다.

     

     

    결과>>

     

    아래 결과와 같이 img 변수는 numpy array 형태로 저장되었고 값은 각 픽셀의 정보를 담은 배열/행렬(Matrix) 값입니다.

    Size info :  (836, 1920, 3)
    Height :  836
    Info type :  <class 'int'>
    <class 'numpy.ndarray'>
    [[[22 15 12]
      [22 15 12]
      [19 14 11]
      ...
      [38 35 21]
      [38 35 21]
      [37 34 20]]
    
     [[23 16 13]
      [23 16 13]
      [20 15 12]
      ...
      [37 34 20]
      [38 35 21]
      [37 34 20]]
    
    ...
     
     [[20 17 12]
      [19 16 11]
      [18 15 10]
      ...
      [19 18 14]
      [19 18 14]
      [19 18 14]]]

     

     

     

    다음 예제는 x축 100번째 y축 100번째에 해당하는 픽셀의 BGR 값을 불러오겠습니다.

     

    예제 코드>>

    import cv2
    
    img=cv2.imread("porsche.jpg")
    
    print("BGR of (100, 100) Pixel: ",img[100,100])
    print("Blue of (100, 100) Pixel: ",img[100,100,0])
    print("Green of (100, 100) Pixel: ",img[100,100,1])
    print("Red of (100, 100) Pixel: ",img[100,100,2])
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    5~8번 라인: 행렬의 위치 값을 인자로 넣고 3번째 인자는 BGR의 위치 값을 알려 줍니다. 0은 파랑(Blue) 1은 녹색(Green) 2는 빨간색(Red)입니다.

     

    결과>>

    BGR of (100, 100) Pixel:  [30 29 25]
    Blue of (100, 100) Pixel:  30
    Green of (100, 100) Pixel:  29
    Red of (100, 100) Pixel:  25

     

     

     

     

    OpenCV 이미지 부분 잘라(오려)내기

     

    이번 예제는 앞서 배운 픽셀 배열 값을 사용해서 원하는 부분을 일부만 가져와서 이미지를 출력하는 예제를 실행해보겠습니다. 

     

    부분의 위치를 파악하기 위해 우선 이미지의 전체 사이즈에 대한 정보는 Numpy array shape 함수를 사용해서 확인합니다. shape 함수에 대한 사용은 아래 링크를 참조하길 바랍니다. (https://scribblinganything.tistory.com/484)

     

    다음으로 자르는 작업(Cut)은 단순히 배열의 속성을 이용해서 원하는 위치의 픽셀을 지정하는 방식으로 진행하겠습니다.

     

     

    예제 코드>>

    import cv2
    from cv2 import imshow
    
    img = cv2.imread("porsche.jpg")
    re_img = img[300:600, 500:1200]
    
    print("Pixel Size: ",img.shape)
    
    imshow("resize", re_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    5번 라인: 행렬의 픽셀 y축은 300~600픽셀까지이고 x축은 500~1200 픽셀(Pixel)로 잘라냅니다. 

    9번 라인: 원본 이미지의 사이즈를 확인합니다. 5번 라인의 픽셀 값이 원본 이미지보다 클 경우 수정 해줍니다.

     

     

    결과>>

    Pixel Size:  (836, 1920, 3)

     

    포르쉐 차량의 일부가 멋지게 잘렸습니다. Pixel Size에서 836은 y축 방향의 전체 길이이고 1920은 x축 방향의 전체 길이입니다. 3은 3개의 Layer로 되어있다는 뜻으로 BGR 색상 값입니다.

     

     

     

    위의 Editing 방식으로 이미지를 합치(Combine)거나 덥거(append)나 수정이 가능 합니다.

    반응형