본문 바로가기

python 시작하기

python OPEN CV를 활용하여 이미지를 저장해보자!

728x90
반응형

오랜만입니다. 요새 팀프로젝트로 인해서 블로그를 할 여력이 없었습니다.

나중에 제가 무슨 프로젝트를 했는지 블로그에 올리거니까 많은 관심 부탁드립니다.

 

오늘 같이 학습 할 것은 바로 OPEN CV 입니다.

그게 뭐냐고요?

Open Source Computer Vision Library의 약어로.... 너무 지루하네요 일종의 머신 비전입니다.

말그대로 영상처리 이미지처리 와 같이 사람의 눈으로 인식되는 것을 컴퓨터에서도 가능하게 해주는 코드입니다.

 

OPEN CV

  • 500 가지가 넘는 영상 처리 알고리즘이 최적화 되어있다.
  • 영상 처리에 사용할 수 있는 오픈 소스 라이브러리다.
  • GPU 가속 모듈을 지원한다.
  • 머신러닝과 관련된 모듈을 포함한다.
  • 컴퓨터 비전 분야를 발전시키기 위한 목적이다.

OPEN CV 활용

-  이미지 변환(크기 조정, 회전, 자르기)

-  객체 탐지 및 추적 (얼굴 인식, 물체 검출)

-  딥러닝 모델을 활용한 이미지 분류 및 객체 탐지

-  공장에서 제품 검사

-  의료 영상 처리 및 보정

-  CCTV

-  로보틱스

 

정말 많은 곳에 활용되는 코드입니다.

그럼 일단 설치부터 해봅시다.

아 가상환경 확인하셔야 합니다.!!!!!

pip install opencv-python

그리고 import는 이제 말 안해도 아시죠?

import cv2

그럼이제 간단하게 이미지를 읽고 가져와 봅시다!

이미지를 읽느 함수는 : imread(파일명,[옵션]) 형식으로 파일명은 영문이나 숫자여야 합니다.

옵션 종류

  • cv2.IMREAD_COLOR: 이미지를 컬러(BGR)로 읽음 (기본값)
  • cv2.IMREAD_GRAYSCALE: 이미지를 흑백으로 읽음
  • cv2.IMREAD_UNCHAGED: 알파 채널(투명도 포함)을 포함하여 이미지를 읽음

실습 인터넷에서 사과 사진 읽어오기

  • 인터넷에서 떠도는 사과 사진 아무거나 가져오기
  • 컬러, 흑백, 투명도 순서대로 결과 내보내기
  • 이미지를 쓰는 방법은 cv2.imshow("파일 이름", 이미지)

여기서 잠깐 분명 코드가 실행되고 뭔가 반짝 하고 사라지지 않았나요?

네 코드는 정말 잘 실행 된 것이지만 그 창을 유지하라는 명령어가 없기 때문에 그렇습니다.

이럴때

cv2.waitkey(delay)

delay가 0일경우 무한적으로 대기 하게 됩니다.

그런데 이제 테스트를 위해서 계속 이미지를 끄고 키고 반복적으로 할 경우 더미 메모리가 쌓여 이제 정보처리에 지장을 줍니다. 그래서 보통 waitkey는 아래와 같은 함수와 같이 사용됩니다.

cv2.destroyAllWindows()

모든 창을 닫음

cv2.destroyWindow(winname)

지정된 창을 닫음(winname: 닫을창의 이름)

그런데 출력만 해보고 저장을 안하면 나중에 또 쓸수가 없습니다. 그러니 이번에는 쓰는 법도 같이 알아 봅시다.

쓰는 법

cv2.imwrite('저장할 파일경로', 저장할 이미지)

  • 파일명에 따른 압축 방법
    • output.jpg : JPEG 이미지 (손실 압축)
    • output.png : PNG 이미지 (무손실 압축)
    • output.bmp : BMP 이미지 (비압축)
    • output.tiff : TIFF 이미지 (무손실/ 손실 압축 가능)

그럼 이제 읽고 쓰는 법을 배웠으니, 꾸미는 방법을 배워야 겠죠?

보통 이미지 크기를 변경하거나 데이터 타입을 변경, 색상 공간 변환을 주로 사용합니다.

 

이미지 크기 방향 변환

.shape(높이, 너비, 채널 수)

  • 채널(channel) - 흑백 이미지는 하나의 채널이 있고, 컬러 이미지의 경우에는 빨간색, 초록색, 파란색의 총 3개의 채널을 가짐

cv2.resize(이미지, (너비, 높이))

  • 너비,높이없이 = none , fx, fy를 사용하여 가로/세로 비율로 크기 조정
  • fx, fy = 0.5 # 50% 비율

ROI처리 (관심 영역을 제외한 이미지 자르기)

  • 사용법: roi = image[y:y, x:x]
  • 주의) ROI는 원본 이미지와 메모리를 공유하기 때문에 ROI를 수정하면 원본이미지도 변경됨으로, 복사본을 만들고 싶다면 copy()를 사용.
    • roi_copy = image[ y:y , x:x].copy()

회전 및 이동

  • warpAffine(): 이미지를 회전하거나 이동하기 위해 변환 행렬을 사용

자 지루한 이론은 다 했으니, 이 모든걸 적용할 수 있는 실습을 해야 이해가 되겠죠?

실습. 이미지 처리

  • 이미지를 읽어서 크기를 출력하세요
  • 이미지를 50% 크기로 축소하고 새로운 창에 표시하세요.
  • 이미지를 30도 회전하여 저장하세요
  • ROI로 원하는 지점을 선택후 copy로 저장 하세요.

해답 예시

오늘도 같이 공부하시느라 수고 많으셨습니다!!!!!!

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

여기까지 읽으신 분들에게 하나의 팁!!!

 

ROI 영역을 어떻게 지정할지 막막하죠 일일이 찍어가면서 알아야 하니

하지만 그것을 이제 드래그로 해결할 수 있는 함수하나 알려 드리겠습니다.

 

반응형