Skip to main content

PIL

Jupyter Notebook

이번 시간에는 파이썬으로 이미지를 어떻게 처리하느냐

이런거를 좀 잠깐 해볼 건데요 그 이게 시작 버튼이 왼쪽에 있어가지고 아 모니터가 2개 있으니까 좋은 점도 있는데 나쁜 놈 되구요

그 시작 버튼 눌러 가셨고 어 제이 유피 이런식으로 치시면 주피터 노트북 이라는 앱이 아마 깔려 있을 겁니다 설치되어 있으시죠

그래서 요거를 이제 실행을 하시면 이렇게 까만 창이 하나 뜨구요

그 다음에 인터넷 창이 이런 식으로 조금 기다리시면 이렇게 인터넷 창이 또 하나 이렇게 뜹니다

다시 설명드리면 시작 버튼 누르시고 어 제이 유피 요런식으로 쓰시면 주피터 노트북 이란 앱이 나올 거거든요

요거를 켜시면 이렇게 까만창이 하나 뜨고 그 다음에 인터넷 창이 이런식으로 요거를 켜시면 이렇게 까만 창이 하나 뜨고 그 다음에 인터넷 창이 하나 뜨고 그 다음에 인터넷 창이 이런식으로 띄웁니다

그 다음에 그 아까 데이터 파일 다운 받은 거를 바탕화면에다가 폴더를 하나 만들어서 컴퓨터 비전 이렇게 하나 만들어 가지고 여기다가 이제 실습 데이터를 풀어 주시면 되겠죠

일단 이거 풀어놓고 그 다음에 아까 이제 인터넷 창이 이렇게 있는데 요 창이 뭐냐

주피터 노트북은 뭐냐 요 얘기를 잠깐 드리면 우리가 그 파이썬을 쓸 건데 파이썬이라는 거는 이제 언어거든요

언어라는 게 뭐냐

우리가 이제 컴퓨터하고 대화를 해야 됩니다

컴퓨터하고 프로그램이라는 게 결국 이제 컴퓨터랑 대화를 하는데 컴퓨터가 알아들을 수 있는 말로 대화를 해야겠죠

그래서 이제 컴퓨터와 대화할 수 있는 언어가 여러 가지가 있습니다

그래서 좀 쉬운 말로 할 수도 있고 조금 어려운 말로 할 수도 있는데 파이썬은 쉬운 말이에요

어려운 말로 하면은 장점이 컴퓨터한테 좀 정확하게 우리가 얘기를 할 수 있기 때문에 컴퓨터가 빨리빨리 작동하게 할 수 있습니다

근데 그 대신에 우리가 좀 어렵죠

우리랑 컴퓨터는 생각하는 방식이 다르니까 컴퓨터에 맞춰서 말을 해주면 컴퓨터가 빨리빨리 이해하고 빨리빨리 돌아갈 수 있지만 우리가 코드를 짜기가 어렵습니다

파이썬은 쉬워요

우리가 좀 쉽게 쓸 수 있고 근데 컴퓨터는 처리를 좀 더 많이 해야겠죠

그 말을 이해하기 위해서 그래서 조금 느립니다

쉽지만 좀 느려요

근데 보통 우리가 파이썬으로 하는 종류의 작업들은 코드를 짜는 시간을 많이 할 수 있겠죠

그래서 조금 느립니다

쉽지만 좀 느려요

근데 보통 우리가 파이썬으로 하는 종류의 작업들은 코드를 짜는 시간을 많이 할 수 있어요

코드 시간은 길고 돌리는 시간은 짧아요

그러면 컴퓨터가 5% 10% 빨리 돌아가 봤자 어차피 그렇게 오래 걸릴 작업이 아니란 말이에요

그러면 여기서 시간을 아껴봤자 총 작업 시간에는 별 이득이 없는 거죠

근데 코드를 짜는 시간은 컴퓨터는 빨라 봤자 5% 10% 차이지만 사람은 생각하는 시간이 5% 10% 차이니까 사이가 아니거든요

그래서 한 시간 걸릴 거를 5분 만에 짤 수 있느냐

이러면 총 작업 시간이 예를 들면 한 시간 걸려서 짜가지고 이거를 1분 만에 돌려봤자 5분 걸려서 짜고 2분 걸려서 돌리는 게 총 작업시간이 훨씬 적게 걸린단 말이에요

그래서 효율성 측면에서 우리가 이제 약간 느리더라도 쉬운 파이썬 언어를 보통 데이터 처리하는 그런 종류 아니면 AI 이런 종류의 작업에 굉장히 많이 사용을 합니다

그래서 우리가 이제 파이썬을 사용을 할 거고요

그럼 이제 언어니까 컴퓨터랑 대화를 하려면 우리가 다른 사람하고 이야기를 하려면 예를 들면 카톡 같은 앱을 써서 대화를 하죠

그래서 너도 카톡이 있고 나도 카톡이 있어야 카톡으로 대화가 되잖아요

근데 대화를 할 때는 한국말로 대화를 하죠

앱은 카톡을 쓰고 말은 한국말로 하듯이 우리가 파이썬이라는 건 언어기 때문에 말은 파이썬으로 하는데 그 말을 컴퓨터랑 주고받을 프로그램이 필요합니다

그래서 이제 주피터 노트북은 뭐냐 하면 컴퓨터와 파이썬으로 대화를 하기 위한 앱이다

이렇게 생각을 하시면 됩니다

우리가 마치 카톡으로 다른 사람과 대화하듯이 컴퓨터와 대화할 때는 꼭 주피터 노트북만 써도 되죠?

주피터 노트북만 써도 되죠?

이제 이제 다 써야 되는 건 아닌데 그 외에도 여러 가지 툴이 있습니다

근데 우리가 다른 사람과 대화할 때 문자를 보낼 수도 있고 라인을 쓸 수도 있고 카톡을 쓸 수도 있고 텔레그램을 쓸 수도 있고 앱은 여러 가지지만 보통 카톡을 쓰듯이 파이썬을 쓸 때도 여러 가지 앱들이 있는데 보통 주피터 노트북을 가장 많이 사용을 합니다

그래서 이거를 써볼 거고요 그래서 여기 보시면 인터넷 창이 뜨기는 하는데 실제로 인터넷을 하는 건 아니고 그냥 화면을 구성하기 위해서 인터넷 창을 사용을 하는 거예요

그래서 주소를 보시면 주소가 특이하게 로컬 호스트 이렇게 나오는데 로컬 호스트라는 건 뭐냐면 내 컴퓨터를 말합니다

여러분 컴퓨터 안에서 마치 인터넷을 하는 것처럼 흉내를 내고 있는 거예요

그래서 아까 떴던 이 까만 창 있죠

인터넷을 하면 원래 먼 거리에 있는 서버에 접속을 하는데 이 까만 창이 서버 역할을 하는 창입니다

이 창을 닫으시면 안 돼요

이 창을 닫으시면 서버가 없어지니까 안 되고 여기서 이제 하시면 되고요 그 다음에 여기 보시면 폴더들이 있는데 이 폴더들이 여러분 컴퓨터 안에 있는 폴더들입니다

그 중에 보시면 위에서 세 번째 데스크탑이라고 있거든요

그게 여러분 컴퓨터의 바탕화면이에요

그래서 데스크탑으로 더블클릭해서 들어가시면 아까 만들었던 컴퓨터 비전 폴더가 여기에 있을 겁니다

그래서 그래서 그래서 이 폴더로 다시 더블클릭해서 들어가주세요 그래서 사실 우리 어디 갔습니까

우리 여기 홈페이지에 실습 및 Q&A가 제가 써놨는데 주프터 노트북 켜고 그 다음에 데스크탑 고르시고 컴퓨터 비전 골라서 들어가시면 됩니다

만약에 폴더를 나는 다른 이름으로 해놨다 폴더 이름으로 해놨다 폴더 이름으로 바꿔주시면 되겠죠

컴퓨터 비전까지 들어간 다음에 오른쪽 상단에 보시면 New라고 있어요

