오늘은 간단하게 이미진 변환을 하는 방법을 배워보도록 하겠습니다.
OpenCV란 영상 처리에 사용할 수 있는 오픈 소스 라이브러리입니다.
예시로
OpeenCV는 알고리즘 상으로 계산 효율성과 실시간 응용 프로그램에 중점을 두고 설계되었기 때문에 간다하게 제공되는 API를 활용하여 코딩하여 실시간 프로세싱이 가능한 어플리케이션을 만들 수 있습니다. 또한 최적화나 알고리즘을 생각하지 않고도 품질 좋은 상용 프로그램을 만들 수 있습니다.
BSD란
해당 소프트웨어를 아무나 개작 및 수정 후 배포가 가능합니다. 수정본의 재배포는 의무적인 사항이 아니므로 프로그램을 공개하지 않아도 되며 상용 소프트웨어에서도 사용할 수 있는 것을 말합니다.
input
import cv2
def cut_image(image_file, m, n, output_filename):
# 이미지 파일 읽기
image = cv2.imread(image_file)
# 오류 검출
if image is None:
print("이미지를 불러오는데 실패하였습니다.")
return
cv2.imread로 파일을 읽도록 하고 파일이 존재하지 않는다면 오류 문구를 내보내는 if문도 만들어 줍니다.
input
# 이미지 크기 조정
if image.shape[0] % n != 0: # 나머지가 0이 아닐 경우 높이 - 나머지
image = image[:-(image.shape[0] % n), :]
if image.shape[1] % m != 0:
image = image[:, :-(image.shape[1] % m)]
# 이미지를 m x n 크기로 나누기
tile_height = image.shape[0] // n
tile_width = image.shape[1] // m
m과 n 즉 행열을 받아와서 이미지를 자를 것 입니다. m과 n에 의해 이미지를 자를 때 나머지가 있으면 자를 때 오류가 생기기 때문에 나머지 만큼 이미지를 미리 조정을 해줍니다.
input
# 타일 이미지 저장
tiles = []
for i in range(n):
for j in range(m):
# 타일의 좌측 위부터 계산
top = i * tile_height
left = j * tile_width
# 타일 이미지 가져오기
tile = image[top:top+tile_height, left:left+tile_width].copy()
# 변형 적용
if random.random() < 0.5:
tile = cv2.flip(tile, 1) # mirroring
if random.random() < 0.5:
tile = cv2.flip(tile, 0) # flipping
if random.random() < 0.5:
tile = cv2.rotate(tile, cv2.ROTATE_90_CLOCKWISE) # 90 degree rotation
tiles.append(tile)
# 출력 파일명 생성
output_file_name = f"{output_filename}_{i}_{j}.jpg"
# 타일 이미지 저장
cv2.imwrite(output_file_name, tile)
print(f"타일 ({i}, {j})이 {output_file_name}으로 저장되었습니다.")
return tiles
타일을 저장하기 위해서 빈 배열을 만들어 주고, 좌측 상단부터 이미지를 계산하여 0.5(50%)확률로 filp 또는 rotate를 하도록 합니다
flip에서 매개변수는 (데이터, 상하좌우)입니다. 1은 좌우 0은 상하로 이미지를 변환 시켜줍니다.
rotate의 매개변수는 (데이터, 회전각도)입니다. 저는 90를 회전시키기위해 90을 주었습니다.
append를 이용하여 하나하나 변환시킨 데이터를 tiles에 넣어줍니다.
넣은 파일들을 생성하기 위해 i와 j는 m과 n의 숫자를 나타내어 저장된 데이터가 무엇인지 알려줍니다.
input
def main():
# 명령어 입력 확인
if len(sys.argv) != 5: # 실행파일, 입력파일이름, 행, 열, 출력파일이름 총 5개 입력이 되지 않을 경우 오류
print("잘못된 입력입니다. 출력파일이름, 행, 열, 입력파일이름을 이용해 주세요")
return
# argv[]로 각 인덱스마다 값을 확인 및 입력
image_file_name = sys.argv[1]
m = int(sys.argv[2])
n = int(sys.argv[3])
output_filename = sys.argv[4]
# 이미지 자르기 및 타일 이미지 저장
cut_image(image_file_name, m, n, output_filename)
if __name__ == "__main__":
main()
출력파일이름, 행,열, 입력파일이름을 제대로 입력했는지 확인하기 위해 명령어 갯수를 파악하고
오류가 있을시에는 오류문을 출력하고 제대로 입력했을 시 cut_image함수를 작동 하도록 합니다.
sys.argv[인덱스]를 이용하여 입력 데이터를 확인합니다. C언어의 argc, argv랑 같은 동작을 합니다.
다음시간에는 변환시킨 데이터를 다시 하나로 합치는 방법을 배워보도록 하겠습니다.