본문 바로가기

카테고리 없음

OpenCV 패딩으로 정사각형 만들기

이미지의 비율을 맞추려면 padding으로 정사각형을 만드는 방법이 있다.

일반적으로 resize하게 되면 비율이 다 망가지는데, 딥러닝 돌릴 때 이런 것들을 그냥 무시하고 정해진 size대로 resize하는 경우가 있다. 생각보다 이 방법만으로도 모델이 예측하는 성능을 높일 수 있다.

 

연구는 별 거 없다. 생각보다 간단한 경우에서부터 성능을 향상할 수 있는 것이다.

이런 모든 것이 개선된 다음에야 더 세부적으로 들어가는 거라고 생각한다.

 

사실 이미 Pillow로 구현된 것이 있고, 그걸 그대로 OpenCV 방식으로 바꾼 것이다.

검색하면 Pillow로 된 것이 먼저 나올 것이다.

input은 opencv Mat 형태이며, background_color는 Scalar로 쉽게 말해서 그냥 BGR 튜플 넣어주면 된다

 

예를 들어,

image = cv2.imread("test.png")

background_color = (255,0,0)

 

이렇게 알아서 custom 해주고, 

 

나는 지금 경계 채우는 것을 BORDER_REPLICATE로 하였는데, 이미 이정도를 검색하시는 분들은 다 아시겠지만 cv2.BORDER_CONSTANT 였나 이거든지 Custom 해서 사용하자

 

def expand2square(image,background_color):
    height, width,channel = image.shape
    
    if width == height:
        return image
    elif width > height:
        dif = width - height
        image = cv2.copyMakeBorder(image, dif//2, dif//2, 0, 0, cv2.BORDER_REPLICATE, background_color )
        return image
    else:
        dif = height - width
        image = cv2.copyMakeBorder(image,0,0, dif//2, dif//2, cv2.BORDER_REPLICATE, background_color )
        return image