좀 키워드리면 New라고 있는데 이걸 누르시면 노트북이라고 있습니다

그래서 이거를 누르시면 됩니다

그 다음에 여기 셀렉트 커널 이렇게 뜨면 셀렉트 누르시면 됩니다

제가 여기다 써놓은 거랑 좀 다릅니다

여기 중간에가 좀 빠졌는데 New 누르시고 New 누르고 노트북 그 다음에 셀렉트 커널이라고 뜨면은 그냥 셀렉트 누르시면 됩니다

그러면은 이제 이런 화면이 뜰 겁니다 여기까지 오셨으면은 우리의 실습할 준비가 다 된 거예요

네 받을게요 다른 분들도 데스크탑 없나요?

네 그러면은 다운로드로 하시죠

그리고 바탕화면이 있는 거를 제가 한번 해볼게요

그러면 우리가 실제로 한번 컴퓨터로 대화를 해보도록 하겠습니다.

파이썬을 안 써보신 분도 있으니까 첫 번째 우리 대화는 아주 간단한 대화를 해보죠.

1 더하기 2 이렇게 한 다음에 여기 상단에 보시면 재생 버튼 같이 생긴 게 있거든요.

이거를 눌러주시면 3이라고 대답을 합니다.

카톡이랑 똑같아요.

여러분이 말을 거시면 컴퓨터가 대답을 합니다.

대답을 재깍재깍 하죠.

여러분이 말을 걸지 않으면 컴퓨터는 대답을 합니다.

그래서 여기다 1 더하기 2 이런 식으로 4의식을 쓰시고 재생 버튼을 누르시면 한 번에 대화가 끝난 거예요.

여기 보시면은 untitled.ipymb 라는 파일이 생겨있을 겁니다

이게 뭐냐면 여러분이 주피터 노트북에서 컴퓨터랑 파이썬으로 대화를 하면 자동으로 대화 기록이 여기 저장이 돼요

그래서 내일 다시 열어보실 수도 있고 나중에 다시 대화 내용을 볼 수가 있습니다

근데 파일 이름이 untitled 이래가지고서야 나중에 찾아보기가 좀 불편하겠죠

그래서 이름을 바꾸시려면 어떻게 하면 되냐면 여기 상단의 메뉴에서 저는 가려져 있는데 view를 누르면 view 누르면 위에서 하나 둘 셋 네번째 show header 라고 있습니다

이걸 누르면은 이렇게 표시가 떠요

이미 떠있으신 분들은 이제 체크를 풀면은 없어집니다

다시 여기 메뉴에서 file edit view view에서 누르면 show header 라고 있는데 이걸 켜주면은 이렇게 상단에 header가 보이는데 평소에 쓸 때는 사실 필요가 없으니까 가려놓으시면 되는데 이렇게 켜주면은 이렇게 상단에 header가 보이는데 여기 보시면 untitled 라고 있죠

그래서 요걸 누르면 이름을 바꿀 수가 있습니다

파일 이름을 그래서 오늘이 첫날이니까 day1 이렇게 바꿀 수가 있겠죠

여기서 바꿔주면은 컴퓨터에서도 day1으로 자동으로 이름이 바뀝니다

그래서 이렇게 바꾸시면 된다 자 some 그래서 요거를 적어드리면 메뉴에서 view 하고 show header 한 다음에 untitled를 클릭을 하고 이렇게 바꾸시면 됩니다

평소에는 화면만 차지하니까 화면을 넓게 쓰려면 숨겨놓으면 편하겠죠

PIL 라이브러리

자 그러면은 우리가 이제 본격적으로 한번 파이썬으로 이미지 처리를 하는 걸 해볼건데 우리가 이제 PIL이라는 라이브러리를 써볼겁니다

일단 라이브러리는 PIL이라는 라이브러리를 써볼겁니다

라이브러리라는 용어가 나오는데요

라이브러리는 뭐냐면 라이브러리가 도서관이잖아요

도서관에는 책들이 모여있죠

프로그래밍에서 라이브러리는 기능의 모음 이런거라고 생각하시면 될 것 같아요

우리가 언어만 있으면 말이 통하는게 아니고 어떤 표현들을 알아야 되죠

잘 모르는 분야에 가면 한국말로 하는데 뭔소리인지 알아들을 수가 없잖아요

용어를 모르니까 그러니까 프로그래밍에서도 말만 있으면 되는게 아니라 어떤 기능이 필요한데 그 기능들을 모아놓은게 라이브러리입니다

그래서 우리가 이제 이번 수업에서 사실 쓸거는 PIL이 아니라 오픈CV인데 PIL이 가장 기본적인 기능을 쉽게 쓸 수 있게 제공을 하기 때문에 요것도 가볍게 한번 알아볼거에요

이미지 열기

그래서 이제 PIL을 써볼건데 일단 이제 문법을 모르시는 분들이 있으니까 문법을 좀 알아볼게요

문법을 설명을 드리면 먼저 우리가 어떤 라이브러리를 쓰려면 라이브러리를 불러와야 됩니다

from PIL import Image

불러오는데 어떻게 불러오느냐 그냥 영어처럼 생각하시면 되요

보시면 from 어디어디에서 이런 뜻이죠

PIL 대문자로 쓰셔야 됩니다

파이썬에서는 대소문자를 구별을 하기 때문에 대문자랑 소문자랑 다른 글자에요 대문자로 단 대문자 대문자로 PIL이라고 쓰시고 그 다음에 import 이거는 이제 직역하면 수입하다

이런 뜻인데 우리가 포트에 임하는 거니까 수입을 하는 거죠

수입하다인데 파이썬에서는 가져와라

이런 뜻입니다

뭘 가져오냐면 I가 대문자입니다

이거는 대문자 이미지를 가져와라

근데 여기서 이제 이미지라는 거를 그리기 위해서는 그림을 가져오라는 게 아니라 이미지를 관리하는 어떤 도구를 가져오라는 겁니다

저기 PIL에 가서 이미지 관리하는 도구 좀 가져와라

이렇게 시키는 거예요

그래서 여기 이제 뒤에서부터 보시면 이미지점 오픈 한다는 거 이렇게 나오는데 그래서 얘가 그림도 열어주고 이런 거를 합니다

여기서도 플레이 버튼을 누르면 실행이 되죠

그래서 아무 말이 없으면 실행이 잘 된 겁니다

만약에 이제 PIL이라고 쳐야 되는데 손이 약간 미끄러져서 PIK 뭐 이런 식으로 잘못 눌렀어요 실행을 해보면 뭔가 에러가 나죠

에러가 나면은 안 됐다는 얘기인데 파이썬에서는 보통 성공하면 아무 말이 없습니다

딱히 뭐 일각일 계산 결과가 있는 경우가 아니라면 잘 됐으면 아무 말이 없고 뭐가 안 됐을 때 에러가 나죠.

그래서 아무 말이 없으면 잘 된 건데 에러가 나면은 어떻게 하시면 될까요?

저한테 얘기하시면 됩니다

손 들고 얘기하시면 돼요

그래서 에러가 안 났으면은 잘 된 겁니다.

img = Image.open("balloon.webp")

그러면은 우리가 파일 중에 balloon이라는 이미지 파일이 있어요

요런 애들을 함수라고 부르고요 쉽게 생각하면 일종의 명령이라고 생각하시면 됩니다

엑셀에도 함수라고 해서 합계를 구한다던가 이런 기능을 사용할 수 있잖아요

프로그래밍에서 함수는 어떤 기능 또는 명령이라고 생각하시면 됩니다

그래서 이제 뭘 열거냐 하면 괄호하고 여기에 뭘 열지가 들어가는데 파일 이름을 여기다 써주면 되겠죠

파일 이름을 써주는데 앞뒤로 이렇게 따옴표를 붙여줍니다

왜냐하면 따옴표를 안 붙이면 이게 지금 여기도 보시면 image.open 이런식으로 쓰잖아요

따옴표를 안 쳐주면 이게 명령인지 뭔지 알 수가 없어요

그래서 이거는 무슨 명령이나 이런게 아니라 글자 그대로 berlun.wp 라는 어떤 파일 이름이다

