이번 시간에는 이전 시간에 자른 이미지를 다시 하나로 합치는 방법을 배워보도록 하겠습니다.
input
import sys
import cv2
def merge_image(tiles, m, n):
# 결과 이미지를 저장할 변수 초기화
result = []
for i in range(n):
row_tiles = tiles[i * m:(i + 1) * m]
# 타일 이미지 가로로 합치기
row_image = cv2.hconcat(row_tiles)
result.append(row_image)
# 결과 이미지 세로로 합치기
output = cv2.vconcat(result)
return output
merge_image라는 이미지를 합치는 함수를 만들기 위해 result라는 빈 배열을 만들어 줍니다.
row는 가로(열)이며 hconcat함수를 이용하여 가로로 합쳐진 데이터를 생성하고, append를 이용하여 빈 배열 result에 데이터를 밀어 넣어줍니다.
vconcat을 이용하여 완성된 가로 데이터들을 합쳐준 후 값을 반환해 줍니다.
input
def main():
# 명령줄 인수 오류확인
if len(sys.argv) != 5:
print("잘못된 입력입니다. 입력파일이름, 행, 열, 출력파일이름을 이용해 주세요")
return
prefix_input_filename = sys.argv[1]
m = int(sys.argv[2])
n = int(sys.argv[3])
output_filename = sys.argv[4]
# 타일 이미지 로드
tiles = []
for i in range(m * n):
tile_file_name = f"{prefix_input_filename}_{i}.jpg"
tile_image = cv2.imread(tile_file_name)
if tile_image is None:
print(f"파일을 읽는데 실패했습니다{i}.")
return
tiles.append(tile_image)
# 이미지 합치기
output = merge_image(tiles, m, n)
# 출력 파일명 생성
output_file_name = f"{output_filename}.jpg"
# 결과 이미지 저장
cv2.imwrite(output_file_name, output)
print(f"{output_file_name}로 저장되었습니다.")
# 실행문
if __name__ == "__main__":
main()
배열을 나누는 프로그램과 같이 입력파일, 행, 열, 출력파일을 받을 것이기 때문에 argv[인덱스]를 이용하여 해당 값들이 잘 들어왔는지 확인합니다.
타일 이미지를 불러오기 위해 새로운 빈 배열을 만든 후 prefix_input_filename(횟수).jpg의 값을 읽도록 합니다.
만약 파일이 없을 때를 대비하여 오류 검출 내용을 if문으로 추가해 준 후 완성된 이미지 데이터를 빈 배열 tiles안에 넣어줍니다.
마지막 함수들을 활용하기 위해 넣은 코드입니다.
이번 시간에는 저번시간에 만든 이미지 데이터를 출력하기 합친 후 출력하기 위한 프로그래밍을 해 보았습니다.