오늘은 Opencv의 이미지에 대해서 조금 공부하였다.
현재 내가 공부하고 있는 영상은 나도코딩 이미지 처리 이다.
영상 링크
여기서 공부하면 됨!
import cv2
cv2.__version__
위 처럼 하게 된다면 현재 나의 cv2 버전을 알 수 있다.
이제 직접 이미지를 화면에 나오게 하도록 해보겠다.
그냥 아무 이미지 파일을 주피터 노트북 안에 내가 사용할 폴더의 경로에 넣어 주었다.
import cv2
img = cv2.imread('img.jpg') # 해당 경로의 파일 읽어오기
cv2.imshow('img', img) # img 라는 이름의 창에 img를 표시
cv2.waitKey(5000) # 지정된 시간 동안 사용자 키 입력 대기
cv2.destroyAllWindows() # 모든 창 닫기
실행하면 이렇게 뜬다.
또한 읽기 옵션은 대표적으로 3가지가 있다.
- cv2.IMREAD_COLOR : 컬러 이미지, 투명 영역은 무시 (기본값)
- cv2.IMREAD_GRAYSCALE : 흑백 이미지
- cv2.IMREAD_UNCHANGED : 투명 영역까지 포함
img_color = cv2.imread('img.jpg', cv2.IMREAD_COLOR)
img_gray = cv2.imread('img.jpg', cv2.IMREAD_GRAYSCALE)
img_unchanged = cv2.imread('img.jpg', cv2.IMREAD_UNCHANGED)
cv2.imshow('img_color', img_color)
cv2.imshow('img_gray', img_gray)
cv2.imshow('img_unchanged', img_unchanged)
cv2.waitKey(0)
cv2.destroyAllWindows()
실행하면 총 3개의 창이 뜨게 되며 아무키나 누르면 꺼지게 된다.
실행화면
img.shape # 세로, 가로, Channel
(426, 640, 3)
고정 크기로 설정 방법
import cv2 img = cv2.imread('img.jpg') dst = cv2.resize(img, (400,500)) # 가로 세로 크기 cv2.imshow('img', img) cv2.imshow('resize', dst) cv2.waitKey(0) cv2.destroyAllWindows()
resize() 를 활용하여 수정하였다.
비율로 설정 방법
img = cv2.imread('img.jpg') dst = cv2.resize(img, None, fx=0.5, fy=0.5) # x , y 비율 정의 ( 0.5 배로 축소 ) cv2.imshow('img', img) cv2.imshow('resize', dst) cv2.waitKey(0) cv2.destroyAllWindows()
비율을 fx = 0.5 이런식으로 설정하여 수정하였다.
영역을 잘라서 새 윈도우 창에 표시
import cv2 img = cv2.imread('img.jpg') # img.shape # 426 640 3 crop = img[100:200, 300:400] # 세로 기준 100 : 200 , 가로 기준 300 : 400 cv2.imshow('img',img) # 원본 cv2.imshow('crop',crop) # 잘린 이미지 cv2.waitKey(0) cv2.destroyAllWindows()
위와 같이하면 기존 이미지와 새로운 이미지가 뜨게 된다.
영역을 잘라서 기존 윈도우 창에 표시
import cv2 img = cv2.imread('img.jpg') crop = img[100:200, 300:400] # 세로 기준 100 : 200 , 가로 기준 300 : 400 img[100:200 , 400 : 500] = crop cv2.imshow('img',img) # 원본 cv2.waitKey(0) cv2.destroyAllWindows()
이렇게 기존 창에서 새롭게 뜨게 된다.
상하대칭
import cv2 img = cv2.imread('img.jpg') flip_vertical = cv2.flip(img, 0) # flipCode == 0 : 상하 대칭 cv2.imshow('img',img) cv2.imshow('flip_vertical', flip_vertical) cv2.waitKey(0) cv2.destroyAllWindows()
이것은 cv2.flip()을 사용하며, filp의 안에 (img, 0) 즉 숫자가 0 과 같다면 상하대칭이다.
상하좌우 대칭
import cv2 img = cv2.imread('img.jpg') flip_both = cv2.flip(img, -1) # flipCode == 0 : 상하 대칭 cv2.imshow('img',img) cv2.imshow('flip_both', flip_both) cv2.waitKey(0) cv2.destroyAllWindows()
만약 filp이 -1 이라면 상하좌우 대칭이다.
시계방향 90도 회전
import cv2 img = cv2.imread('img.jpg') rotate_90 = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE) # 90도 시계방향 회전 cv2.imshow('img', img) cv2.imshow('rotate_90', rotate_90) cv2.waitKey(0) cv2.destroyAllWindows()
cv2.rotate()라는 것을 사용하며 cv2.ROTATE_90_CLOCKWISE (90도 시계방향 회전) 을 써주어야 한다.
기존에 출력되는 이미지는 지우고 이것만 가진을 가져왔다.
180도 회전
import cv2 img = cv2.imread('img.jpg') rotate_180 = cv2.rotate(img, cv2.ROTATE_180) # 180도 회전 cv2.imshow('img', img) cv2.imshow('rotate_90', rotate_180) cv2.waitKey(0) cv2.destroyAllWindows()
이것은 아까처럼 cv2.ROTATE_90_CLOCKWISE 이 존재하지 않는다.
270도 회전
import cv2 img = cv2.imread('img.jpg') rotate_270 = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE) # 90도 시계방향 회전 cv2.imshow('img', img) cv2.imshow('rotate_270', rotate_270) cv2.waitKey(0) cv2.destroyAllWindows()
이것은 90도의 cv2.ROTATE_90_CLOCKWISE 에서 cv2.ROTATE_90_COUNTERCLOCKWISE 으로 바꿔주었다.