그래서 따옴표는 이거는 그냥 문자라는 표시입니다

이거는 어떤 명령으로 해석할 수 있습니다

그래서 따옴표는 이거는 그냥 문자라는 표시입니다

이거는 어떤 명령으로 해석할 수 있습니다 생각하지 말고 b-a-l-l-o-o-n.w-e-b-p 라는 글자 그대로 니가 이해를 해라

이런 이름의 파일을 열어라

이런 얘기입니다

그 다음에 여기 는이 나오는데 는은 수학기호의 등호가 아니라 오른쪽에서 처리한 결과를 왼쪽에다가 집어넣어라

이런 얘기입니다

img

그래서 이 파일을 열었으면 그 파일의 내용이 있겠죠

그래서 그 파일의 내용이 그림의 내용이 요 img 라는 여기에 들어가게 됩니다

그래서 이제부터는 img 라고 하면 요 파일의 내용 즉 그림을 가리키게 됩니다

그래서 우리가 그냥 img 라고 치면 은 어떻게 된지 한번 봅시다

그래서 이렇게 그림을 보여줍니다.

마치 1 더하기 1은 3을 하는 것과 마찬가지로 컴퓨터 입장에서는 1 더하기 1이나 그림이나 어차피 그냥 어떤 숫자들일 뿐이에요.

화면에 뿌려주는 것은 1 더하기 1을 하는 것과 그림을 불러오는 것은 똑같은 겁니다.

그래서 이렇게 하시면 이렇게 그림이 뜹니다.

그림을 열어오는 데까지 해보시면 되겠고요.

그 다음에 프로그래밍 경험이 없으시거나 하신 분들은 타이핑이 생각보다 시간이 많이 걸리거든요.

타이핑하는데 시간이 너무 많이 걸립니다.

그러면 강의 자료를 제가 PDF로 드렸으니까 강의 자료에서 그냥 복사해서 붙여 넣으셔도 됩니다.

사실 타이핑보다 이렇게 아 이게 뭘까요?

아 이게 뭘까요?

뭘 하는 코드구나.

이거 이해하시는 게 더 중요해요.

타이핑에 시간이 너무 많이 걸리시면 그냥 복사해서 붙여 넣으셔도 됩니다.

그 다음 우리가 지금 수업은 볼륨점 외피로 하는데 파일을 꼭 이걸로 해야 되는 건 아닙니다.

img2 = Image.open("balloon.webp")
img2

그림 파일을 많이 드렸으니까 우리가 다른 그림을 한번 열어볼까요?

그림 중에 뭘로 할까요?

그림 중에 뭐 하나 있어요?

지금 이 그림을 열고 있는데 지금 이 그림을 열고 있는데 에어포트 jpg 이걸 열고 싶다.

그럼 이거를 여기 들어가는 글자를 바꾸면 되겠죠?

에어포트 점 jpg 이렇게 하면은 공항 사진이 불러와지겠죠.

이렇게 하면은 공항 사진이 불러와지겠죠.

그래서 이 그림을 바꾸면은 또 다운표 안에 들어가는 파일 이름만 바꾸시면은 원하시는 파일을 넣을 수가 있습니다.

원하시는 파일을 넣을 수가 있습니다.

아 자 우리 19쪽까지 해봤구요

그 다음에 이제 요 파일을 어떤 형식인지 보고 싶다 그러면은 여기도 보면은 이제 img 했는데 요 img 는 우리가 연 파일의 내용이 되겠죠

그래서 지금 img 라고 했는데 요거는 꼭 img 라고 해야 되는 건 아닙니다

이거는 우리가 요 앞에서 요 시점에 새로 만든 거거든요

만들 때는 여러분이 만든 거니까 여러분이 이름을 붙이는 건 여러분 마음이겠죠

그러니까 예를 들면 여기서 제가 img 했는데 뭐 img야

기네 그냥 i로 줄여야겠다 이렇게 해도 됩니다 실행해 보시면 결과는 똑같아요

그러니까 여기를 뭐 i라고 부르던 img 라고 부르던 이거는 여러분 마음입니다 는 기호로 만들어주세요

만드는 거에요

만들어서 여기다 넣는거에요

이미지 파일 형식

img.format

그래서 우리가 이제 img 를 만들었는데 img 점 포맷 하면은 점은 항상 뭐의 이렇게 읽으시면 됩니다

img의 포맷 img의 포맷이 뭐냐 를 물어보는 거죠

그러면은 그것은 webp 입니다

이렇게 대답을 해주게 됩니다

그리고 그래서 일단 여기까지 img 점 포맷 까지 해보시면 되겠습니다

컴퓨터 그래픽에는 방식이 여러가지가 있어요.

방식들을 잠깐 좀 알아보면 비트맵 방식이 있고요.

벡터 방식이 있고 포인트 클라우드 방식이 있습니다.

비트맵은 뭐냐면 이미지를 점으로 찍어서 표시를 하는 것.

예를 들면 가로 세로 4개의 점이 있다.

숫자 1을 그리고 싶으면 여기는 다 까만색으로 채우고 여기만 하얀색으로 채우면 지금 멀리서 보면 멀리서 보면 이렇게 1처럼 보이겠죠.

그래서 픽셀들이 굉장히 작은 점들로 이미지가 이루어져 있습니다.

이런 비트맵 방식이 있고요.

벡터 방식은 뭐냐면 이미지를 표현을 할 때 선으로 표현을 하는 것.

선이라는 것은 결국 점과 점을 이렇게 이으면 선이 됩니다.

벡터 방식의 장점은 뭐냐면 그림을 확대해도 깨지지 않습니다.

왜냐하면 점과 점을 이은 것이기 때문에 확대하고 싶으면 점과 점을 이렇게 멀리 떨어뜨려 놓고 이걸 선으로 이렇게 이으면 반듯하게 됩니다.

그 다음 포인트 클라우드 방식은 점의 3차원 좌표로 표현을 이렇게 했는데 이거는 이제 주로 어디서 쓰냐면 라이다 같은 장비를 할 때 라이다는 라이다가 L로 시작하거든요.

L이 레이저입니다.

레이저를 쏴서 반사가 돼서 튕겨 나오는데 그럼 시간을 재보면 그 거리를 알 수 있을 거 아니에요.

빛의 속도가 고정돼 있으니까.

그러면 반사돼서 찍고 돌아오는 그 점이 있겠죠.

그 점의 좌표로 표현하는 방식이 포인트 클라우드.

그래서 이 점들을 이렇게 뿌려 놓으면 구름 같다고 해서 점의 구름.

포인트 클라우드 이렇게 얘기하는데 우리가 보통 컴퓨터 비전에서는 비트맵 방식을 사용합니다.

그래서 이제 벡터나 포인트 클라우드는 잘 쓰진 않아요.

포인트 클라우드도 근데 이제 우리 라이다 같은 걸 처리하려면 써야겠죠.

비트맵

그런 경우가 아니면 보통은 왜냐면 우리가 제일 많이 쓰는 게 카메라인데 일반적인 그 카메라는 빅트맵으로 원본 데이터가 비트맵이기 때문에 비트맵으로 처리를 합니다.

그래서 이제 비트맵은 픽셀이라고 하는 점들로 저장을 하고 그 다음에 각각의 픽셀마다 밝기가 있어요.

픽셀이 꺼지면 밝기가 0이 되고 그러면 어두우니까 검은색이 되겠죠.

그리고 픽셀이 최대한 밝게 켜지면 흰색이 됩니다.

그래서 중단에서는 회색.

그래서 사실 검은색, 흰색, 회색은 엄밀한 의미에서는 우리가 빨주노초파남보 할 때 색상하고는 다르게 그냥 밝기에 빛이 밝으냐 어두우냐

이런 거고.

그래서 점마다 빛이 밝기도 하고 어둡기도 하고 그랬습니다.

그래서 여기도 보면은 이 화면이 있으면.

이 화면을 이루는 수많은 점들이 있어가지고 이 점 중에 밝은 데는 흰색 어두운 데는 검은색 이렇게 되는 거죠.

