파이썬 NUMPY 이미지 파일 색깔 수정하

2023. 8. 3. 17:00DATA PROGRAMMING/PYTHON

문제:

 

이미지 픽셀을 변경해주는 함수를 제작해봅시다.

  1. 이미지를 Array로 변환합니다.
  2. 주어진 시작 좌표와 가로, 세로 길이만큼 원하는 색상으로 변경합니다.
  3. 값을 수정한 Array를 이미지로 만들어서 반환합니다.

modify_image()
매개변수

  • 이미지: image: PIL.Image()
  • 시작 x좌표: x: int
  • 시작 y좌표: y: int
  • 가로 길이: width: int
  • 세로 길이: height: int
  • 변경할 색상: color: List[int],

반환값

  • 픽셀 변경을 진행한 이미지

 

내가 처음 작성한 코드

def modify_image(image,x,y,width,height,color) :
    image_array = np.array(image)
    image_array[x:x+width][y:y+height] = np.array(color)
    img = Image.fromarray(image_array)
    
    return img


modify_image(kitten,20,20,25,30,[0,0,0])

결과

나는 x : 20~25, y : 25~30의 좌표를 검은색으로 수정하고 싶었지만, 결과는 그렇지 못했다 이유는  무엇일까?

 

2차원 array를 슬라이싱 할때는 각 차워별로 슬라이싱하면 원하는 결과가 나오지 않고 한꺼번에 슬라이싱을 해줘야 하기 때문이다 즉, array[0:2][0:2]가 아니라 , array[0:2,0:2]로 수정해야 원하는 결과가 나온다. 

 

예를들어 list_s = [[1,2,3,4],[7,8,9,0]]이 있을때 [[1,2],[7,8]]를 뽑아오고 싶다면 list_s를 넘파이를 활용해 array로 바꾸고 슬라이싱을 해주면 된다. 이때, list_s[0:2][0:2]가 아니라 list_s[0:2,0:2]로 해야한다. 이를 이용해 위 코드를 수정하면

 

def modify_image(image,x,y,width,height,color) :
    image_array = np.array(image)
    image_array[x:x+width,y:y+height] = np.array(color)
    img = Image.fromarray(image_array)
    
    return img


modify_image(kitten,20,20,25,30,[0,0,0])

원하는 결과가 나오는 것을 확인할수 있었다. 또한 이중 for문을 활용할 수도 있다.

def modify_image(image,x,y,width,height,color) :
    img_arr : np.array(image)
    for j in range(0,height+1):
        for i in range(0,width+1):
            img_arr[j,i] = np.array(color)