안녕하세요
이번 강의에서는 노트북으로 이미지를 여는 방법을 배울 건데요
전 강의에서는 '파이썬 이미징 라이브러리'로 이미지를 열어서
파일을 배열 함수로 변형하는 법과 배열을 노트북에서 이미지로 구현하기 위해
'imshow' 코드를 쓸 때 'matplotlib'을 사용하는 법을 배웠죠
절차가 복잡하지만 'openCV'를 이용하면 이 과정이
간단해져요
오늘은 openCV와 matplotlib을 통해 이미지를 바로 배열로 변형해서
나타낼게요
먼저 노트북을 열어 주세요
새 노트북 창에다가 몇 가지를 불러올 텐데요
{import numpy as np}와 {import matplotlib.pyplot as plt}를 입력하고
이미지를 노트북에서 열 거니까 {matplotlib inline}까지 써 줘요
마지막으로 {%matplotlib inline}를 입력합니다
.py 스크립트와 같은 특정 IDE 말고 주피터 노트북에만 적용된다는 점
참고하세요
이제 openCV 라이브러리를 불러올 건데
{import cv2}라고 써요
그리고 실행하면 import가 완료돼요
여기서 발생 가능한 오류를 짚고 넘어가자면
cv2에 경로를 잘못 입력할 수 있어요
이 문제를 해결하려면, OpenCV가 파이썬 환경에 설치되어 있는지 확인해야 합니다. 파이썬 패키지 관리자인 pip를 사용하여 설치할 수 있습니다.
{pip install opencv-python}
이 오류는 'cv2' 모듈을 찾을 수 없다는 것을 나타냅니다
{img = cv2.imread}를 입력할게요
'image read'라는 의미예요
이 명령문을 작동시키려면 JPEG나 PNG 이미지 파일의
파일명을 입력해야 돼요
{DATA/}라는 파일 경로를 입력하고 [shift + tab]을 누르면 자동 완성 기능으로
'puppy.jpg'이라는 파일명이 떠요
그럼 이미지가 자동으로 읽히죠
변수 개체의 타입을 확인해 보니까 numpy 배열로 인식하죠?
이제 이미지 파일을 numpy 배열로 변환하는 중간 과정을 안 거쳐도 돼요
openCV가 'cv2.imread' 함수를 통해 자동으로 바꿔 주거든요
근데 여기서 큰 오류가 날 수 있어요 {img = cv2.imread}라고 입력하고
파일명을 일부러 다르게 쓸게요
'이것은 잘못된/경로다', 라고 쓰고 파일명까지 아무렇게나 썼어요
제 컴퓨터에는 당연히 이런 이미지 파일이나
파일 경로가 없죠
근데 코드를 실행해 보면 아무 이상이 없어요
대신 'type'를 확인해 보면 'nonetype'이라고 인식하죠
잘못된 경로나 파일명을 입력해도 아무런 경고가 없으니까
오류가 날 가능성이 커요
그래서 초보들이 여기서 막히죠 {imread}를 입력하고
코드를 실행했는데 멀쩡하니까
맞게 입력한 줄 알고요
근데 틀렸을 수도 있어요
조금이라도 미심쩍은 부분이 있으면 'cv2.imread' 변수의 타입을
항상 확인하세요
'nonetype'으로 나오면 파일 경로가 틀린 거예요
명심하세요, 파일 경로가 틀리면 오류가 나지 않고
'nonetype'으로 인식돼요
여기서부터 진행하죠 이제 이미지를 보여 줄게요
numpy 배열로 나오고 shape를 보면 '(1300, 1950, 3)'네요
numpy 배열로 변환할 필요가 없는 거죠
이제 이미지를 띄워 볼게요
{plt.imshow(img)}를 입력해요
근데 이미지가 좀 이상하죠?
이미지가 파란색으로 나오는데
openCV랑 matplotlib이 빨간색, 초록색, 파란색 채널을 인식하는 순서가
달라서 그래요
중요한 차이점이죠
matplotlib은 이미지를 빨강, 초록, 파랑 순으로 인식해서
'RGB'로 읽어요
즉 빨강, 초록, 파랑 순으로요
근데 openCV는
살짝 다른 순서로 읽어요
파랑, 초록, 빨강 순으로요
그래서 어떤 일이 벌어지냐면 openCV가 파일을 읽을 때
파랑, 초록, 빨강으로 읽어들이고 matplotlib은 빨강, 초록, 파랑 순으로
보여 줘요
그래서 몇 개의 채널 즉 빨강과 파랑이 바뀌는 거죠
그래서 'cv2.imread' 함수가 이미지를 읽고 화면에 띄우면
이렇게 색이 이상해져요
그러니까 우리가 'BGR'에서 'RGB' 순으로 바꿔 줘야 돼요
matplotlib 방식대로요
cv2에 딱 맞는 함수가 있는데요
뭐냐면 {cv2.cvtColor}
이때 대문자 C예요 그리고 입력값은 {src}
즉 소스를 입력한 다음 컬러 코드를 넣으면 돼요
이미지 파일은 갖고 있죠
그게 소스고요
{(img)}에다가{cv2. COLOR_}
탭 키를 누르면 옵션이 많이 나오는데요
openCV 라이브러리는 어떤 색이든 다른 색으로 변환할 수 있어요
코드들 중에 'GR'에서 'BGR'로 바꾸기가 있죠?
여기서 핵심은 'COLOR_'를 써서 현재 색깔 채널 순서가
'BGR'인 걸 알았고 다른 색 채널로 변경할 수 있다는 거예요
선택지가 무지하게 많죠?
당연히 이걸 다 쓰지는 않고
몇 가지만 쓸 거예요
지금 쓸 선택지는 'BGR'에서
'RGB'로 바꾸는 선택지죠 간단한 변형이네요
지금은 이것만 클릭하면 돼요
해석하자면 BGR 채널로 읽어들인 이미지를
RGB 채널로 변환하라는 소리예요
그러고 {plt.imshow(img)}를 실행하면 사진이 제대로 떠요
{fix_img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)}를 입력하여 원본 이미지의 색깔을 변형하도록
설정했어요
이제 변형한 이미지를 불러올게요
{plt.imshow(fix_img)}를 입력하면
색이 제대로 나와요
이 과정에서 핵심은 openCV는 이미지를 BGR 순으로
matplotlib은 RGB 순으로 인식한다는 거예요
그래서 변환 과정이 없으면 색이 이상하게 나와요
자
다음은 컬러 이미지를 바로 흑백으로 바꿔서
나타나게 만들어 볼게요
역시 openCV로 할 수 있는데요
아까 썼던 'imread' 명령어에 컬러 코드를 뺄게요
{img_gray = cv2.imread()}를 입력합니다
이미지를 파일 경로를 또 적어 줘요
{''./Computer-Vision-with-Python/DATA/00-puppy.jpg''} 파일명은 자동 완성으로 쓸게요
두 번째 인자로 'imread' 코드를 쓸 거예요 {cv2. IMREAD}
입력하고 탭 키를 눌러 보면 이미지를 읽는 방식이 엄청 나오죠
'REDUCED_COLOR'나
'IGNORE_ORIENTATION' 등등 많은데
우리한테 필요한 건 {_GRAYSCALE}이에요
선택해 줍시다
해석해 보자면 원본 이미지가 어떤 색이든 간에
흑백으로 새롭게 읽으란 뜻이에요
확인해 볼게요
이미지 속성을 보면 컬러 채널 정보가 사라졌죠?
흑백으로 읽어내서 그래요
더 이상 컬러 채널이 3개가 아니니까요
대신 값들이 쭉 나왔어요
최솟값을 확인해 보니까 1이네요 완전한 검정색인 부분은
없나 봐요
최댓값을 확인해 보면
209가 나오는데
흰색으로만 된 곳도 없나 봐요
그럼 계속해서 이미지가 흑백으로 나오나 볼게요
{plt.imshow(img_gray)}를 입력하면 이미지가
나오는데요
왜 흑백이 아닌지 궁금하죠?
'imshow'가 사용하는 디폴트 컬러 맵핑과 관련이 있어요
전에 설명했듯이 디폴트 컬러 맵핑은 더 어두운 값을
푸르스름한 빛으로 보여 주고 밝은 값은 노랑과 초록으로 나타내요
그래서 여기에 {cmap=}
{'gray'}를 입력하면 흑백과 일치하는 컬러 맵핑을 선택해요
이게 컬러 이미지를 흑백으로 나타내는 방법이에요
정리하면 {cv2.imread}에 소스를 입력하고 {cv2. IMREAD_GRAYSCALE}을
입력했어요
matplotlib을 이용해서 이미지를 흑백으로 나타내려면
컬러 맵핑을 'gray'로 입력해 줘야 돼요
matplotlib 컬러 맵핑을 확인해 보면 다른 맵핑으로 바꿀 수도
있어요
예를 들어 'magma'는 0에 가까운 어두운 값일수록
어두운 보라색으로 나타내고 밝은 값은 주황색으로 나타내요
우리는 흑백을 나타내고자 하니까
{cmap='gray'}라고 하면 돼요
기초적인 이미지 처리 방법에 대해 몇 가지 더 설명할게요
이미지 크기 조정과 이미지 반전, 파일을 저장하는 법이요
이제 거의 끝났어요
이미지 크기를 바꿔 봅시다
꽤 간단한 편이에요
그냥 따라하면 돼요
이미지를 다시 확인해 볼게요
plt.imshow(fix_img)라고 치면 이미지 파일 원본이 뜨죠
변환된 이미지를 아직 저장한 적이 없었죠?
높이는 0에서 1300, 너비는 0에서 1950이고요
속성을 제대로 확인하려면 {fix_img.shape}을 입력해요
1300*1950이네요
이미지 크기를 바꾸려면 간단한 명령어가 있어요
{cv2.resize()} 인자는{cv2.resize?}입력하여 확인 할수 있어요 한번 보면
소스, 최종 크기 순으로 써 주고요
스크롤을 내려서 매개 변수도 확인 가능해요
어쨌든 원본 이미지 값을 입력하는 게 중요해요
{fix_img,()}까지 입력하고 우리가 원하는 새로운 입력값을 추가해요
이미지를 아래쪽으로 많이 줄일 건데요 너비는 반 정도로
축소할게요
한 1000 정도로 잡고
높이를 많이 줄여야겠죠?
400 정도로 할게요
그럼 많이 축소될 거예요
{new_img = cv2.resize(fix_img,(1000,400))}입니다
그리고 {plt.imshow(new_img)}을 실행해 보면 이미지가 축소됐죠
높이는 0에서 400 너비는 0에서 1000이 됐어요
명심하세요, 입력값에는
바꾸고 싶은 크기를 쓰고요
이 1000은 1950에서 바뀐 값이고 400은 1300에서
바뀐 값이에요
numpy 배열이 x, y축을 반대로 인식해서 처음에는 헷갈리는데
점점 익숙해질 거예요
'resize' 함수와 입력값을 본래 크기랑 비교해서 관계를
파악해야 되는데
다행히 축에 숫자가 있어서 관계가 잘 보이네요
높이가 0에서 1300이었다가 0에서 400이 됐어요
즉 1300이 400으로 바뀌고 1950이 1000이 된 거죠
또 조정한 크기 값이 색깔 채널 3개에 다 적용돼요
아무런 왜곡 없이요
이번에는 비율을 변경해서 이미지 크기를 바꿔 볼게요
생각보다 간단해요
비율로 크기를 바꾸려면 너비와 높이 비율을 정하면 돼요
이미지를 50% 작게 만들어 볼게요
너비 비율을 0.5로 설정하고 높이 비율도 0.5로
입력해 줘요
즉 50% 비율로 줄이겠다는 뜻이죠
새로운 크기를 적용하니까 변수도 새로 만들게요
{new_img = cv2.resize()}를 사용할 건데 매개 변수가
살짝 달라요
먼저 크기를 바꿀 이미지를 입력해요
{fix_img}가 되겠죠
입력값은 {(0,0)}이에요
튜플이죠? 그리고 이미지를 다시 입력해 보면 매개 변수가
이상해 보이지만
특정 비율로 크기를 바꾸려면 이렇게 해야 돼요
즉 크기를 바꿀 이미지와 '(0,0)' 튜플에 이미지를 또 입력하고
너비, 높이 비율을 넣어요
{w_ratio,h_ratio)}
굳이 변수 말고
값을 직접 써도 되지만
이해하기 쉽게 변수로 쓸게요
실행한 다음 {plt.imshow(new_img)}를 해 보면
비율이 반으로 줄었죠?
{new_img.shape}를 확인해 보면
크기가 650:975로 바뀌었어요 더 나아가서 수정해 볼게요
원본 이미지에서 너비는 80% 줄이고 높이는 20%로 할게요
다시 실행해 보면 높이는 원본의 20%가 됐지만
너비는 원본의 80%로 거의 똑같죠?
속성을 보면
높이는 260, 너비는 1560이네요
260 * 5 = 1300으로 원본과 높이가 같죠?
20 * 5 = 100 즉 100%잖아요
이렇게 비율로 크기를 조정해 봤고요
강의를 마치기 전에 세 가지를 더 다뤄 볼게요
오늘은 강의가 좀 기네요 이번에는 이미지를 상하나
좌우로 반전시킬 건데요
{new_img = cv2.flip()}을 입력하고
뒤집을 이미지를 지정해요
원본 이미지인 {(fix_img,0)}에 두 번째 매개 변수로 0을 넣고
{plt.imshow(new_img)}를 하면
이미지가 상하로 반전됐죠? 즉 위아래가 바뀌었어요
좌우로 반전시키려면 매개 변수로 1을 넣어요
그럼 원본에서는 오른쪽에 있던 강아지가
좌우 반전이 돼서
왼쪽으로 갔어요
상하좌우를 동시에 뒤집으려면 -1을 치면 돼요
정리하면 'cv2.flip'에 뒤집을 이미지와 0, 1, 또는 -1을 입력해요
나중에 이 'flip' 코드로 이미지를 더 다룰 건데요
나중에 딥 러닝에 관해 배울 때 해볼 겁니다
이미지 반전은 끝났고
이제 이미지 파일을 저장해 볼게요
이미지 파일은 노트북에 numpy 배열로 나타나죠
{type()} 함수에 입력값으로
{fix_img}를 치면 numpy 배열이 나오죠? 이걸 새 파일로 저장하는 코드는 {cv2.imwrite}
'imread'의 반대 코드죠
입력값으로는 아무 파일명이나 정해서 쓰면 돼요
전 {('totally_new.jpg')}라고 할게요
이게 새 이미지 이름이고 다음은 저장할 이미지를 입력하면 돼요
이 강의에서는 {fix_img}죠
이 원본 이미지를...
즉 이 numpy 배열을 이러한 jpg 파일로 저장한다는 건데 다른 확장자로도
저장돼요
코드 설명을 확인하면 저장 가능한 확장자들이 나와 있어요
아무튼 'totally_new.jpg'를 저장해 볼게요
방금 주피터 노트북이 있는 폴더에 저장했는데요
파일 창을 열어 보면
여기 어딘가에 나올 거예요
'totally_new.jpg' 혹은 여러분이 저장한 파일명으로요
마지막으로 이미지를 살짝 크게 보여 주는 법을
살펴볼게요
원래는 이미지 크기가 상당히 커요
1300*1950이면 거의 모니터 크기랑 비슷한데
노트북이 크기를 줄여서 창에 맞게 조정해서 불러와요
근데 노트북에서 이미지를 얼마나 크게 보여 줄지를 조정할 수가
있어요
matplotlib으로 할 수 있는데요
코드를 이해할 필요 없고
그냥 통째로 사용한다고 생각해요
{fig = plt.figure(figsize = (10,8)}
이미지를 표시할 높이와 너비는 (10, 8)로 할게요
빈 공간을 10 * 8까지 쓰겠다는 뜻이에요
그다음 {ax = fig.add_subplot(111)}을 입력해요
나타낼 이미지가 하나라서 입력값이 111이고요 다음으로 {ax.imshow()}에
불러올 이미지를 입력해요
살짝 복잡한 종류의 matplotlib 코드인데요
이 코드를 이따가 실행해 볼 거라는 점만
알면 돼요
이 세 코드를 복사해요
'figsize' 입력값이 제일 중요해요
이제 이미지가 실제 디폴트 값보다 빈 공간을 더 채우도록 지정할 수 있어요
코드를 실행하니까 이미지가 훨씬 크게 나오죠?
훨씬 작게 보고 싶을 경우엔 입력값을 (2,2)로 하면
작게 나와요
주피터 노트북에서 빈 곳을 얼마나 쓸지 조정하는 거죠
자, 강의는 여기까지예요
많은 내용을 다뤘는데 openCV와 matplotlib으로 노트북에서
이미지를 처리해 봤고요
다음 강의에서는 openCV를 스크립트에서 다뤄 볼게요
수고하셨습니다
'딥러닝' 카테고리의 다른 글
10강 - OpenCV와 함께하는 이미지 기초 - 이미지에 그리기 - 1부 - 기본 도형 (0) | 2023.06.26 |
---|---|
9강 - OpenCV와 함께하는 이미지 기초 - OpenCV로 이미지 파일 열기 (0) | 2023.06.25 |
7강-OpenCV와 함께하는 이미지 기초-이미지 및 OpenCV 기본 소개 (0) | 2023.06.24 |
6강 NumPy 및 image basics - Numpy 및 이미지 평가 테스트 (0) | 2023.06.19 |
5강 NumPy 및 image basics - 이미지와 NumPy (1) | 2023.06.18 |