그래서 이제 대부분 컴퓨터 비전에서 사용을 하는데 이 비트맵의 약점 중에 하나가 이미지를 확대하거나 축소하는 거에 약합니다.

왜냐하면 점이 커지면 그래서 어차피 점이 사각형이니까 확대를 하면 사각형이 점점 커지겠죠.

그래서 이제 요거를 보관하기 위해서 약간 확대할 때.

점과 점 사이의 색깔을 평균을 내가지고 메꾸는데 평균이란 건 뭐에요?绝

이 색도 아니고 저 색도 아닙니까 애매한 색으로 채우는 거죠.

그래서 보통 작은 이미지를 크게 키워보면 이미지가 약 검에 보이는거.

그 다음에 또 다른 문제는 이미지의 크기가 커지면 점 의 개수가 늘어난 이유가 용량이 커진다는 그런 문제가 있습니다.

그래서 그렇고 그 다음에 이제 이미지를 그럼 컬러로 표현할 때는 어떻게 하느냐 컬러로 표현하면은 픽셀을 여러개 합쳐 가지고 표현을 하는데 우리가 보통 이제 칼라 라고 하면 여러가지 방식으로 할 수 있는데 빛의 3원색이 있어요 빛의 3원색을 RGB 이렇게 쓰는데요 RGB란 말은 많이 들어보셨죠

빨강 레드 초록 그린 파랑 블루 그래서 RGB 세가지 색을 섞으면 이렇게 다양한 색상이 되고 여기서 이제 비율을 조정을 하면은 모든 색상을 표시를 할 수 있습니다

그래서 실제로는 빨간색 픽셀이 있어 가지고 빨간색 픽셀이 최대한 밝아지면 빨간색이 되고 초록색 픽셀이 최대한 밝아지면 초록색이 되고 파란색 픽셀이 최대한 밝아지면 파란색이 되는데 그러면은 파란색 픽셀이랑 빨간색 픽셀을 최대한 둘다 밝게 해주면 보라색이 나오겠죠

그래서 이런식으로 RGB를 RGB 세가지 픽셀을 실제로 액정에서 액정에 물을 한번 묻혀 보시면 빨강 초록 파랑 이렇게 분리되서 보이거든요

평소에는 너무 가까이 붙어 있어 가지고 얘네가 구별이 안되는데 물 같은거 화면에 묻으면 RGB가 색깔이 꺾이는 각도가 달라서 픽셀이 분리되서 보입니다

그래서 정말인가 궁금하시면 저기 화장실 가서 핸드폰에 물 뿌려보세요 화면에 그러면은 RGB로 되어 있구나

이걸 알 수 있구요 그래서 컬러 이미지는 사실은 그냥 RGB 세가지의 밝기를 가지고 있습니다

실제로 이미지가 세 장이 있는거에요

그 다음에 인쇄용 이미지는 색의 삼원색을 사용하는데 물감 같은 경우는 다릅니다

빛은 섞으면 섞을수록 밝아지지만 물감은 섞으면 섞을수록 어두워지거든요

그래서 이제 CMYK 하는데 C는 하늘색이고 M은 자주색 Y 는 노란색 그래서 이거를 이제 여기 오른쪽에 보시면 이거를 섞으면 다른 색깔이 되고 그 다음 이제 까만색을 만들려면 물감 세 개를 다 섞으면 되는데 그러면 이제 종이에다 인쇄를 보통 하니까 물감을 3개 섞으면 돈도 많이 들고 보통 검은색을 제일 많이 써죠

여기서도 보면 검은색이 제일 많잖아요

물감을 3배로 써야 되니까 돈이 아깝단 말이에요

까만색은 물감을 따로 씁니다

그래서 보통 인쇄는 4배 정도를 써야 돼요.

3배집에서 1배 정도는 까만색을 같이 섞으면 이제 물감이 더足니다.

그런데 보통 검은색을 제일 많죠

여기서도 검은색이 제일 많잖아요

물감을 3배로 써야 되니까 돈이 아깝단 말이에요.

그래서 까만색은 물감을 따로 씁니다.

그래서 보통 인쇄는 4가지 색을 써요.

4색으로.

그래서 까만색은 물감을 아끼기 위해서 따로 잉크를 씁니다.

그래서 제일 많이 쓰는 까만색을 따로 하죠.

그래서 프린터 잉크 같은 것도 보시면 아마 4색 토너가 4종류로 되어 있거든요.

까만색 토너는 따로 씁니다.

그래서 이제 보통 컬러 이미지는 RGB로 되어 있거나 인쇄용이면은 물감 색깔에 맞춰서 CMYK 해가지고 4가지로 되어 있습니다.

우리가 색상이 중요한 경우도 있고 중요하지 않은 경우도 있는데 우리 앞에서 얘기했던 일을 좀 작업자가 자리에 앉아 있는 거냐 그럴 때는 색상이 별로 안 중요하죠.

사람 모양이기만 하면 됐지 색깔이 뭔지는 별로 안 중요하죠.

그러니까는 색상이 안 중요하면 우리가 이미지를 흑백으로 변환하면 용량을 1분의 3로 줄일 수가 있습니다.

파일 용량도 줄어들고 계산량도 1분의 3로 줄어드니까 빨리빨리 계산할 수 있겠죠.

그래서 다 그런 거고요.

그 다음에 이제 약간 재밌는 잡지식 하나 우리가 보라색이라고 하는 표현하는 말이 두 가지가 있거든요.

영어로 퍼플이 있고 바이올렛이 있는데 이게 좀 달라요.

실제로는 우리말로는 둘 다 보라색이라고 하는데 실제로는 다른 색입니다.

뭐가 다를까요?

보통 퍼플이라고 하는 보라색은 빨강하고 파랑을 섞은 거를 퍼플이라고 해요.

이게 퍼플입니다.

그 다음에 보라색은 뭐냐면 결국에는 빨주노초파남보가 결국에는 빛의 파장이거든요.

빨강이 파장이 긴 거고 파란색은 파장이 짧은 거죠.

그래서 바이올렛은 뭐냐면 파란색보다 더 파장이 짧은 겁니다.

그래서 빛을 주파수를 보면은 바이올렛은 주파수가 이렇게 돼 있는데 주파수가 일정해요.

근데 퍼플은 빨간색의 주파수랑 파란색의 주파수가 섞여있는 형태입니다.

그래서 실제로는 다른 색이다.

영어로 그래서 우리가 자외선이라고 하는 거잖아요.

그래서 우리가 자외선이라고 하는 거잖아요.

자외선이라고 하면은 자외선의 자가 바이올렛이거든요.

그래서 울트라 바이올렛 돼가지고 UV라고 하잖아요.

퍼플이 아닙니다.

UP가 아니고 UV. 그래서 이거는 약간 잡지식인데 영어로 퍼플하고 바이올렛은 그런 차이가 있다.

그다음에 우리가 비트맵 파일을 저장할 때 포맷이 여러 가지가 있는데 JPG가 있고요.

GIF가 있고 그다음에 PNG가 있고 그다음에 WEPI, TIFF, RAW 이런 포맷들이 있는데요.

이게 뭐가 다르냐면 보통 JPG는 손실 압축이라는 걸 씁니다.

손실 압축이란 건 뭐냐면 이미지를 픽셀 그대로 저장을 해버리면 용량이 너무 많아요.

그래서 용량을 좀 줄이는데 JPG는 화질이 약간 떨어지더라도 용량을 줄일 수 있으면 그 방식을 씁니다.

그래서 JPG로 저장하면 화질이 떨어져요.

근데 우리 눈에 보일 만큼 떨어지진 않아요.

근데 약간 미세하게 떨어집니다.

근데 이제 문제가 뭐냐면 JPG로 저장을 할 때 화질이 약간 떨어져요.

그냥 그대로 놓고 쓰면 상관없는데 이 파일을 다시 포토샵 같은 데서 열어가지고 또 편집을 하고 또 저장을 하면 그때 저장을 하면서 화질이 또 조금 떨어집니다.

그럼 그걸 열었다 닫았다 열었다 닫았다 하면서 그냥 열었다 닫으면 상관없는데 열어서 편집하고 닫고 열어서 편집하고 닫고 이걸 계속 반복하면 그때마다 화질이 조금 조금 조금 떨어져가지고 어느 순간 되면 화질이 굉장히 많이 떨어져요.

그래서 가끔 인터넷 같은 데 보면은 뭐 디지털 풍화 이런 식으로 얘기해가지고 여기 보면

스티브 잡스 사진인데 화질이 굉장히 묘하게 많이 떨어져 있죠.

그리고 여기 오른쪽 보면 사진이 막 초록색으로 가끔 인터넷 하다 보면은 이렇게 옛날 유머 같은 경우에 이런 식으로 화질이 굉장히 떨어져 있는 경우가 있잖아요.

왜 디지털 파일인데 화질이 이렇게 떨어져 있냐 그러면 이게 왜 그러냐면 원본이 JPG로 돼 있었는데 누가 JPG를 캡쳐하고 있는 경우가 있어요.

캡쳐를 해요.

그럼 캡쳐를 한다는 거는 이 화면의 옆에 있는 다른 픽셀들까지 같이 캡쳐가 되거든요.

그걸 저장을 하면 그것도 일종의 편집이죠.

왜냐면 다른 픽셀이 들어가니까 그때 화질이 좀 떨어집니다.

그걸 그대로 복사해가지고 붙여넣기를 해야 되는데 또 캡쳐를 해요.

그러면서 그때 또 화질이 떨어집니다.

그걸 계속 반복을 하니까 화질이 이런 식으로 떨어지는 거예요.

그러니까는 그냥 오른쪽 우클릭해서 저장하면 화질이 안 떨어지는데 캡쳐 같은 식으로 하면 그 캡쳐도 일종의 편집이라서 화질이 떨어집니다.

그 다음에 GIF나 PNG는 비손실 압축이라서 화질이 떨어지지 않습니다.

그 대신에 압축할 수 좀 불리하겠죠.

용량 측면에서 그 다음에 웹피는 뭐냐면 우리 방금 실습했던 웹피 같은 경우는 구글에서 만든 건데 이름에도 웹이 들어가는 걸 보시면 아시겠지만 구글이 검색을 해가지고 사람들이 인터넷을 많이 써야 결국 광고로 돈을 버는 회사인데 보통 인터넷을 할 때 제일 느린 게 뭐냐면 이미지가 로딩되는 시간이 제일 오래 걸린단 말이에요.

이미지가 로딩이 천천히 되면 사람들이 인터넷 하다가 짜증나가지고 인터넷을 안 하든가 아니면 광고 하나라도 더 봐야 되는데 이미지 뜨는 거 기다리니까 인터넷을 빨리빨리 못해서 광고를 안 보겠죠.

그래서 구글이 어떻게 하면 사람들이 인터넷을 더 쾌적하게 해서 결국 자기네 광고를 더 많이 볼까

생각을 하다가 이미지 파일의 포맷이 너무 구리다 해서 만든 게 웹피라는 포맷입니다.

그래서 이 웹피는 기존의 JPG, PNG, GIF의 장점을 다 합쳐가지고 손실 압축하고 비손실 압축을 다 섞어서 씁니다.

손실해도 되는 거면 손실을 하고 손실을 하면 안 되는 건 비손실을 하고 이런 식으로 하고 압축 알고리즘도 더 개선을 해가지고 같은 크기면 더 화질이 좋아요.

그리고 같은 화질이면 용량이 더 작습니다.

그래서 이거는 여러분들이 최근에 나온 포맷이라서 보실 일이 좀 없었는데 요즘에 많이 쓰는 포맷입니다.

TIFF나 RAW는 거의 보실 일이 없는데 이거는 사진 전문가들이 디지털 카메라 대포라고 하죠.

그런 데서 쓰는 거기 때문에 사실 이거는 우리가 별로 볼 일은 없습니다.

그래서 이런 포맷들이 있다.

정리하면 JPG는 손실 압축 방식 약간 화질이 떨어지는 그런 방식이고 GIF나 PNG는 화질이 안 떨어지는 웹피는 최신 포맷 이 정도로 기억을 하시면 되겠습니다.

벡터

그다음에 벡터는 우리가 사실 거의 컴퓨터 비전에서는 쓰지 않지만 쓰지 않는 방식이기 때문에 상관없고 여러분들이 잘 아시는 PDF 같은 게 벡터 방식이에요.

그래서 우리 강의 자료를 PDF로 봤는데 교환을 보면 그래서 여기 지금 보시면 글자가 있는데 확대를 해도 글자가 안 깨지죠.

축소를 하든 확대를 하든 지금 보시면은 막 빨리 키우면은 잠깐 화질이 너무 빨라서 잘 안 보시는데 막 빨리 키우면은 잠깐 화질이 떨어졌다가 다시 보이셨나요?

글자가 잠깐 화질이 떨어졌다가 다시 깨끗해지는 걸 볼 수 있습니다.

그러니까 막 확대를 하면은 잠깐 비트맵을 확대를 했다가 다시 그리는 거예요.

방이라는 글자를 이루고 있는 점들의 위치를 이용해서 방이라는 글자를 다시 그려버려요.

그래서 아무리 확대를 해도 깨지지 않습니다.

깨끗하게 나온다는 장점이 있는데 근데 이거는 이미 이거 자체가 이미 한번 처리된 결과이기 때문에 컴퓨터 비전에서는 보통 이제 카메라로 찍은 걸 가지고 뭔가 하는데 벡터라는 거 자체가 이미 한번 처리된 거라서 이걸 가지고 컴퓨터 비전을 하지는 잘 않아요.

근데 이런 포맷도 있다

정도로 기억을 하시면 될 것 같고요.

포인트 클라우드

그다음에 포인트 클라우드는 아까 얘기 드렸듯이 라이다 같은 장비로 찍으면 우리가 여기다 의자랑 기둥을 하나 넣고 라이다로 이렇게 찍으면 레이저 같다가 반사기 같은 장비로 찍으면 이렇게 한 단에서 튕겨 나오면서 이런 점들로 표시됩니다.

그러면 예를 들면 이 기둥 뒤쪽은 레이저가 뚫고 들어가지는 못하니까 여기가 텅 빈 것처럼 나오겠죠.

그래서 이런 방식이 포인트 클라우드인데 이거는 우리 수업에서는 다루지 않겠습니다.

그래서 아까 보니까 포인트 클라우드 데이터 다루시는 분이 계시던데요.

안타깝게도 포인트 클라우드 방식의 데이터를 다루는 거는 우리 수업에서는 약간 다루지 않고 우리 수업에서는 비트맵 방식의 데이터를 다루는 데까지만 가도록 하겠습니다.

이미지 파일의 크기

자 이렇게 해서 우리가 이제 PIL 기본적으로 이미지 파일 여는 거까지 해 봤고요.

자 그 다음에 이미지 파일의 크기도 한 번 보면 아까 img.format 했죠?

img.size

img.size 하면 말 그대로 사이즈를 줍니다.

그래서 img. size 하면 숫자가 두 개가 나오는데 가로 세로가 각각 몇 픽셀로 이루어져 있느냐 그래서 가로 1024 픽셀, 세로 1024 픽셀로 되어 있다.

지금 이 이미지는 가로 세로가 모양이 똑같아 가지고 구별이 잘 안 되는데 그림이 좀 길쭉한 이미지를 하나 열어보죠.

볼륨 말고 옆으로 긴 거.

에어포트로 바꿔서 열어볼게요.

이거 열어보면 이거는 가로가 길고 세로가 짧죠.

이거를 다시 실행해보면 4096, 2554 이렇게 나오는데 4096, 2554 이렇게 나오는데 가로가 길잖아요.

가로가 4096개의 픽셀로 되어 있고 세로는 2654개의 픽셀로 되어 있다.

그래서 가로 세로 이렇게 길이가 나오게 됩니다.

파일을 다른 걸로 바꿔 가지고 그 위에 거를 고친다고 아래께 다시 자동으로 바뀌진 않거든요.

위의 것을 고쳐서 실행을 하셨으면 아래 것도 다시 실행을 하셔야 결과가 위의 것에 맞춰서 바뀝니다.

그래서 우리가 이제 이거를 바꿔서 돌려보면 어떤 숫자인지 의미할 수 있겠죠.

그 다음에 이제 실행 버튼에 마우스를 얹고 잠깐 기다려 보시면 run this cell and advance 한 다음에 바로 shift 엔터 이렇게 나오는데 저 shift 엔터가 단축 키에요.

그래서 매번 매번 요거 안 누르셔도 여기 명령을 친 다음에 shift 하고 엔터를 같이 누르시면 실행이 됩니다.

그렇게 하셔도 돼요.

그래서 img.size에서 요거 사이즈 한번 확인하고 그래서 img.size에서 요거 사이즈 한번 확인하고 확인해 보시면 될 것 같구요.

이미지 파일의 색상 모드

img.mode

그 다음에 img.mode도 해보시면은 요거부터는 뭐 별거 없죠.

img.mode 해보면 rgb 라고 나오는데 요거는 컬러가 rgb 세가지 3색 모드다.

요런 얘기입니다.

그래서 요것도 자료에 써놨는데 rgb 돼 있으면은 빨강 초록 파랑 레드 그린 블루고 rgb a 라고 돼 있는 이미지도 가끔 있는데 a는 뭐냐면 알파 라고 해서 투명도를 같이 하는거에요.

그래서 가끔 그림 중에 이렇게 ppt가 있는데 얹어 보면은 뒤에가 이제 투명하게 나오는 게 있거든요.

실제로 투명한 건 아니고 그 알파 채널이라는 값이 있어 가지고 그 알파 채널 값이 0으로 돼 있으면은 거기에는 그림을 아예 그려야 되거든요.

색깔이 없는 건 아닌데 뒤에 뭐가 그림이 있으면 그 부분 픽셀은 그림을 안 그리도록 그 정보가 추가적으로 있는거에요.

그 다음에 이제 흑백은 bw 이렇게 안 써 있고 l 한 글자로 돼 있는데 왜 그러냐면 이제 채널 수 색깔이 몇 개인지를 구별을 하려고 글자수를 거기다 맞추거든요.

근데 블랙 앤 화이트 이렇게 쓰면은 두 글자잖아요.

근데 색깔은 사실 하나밖에 없기 때문에 한 글자로 l로 줄여놨는데 왜 l이냐면 루미넌스 밝기거든요.

밝기라는 뜻입니다.

그래서 뭐에 약산지는 뭐 기억 안 하셔도 되고 하여간 l이라고 돼 있으면 아 이거 흑백이구나

이렇게 생각을 하시면 될 것 같고요.

그 다음에 cmi-k는 아까 얘기 드렸듯이 이제 이건 인쇄용인데 우리가 인쇄용 파일을 가지고 이미지 처리 할 일은 별로 없기 때문에 이것도 뭐 그냥 이런 게 있다 정도로 생각을 해주시면 될 것 같고요.

이미지 크기 변경

img = img.resize((256, 256))

그 다음에 이제 이미지를 우리가 크기를 바꿀 때는 리사이즈를 쓰시면 됩니다.

리사이즈는 말 그대로 리사이즈 하라는 얘기죠.

여기 보시면은 괄호가 이렇게 두 겹으로 돼 있어요.

왜 두 겹으로 돼 있냐.

기본적으로 파이썬에 있는 함수들 일종의 명령들은 무조건 괄호를 붙여서 이 안에다가 이제 인자를 넣게 돼 있습니다.

그래서 아까 오픈 같은 경우는 보면은 오픈을 할 때 여기 파일 이름이 들어가게 돼 있어요.

리사이즈를 할 때는 크기가 들어가야겠죠.

근데 크기라는 거는 가로와 세로가 있기 때문에.

가로와 세로를 괄호로 묶어줘야 됩니다.

그래서 이 안쪽에 있는 괄호는 튜플이라고 하는데 우리가 학교 다닐 때는 순서쌍이라고 배우거든요.

숫자 우리 좌표 같은 거 할 때 좌표가 3,4다

이러면은 좌표를 이렇게 괄호를 묶어서 표시한단 말이에요.

그래서 여기도 가로와 세로를 묶어서 표시하기 위한 괄호입니다.

그래서 괄호가 두 겹이 있는데 의미가 달라요.

그래서 여기 바깥쪽 괄호는 함수를 표현을 하고 안쪽 괄호는 이 두 개의 숫자를 묶었다.

그래서 이건 이제 튜플을 묶어서 표시한다는 말이에요.

그래서 이 두 개를 의미합니다.

그래서 img는 img.resize 해가지고 256,256 이렇게 해주시면은 리사이즈를 한 다음에 그걸 어디다가 넣어놔야 되잖아요.

그거를 img에다 다시 덮어 써라

이런 얘기입니다.

이걸 이제 실행하면 아무 결과가 안 나오는데 다시 img를 실행을 해보시면 아까는 사진이 있다만 했거든요.

근데 이제는 img가 덮어 씌워져서 축소된 걸로 덮어 씌워져서 이렇게 작아졌습니다.

그렇다고 해서 원본이 바뀐 건 아니에요.

원본은 똑같이 큰 거고 지금 이 파이썬하고 대화하는 맥락에서는 이 img의 어떤 그 결과값만 바뀐 겁니다.

파일은 저장돼 있는 거니까 저장돼 있는 건 멀쩡하고요.

이 대화 맥락에서만 img가 이제 작은 걸로 덮어 씌워졌습니다.

우리가 지금 하고 있는 부분은 3개의 단계를 만들고 있습니다.

지금은 크기를 수동으로 계산을 해서 수동으로 넣어줬습니다.

그 이미지 크기를 한번 계산을 해 가지고 하는 것을 한번 해보도록 할게요

그래서 이거는 코드에 좀 설명이 필요한데 우리가 일단 img.size 하면은 256, 256 숫자가 두 개가 나오겠죠

그럼 이거를 어떤 변수에 받아서 계산을 할 수가 있습니다

w, h = img.size 
size = w // 2, h // 2

그래서 강의 자료에서 어떻게 했냐면 w, h는 이렇게 했는데 우리가 img.size가 숫자가 두 개이기 때문에 왼쪽에도 변수를 두 개 해주시면 w에는 앞에 있는 256이 들어가고 h에는 뒤에 있는 256이 들어갑니다

원래는 여기다 이제 괄호를 붙여 주셔야 되거든요

왜냐면 뒤에도 괄호가 있으니까 근데 파이썬에서는 이 경우에 한해서는 앞에 있는 괄호는 생략을 해도 됩니다

어차피 괄호가 있든 없든 구별하기 어렵지 않을까 이렇게 하면 w라고 써 보시면 256이라고 나와요

그래서 img.size가 256, 256이니까 w와 h에 각각 256이 들어갑니다

그러면은 이제 새로운 사이즈를 정의를 해 줘야 되는데 새로운 사이즈를 어떻게 정의하냐면 새로운 사이즈는 괄호하고 w, h 이렇게 하면은 w하고 h가 다시 묶여 가지고 사이즈에 들어가겠죠

그래서 예를 들어서 이렇게 하면은 사이즈가 256, 256 이렇게 됩니다

근데 이제 이거를 우리가 크기를 받아서 반으로 줄이고 싶어요 반으로 줄이고 싶으면 나누기 2를 해 주면 되겠죠

이렇게 새로운 사이즈는 w의 반, h의 반이다

이렇게 하면은 128, 128이 되는데 여기 .0이 들어갑니다

왜 그러냐면 파이썬에서 나누기를 하면은 나누기의 결과는 숫자가 딱 떨어질 수도 있지만 안 떨어질 수도 있잖아요

그래서 무조건 실수로 바뀝니다

여기 실수는 미스테이크가 아니라 리얼 넘버 그래서 소수점이 붙거든요

근데 픽셀이라는 게 점이기 때문에 점은 크기가 개수가 실수가 될 수가 없어요

점은 반 개 이런 게 없습니다

그래서 항상 정수로 딱 떨어져야 돼요

그래서 나누기 기호를 두 개를 이렇게 겹쳐서 쓰면은 무슨 뜻이냐면 예를 들어서 우리가 17 나누기 3 하면은 원래는 5.6666666 이렇게 되는데 빗금을 두 개를 쓰면은 5 이렇게 됩니다.

그러니까 빗금 두 개는 뭐냐면 우수리는 때 라는 얘기입니다

딱 떨어지게 하고 소수점은 하지 마라

그래서 이렇게 계산해 보시면 사이즈가 128, 128로 딱 떨어지게 됩니다

그래서 이거 우리 초등학교 때 배운 목과 나머지 해가지고 기억나실지 모르겠지만 하도 오래돼서 목시라는 거는 우리가 8개를 3으로 나누면 몫은 2, 나머지가 2 이렇게 되죠

그 몫입니다

몫 그래서 몫을 구하게 돼요

그래서 크기 이미지 크기를 바꿀 때는 이게 실수가 되면 안 되거든요

정수로 딱 떨어져야 돼요

그래서 항상 이렇게 빗금을 두 개를 쳐서 계산을 해 주시고요

그럼 이 크기로 이미지를 다시 바꾸고 싶다

small = img.resize(size)

그럼 이때는 img.resize 하고 그냥 size라고 써주시면 됩니다

여기서는 이제 괄호가 두 개가 아니라 괄호가 하나만 나와요

왜냐하면 사이즈 자체가 그 안에 괄호를 가지고 있기 때문에 그래서 이거는 small 이라는 데다가 다시 저장을 해 주겠습니다

이제 small은 다시 크기가 반으로 줄었죠

small.save('small.png')

저장을 하실 때는 점하고 세이브 하시면 됩니다.

말 그대로 세이브 하라는 거죠.

그래서 small.png로 저장을 해라.

그래서 점 세이브 small.png 그러면은 결과가 아무것도 없는데 왜냐하면 저장을 하라고 했으니까 그냥 저장을 하겠죠.

별일 없으면은 잘 저장이 됩니다.

여기 보시면은 세로 파일이 세로 고치고 한번 해봐요.

세로 고치고 하면은 여기 small.png라고 세로 파일이 생겼죠.

원래 볼룬.wp가 있고 small.png가 있는데 small.png 열어보시면 그림이 조그만합니다.

우리가 축소해서 저장을 한 거기 때문에 저장을 하실 때는 png라고 하면 png로 저장되고 jpg로 하면 jpg로 저장되고 파일 이름을 보고 알아서 코멧을 맞춰서 저장을 해주니까 신경 쓰실 필요가 없겠죠.

변환

img.transpose(Image.Transpose.FLIP_TOP_BOTTOM)

그래서 이제 이 트랜스포즈는 뭐냐면 이미지를 뒤집어 주는 거예요.

그래서 지금 보면 위 아래가 뒤집혀 있습니다.

그래서 똑같은 거 아니에요.

이렇게 생각할 수 있는데 잘 보시면은 여기 그 물에 비친 부분이 위로 가고 하늘이 아래로 간 거예요.

그래서 이제 플립 탑 바텀 이런 식으로 이미지를 뒤집어 주실 수가 있고 그다음에 뭐 로테이트 이러면은 말 그대로 이미지를 회전을 시켜라

이런 얘기입니다.

img.rotate(45)

이미지가 45도 왼쪽으로 돌아갔죠.

img.convert("L")

모드를 흑백(L)으로 변환

그리고 img.convert 한 다음에 여기다 이제 색상이 지금 rgb로 돼 있는데 l로 바꾸시면은 l이 흑백이라고 했죠.

이미지가 흑백으로 바뀝니다.

그래서 이제 pil은 뭐 이런 기본적인 이미지 처리 뭐 파일 열고 크기 바꾸고 저장하고 이런 단순 작업을 할 때 사용을 많이 합니다.

사실 우리가 이제 복잡한 작업은 어차피 pil로 못 하기 때문에 우리 수업에서는 pil을 거의 안 쓸 건데 그래도 아주 간단한 걸 할 때는 이 pil이 편하거든요.

그래서 아주 간단한 작업을 할 때는 pil을 쓸 겁니다.

이미지 리사이즈와 딥러닝

이미지를 리사이즈 하는 이유가 학습하는 데서 이미지가 너무 커서 그게 능력이 많고 커서 리사이즈 갖는 경우가 있어요.

그런 이미지 리사이즈가 아니겠어요?

네.

있습니다.

그럼 그런 경우가 있냐 하면 예를 들어서 잠깐만요.

잠깐만요.

여기 앞에 앉아 계신 분들 심포로가 있고, 선이 있고, 선이 있는 그런 부분에 대해서는 리사이즈를 하면, 축소를 하면 정보를 잃을 수도 있지 않아요?

그렇죠

그런 부분이 있는지에 대해서 고려해서 리사이즈를 해야 하나요?

그렇죠, 좋은 질문입니다

리사이즈를 우리가 보통 나중에 딥러닝으로 이미지 처리하는 것을 할 건데 일단 딥러닝을 하면 이미지를 보통 리사이즈를 해서 쓰거든요

리사이즈 하는데 두 가지 이유가 있는데 말씀하신 것처럼 학습 문제가 있어요

왜냐하면 이미지가 크면 그만큼 모델도 같이 커져야 됩니다

그런데 모델이 크다는 것은 계산량이 많아진다는 거고 계산량이 많아진다는 것은 하드웨어를 비싼 것을 써야 한다는 거고 하드웨어를 비싼 것을 쓴다는 것은 돈이 많이 든다는 거고 돈이 많이 든다는 것은 회사에서 싫어한다는 얘기죠

그래서 어지간하면 작은 것을 씁니다

커버가 얼마나 크겠어요?

이렇게 생각하실 수 있는데요 엔비디아가 왜 주가가 그렇게 비싼가 하면 딥러닝용 그래픽카드 가격을 보시면 다 이유가 있구나

그래픽카드 하나가 4200만 원이에요 최신 모델도 아닙니다

지난 모델이에요, HBAN 그런데 그래픽카드가 4200만 원이면 그래픽카드가 4200만 원이면 그래픽카드가 4200만 원이면 그래픽카드를 꽂는 컴퓨터는 또 얼마짜리야 될까요?

컴퓨터 한 대 졸업하는데 한 1억 정도 됩니다

1억이면 되나?

아니에요, 택도 없어요

94기가밖에 안 되기 때문에 이게 이제 94기가 용량인데 모델이 커지면 이 그래픽카드 하나에 안 들어가거든요

그럼 그래픽카드를 두 개를 꽂아야 됩니다

두 개를 꽂으려면 컴퓨터는 더 비싼 것을 써야 돼요

그러면 돈이, 몇 억짜리 컴퓨터가 어마어마하게 들어갑니다

그래서 모델이 크다는 것은 컴퓨터가 크기 크면 좋은데 성능이 좋지만 쓸데없이 성능이 좋아 봐야 돈만 많이 들어가고 그래서 학습문제가 일단 있어요

너무 용량이 크고 이러면 학습하는데 너무 많은 컴퓨팅 계산이 이미지가 크면 계산이 많이 되고 그다음에 모델이 커지면 계산만 많이 되는 게 아니라 데이터도 많이 필요하거든요

그런데 보통 우리가 데이터가 그렇게 많지 않기 때문에 많다

많다 해도 사실 보통 이미지 같은 경우는 데이터가 막 수십만 개씩 필요한 경우도 있는데 보통 예를 들면 도면이 수십만 개 있지는 않을 거 아니에요

우리가 데이터 숫자 제한도 있기 때문에 보통 최대한 이미지를 줄여서 모델 사이즈도 줄이게 됩니다

또 다른 문제가 있는데 이거는 되게 단순한 문제인데 사실 딥러닝이라는 게 대부분은 그냥 사실 말이 딥러닝이지 그냥 행렬 계산이에요 행렬을 가지고 계산하는 건데 행렬이라는 거는 크기가 크기인데 행렬이라는 거는 크기가 크기인데 크기가 딱 맞아야 계산이 되거든요

그래서 약간 이건 좀 어이없는 이유인데 이미지를 리사이지를 안 하면 계산 자체가 안 됩니다

그래서 예를 들어서 가로 1024 세로 1024로 계산할 수 있게 만든 딥러닝 모델이 있다

그럼

그거는 어떤 행렬 자체가 1024 1024로 행렬이 모양이 생겨 있어요

근데 우리 학교 다닐 때 행렬의 곱셈 이런 거 해보면 행렬 두 개가 모양이 맞아야 곱셈이 될 거 아니에요

행렬의 모양이 안 맞으면 아예 계산 자체가 시작도 안 됩니다

그냥 단순히 수학적인 이유로 계산 자체를 하기 위해서라도 크기를 맞춰 줘야 돼요

어떤 이유로든 이미지의 크기를 일단 기본적으로 줄이지는 않더라도 예를 들면 이런 경우에는 이미지가 작아도 키워야겠죠

거꾸로 작아도 거꾸로 키워야 되고 커도 줄여야 되고 계산을 위해서 그다음에 이거는 이제 어떤 실용적인 이유로 보통 이미지를 큰 거가 있어도 보통 작게 만드는데 모델 자체를 근데 이제 아까 질문하신 것처럼 예를 들어 도면이다

그럼 도면 같은 거는 굉장히 빽빽하게 어떤 정보가 들어가기 때문에 그래서 이제 도면 같은 거는 굉장히 빽빽하게 어떤 정보가 들어가기 때문에 이미지를 이제 리사이즈를 해 버리면은 어떤 정보가 손실이 되겠죠

그래서 해결하는 방법이 막 줄이면 안 되는 그런 경우는 어떻게 하느냐

그러면 이제 방법이 여러 가지가 있는데 첫 번째는 그 예를 들면 크기별로 다른 종류의 모형을 만드는 겁니다

예를 들면은 도면이 있어요.

예를 들면 도면의 어떤 세부 특징을 처리하는 모델이 필요할 수도 있고 큰 규모에서 어떤 전반적인 거를 처리하는 모델이 필요할 수도 있는데 예를 들어서 도면에서 예를 들면 어떤 저도 잘 모르지만 예를 들어서 선이 잘못 이어져 있다든가 이런 어떤 디테일한 부분의 오류 같은 걸 찾는 모델이다 그러면은 도면을 축소를 하는 게 아니라 도면의 크기를 잘라 버리는 거죠

가로 얼마 세로 얼마로 크기를 잘라 가지고 어차피 그 안에서만 어떤 문제를 찾으면 될 거 아니에요.

어차피 그 안에서만 어떤 문제를 찾으면 될 거 아니에요.

그다음에 이제 옆부분의 문제는 이미지를 자를 때 예를 들어서 이제 도면이 이런 식으로 있는데 그림이 너무 커요.

모델이 안 들어간다.

그러면은 그림을 이렇게 잘라 가지고 모델에 한번 넣고 그 다음에는 이 부분을 잘라 가지고 모델에 한번 넣고 이런 식으로 해서 이제 부분 부분 잘라서 처리하는 용도의 모델을 만들어 가지고 부분 부분 처리를 하면 되겠죠

그 다음에 만약에 이제 전반적인 어떤 거를 처리한다

그럼 전반적인 거를 처리하는 모델을 만들어 가지고 그 모델을 모델을 종류별로 여러 이거는 이제 좀 축소를 해도 되겠죠.

왜냐하면 디테일한 정보를 처리하지 않습니다.

그래서 그런 식으로 어떤 스케일별로 크기별로 다른 종류의 모델을 만들어서 용도별로 처리할 수 있는 방법이 있고 또 하나는 애초에 이미지 처리를 하지 않는 거예요.

이미지로 처리를 하지 않는다.

무슨 말이냐면 예를 들면 도면 같은 경우는 사실 그 CAD 같은 거에 파일로 저장이 될 때 사실 픽셀로 저장이 되는 게 아니라 사실은 점과 점들이 어떤 식으로 저장이 되는지 알 수 있는 거에요.

사실은 점과 점들이 어떤 식으로 저장이 되는지 알 수 있는 거에요.

아 .

점과 점들이 어떤 식으로 연결돼 있는지.

그 포맷으로 저장이 되거든요.

그러면 애초에 원래 사실은 그게 그 눈에 보일 때 도면이 이미지로 보일 뿐이지 사실은 그게 그 엄밀히 말하면 이미지가 아니란 말이에요.

어떤 점과 점들의 연결 관계인데 그러면은 그거를 처리할 수 있는 방식의 모델로 모델을 바꾸셔야 됩니다.

그래서 뭐 예를 들면 그건 우리 약간 수업 범위를 벗어나긴 하는데 고런 주제에 관심 있으시면 그 고정 수업 주제 하시면 되겠습니다.

그 부분에 대해서는 다른 반응이 있으면 되고요.

그리고 또 뭐 수업 범위에 대해서는 그 수업 범위에 대해서는크 아니Uh 좀ита 기능을 가진 방법이 있겠죠.

모델로 모델을 바꾸셔야 됩니다.

예를 들면, 그것은 우리 수업 범위를 벗어나긴 하는데 그런 주제에 관심 있으시면, 네이버가 기본 검색입니다.

그래프 뉴럴 네트워크 라고 하는 게 있거든요.

여기서 그래프는 어떤 연결 관계를 말합니다.

그래서 어떤 점들과 점들이 있으면, 점들과 점들이 어떻게 연결되어 있냐

예를 들면, 우리가 화학 분자 구조 같은 것을 보면, 분자 구조를 우리가 그림으로 그릴 수도 있지만, 사실 더 중요합니다.

어떤 원자와 어떤 원자가 어떻게 연결되어 있느냐가 결국 분자 구조 잖아요.

그럼 사실 여기서는 이것을 그림으로 이해할 수도 있지만, 사실은 점과 점의 연결 관계란 말이에요.

이것은 이미지와는 좀 다른 종류인 거죠.

물론 이것을 그림으로 그릴 수는 있습니다.

그런데 그림으로 그릴 수 있지만, 이것이 3차원에서 연결 구조니까, 회전을 시키면 다른 그림이 되잖아요.

그런데 연결 구조라는 것은 회전을 시킨다고 바뀌지는 않죠.

그래서 이것을 어떻게 볼 거냐, 연결 구조가 어떻게 변화가 되는지, 이런 것들이 연결 구조가 되는 것이죠.

연결 구조로 볼 거냐, 아니면 그림으로 볼 거냐, 이것은 문제에 따라서 좀 다른데, 제 생각에 도면은 사실 그림으로 이해하는 것보다 연결 구조로 이해하는 것이 맞을 것 같고, 그럼 그것에 해당되는 모델을 쓰시는 것이 나을 수도 있습니다.

그런데 예를 들면, 인쇄된 도면이다.

그럼 그것은 일단 이미지로 처리를 하긴 해야겠죠.

일단 도면에서는 연결 구조는 약간 추상화를 시켜야 얻어낼 수 있는 정보니까, 그래서 그것은 용도에 따라서 약간 모델이 좀 달라집니다.

처리 방법이 달라집니다.

그렇게 이해를 하시면 될 것 같아요.

그래서 예를 들면, 우리가 도면에서 어떤 선이 있는데, 그 선 위에 글자로, 그 선에 어떤 종류 같은 게 써있다.

이 선은 무슨 도선으로 연결을 해라, 이렇게 써있다.

그럼 그런 글자를 인식하고 싶다.

이런 경우는 사실 이미지 전체가 필요한 게 아니라 그 부분만 필요한 거니까, 그런 경우에는 그냥 이미지를 잘라가지고 글자 인식 모델에 넣으면 되겠죠.

그럴 때는 이미지 자체를 축소하는 것보다 크롭을 하는 게 더 나을 수도 있습니다.