210714 FUNDAMENTAL 12. 이미지파일 다루기

문소정·2021년 7월 14일
0

AIFFEL

목록 보기
12/66

사용 패키지 : Pillow, OpenCV, Matplotlib

> pip install pillow opencv-python matplotlib
> mkdir -p ~/aiffel/python_image_proc/data
> ln -s ~/data/* ~/aiffel/python_image_proc/data
> s ~/aiffel/python_image_proc/data  # 파일 확인

1. Pillow 사용법

이미지는 배열 형태 데이터, [너비, 높이, 채널(RGB순서)]형태

  • uint8 : 각 값이 부호가 없는(unsigned) 8비트 정수(integer)가 되어 0~255(2의 8승 = 256) 사이의 값을 나타냄
  • .size() : 가로 세로 크기
  • .width()/.height() : 가로크기/세로크기
  • .resize()
  • .crop()

참고자료 :OpenCV 크기조절

2. Pillow 활용 데이터 전처리

  • .reshape(x, order = 'C', 'F' or 'K')
    • C : (디폴트) C와 같은 순서로 인덱싱
    • F : Fortran과 같은 순서로 인덱싱
    • K : 메모리에 발생하는 순서로 인덱싱

3. OpenCV

OpenCV에서는 RGB가 아닌 BGR 순서를 사용(주의✨)하며 Python 전용 ❌, C++, Java, Matlab등에서 함께 사용가능함

  • %matplotlib inline
    • Rich output(그림, 소리, 애니메이션 등의 결과물)에 대한 표현방식
    • jupyther notebook을 실행한 브라우저에서 바로 그림을 볼수 있게 해주는 것
    • 브라우저 내부(inline)에 바로 그려지도록 해주는 코드
  • .imread() : 이미지 읽기(jpeg, png, bmp 등)
  • .inRange : 특정 범위 안에 있는 행렬 원소 검출 ⇨ 특정 생상 영역 추출
    • 해당하는 픽셀 1, 그렇지 않으면 0을 배열로 반환하는 함수
  • .cvtColor() : 비트연산. 두 이미지의 동일 위치에 대한 AND,OR,NOT, XOR 연산 진행
    • 색상 변환코드는 원본 이미지 색상 공간2결과이미지 색상 공간을 의미
    • 원 RGB -> 결과 HSV(Hue 색상, Saturation 채도, Value 명도)
  • .bitwise_and() : 이미지 and 비트연산. 동일한 이미지 출력
    • mask= : 적용 영역만 나오도록 지정. 도배할때 마스킹테이프 역할.
  • .imshow() : 이미지 표시 & show() 메서드를 호출해야 이미지를 보여줌
    • plt.imshow 대신 PIT.Image.show(), cv.imshow(res)도 이미지를 화면에 표시함

참고자료 :
1. OpenCV Tutorials
2. OpenCV 색상 공간 변환
3. OpenCV Tutorials/Changing Coloerspaces
4. cv2.inRange()
5. 이미지 비트연산

4. 실습

> pip install opencv-python matplotlib

이미지에서 색상 히스토그램을 추출하고, 이를 서로 비교하는 기능들을 불러 사용함

STEP 1-3

STEP 4. 기능의 모듈화

STEP 5. 설계 과정 완성

  • 프로그램 실행
  • build_histogram_db()
    • CIFAR-100 이미지들 불러오기
    • CIFAR-100 이미지들 각각 히스토그램 만들기
    • 딕셔너리{키 = 이미지 이름 : 값 = 히스토그램}를 histogram_db에 반환
  • CIFAR-100 히스토그램 중 입력된 이미지 이름에 해당하는 히스토그램을 입력 이미지로 선택
  • search()
    • 입력값
      • 입력 이미지 히스토그램 target_histogram
      • 전체 검색 대상 이미지들의 히스토그램을 가진 딕셔너리 histogram_db
    • OpenCV의 compareHist() 함수를 사용하여 입력 이미지와 검색 대상 이미지 각각의 히스토그램 간 유사도 계산
      • 결과 : result = {키 = 이미지 이름 : 값 = 유사도}
    • 계산된 유사도 기준 순서대로 정렬
    • 유사도 순서상 상위 5개 이미지 선택 ⇨ result에 남김
  • 고른 이미지들 표시
  • 프로그램 종료

STEP 6. 코드 구현

(1) get_histogram() 구현

이미지 파일 1개에 대해 히스토그램을 만드는 함수 구현

  • .calcHist(images, channels, mask, histSize, ranges(, hist(, accumulate)))
    • 영상의 히스토그램을 확인(???? 정의가 확 이해되지 않는다😅)
    • image : 분석 대상 이미지(array 형태)
    • channels : X축의 대상
      • 흑백사진 : [0]
      • 컬러사진 : [0],[0,1]형태(1 : Blue, 2: Green, 3: Red)
    • mask : 이미지 분석영역. None이면 전체 영역
    • histSize : 히스토그램 구간 갯수
    • ranges : 등간격[0, 256]
  • os.path.join
  • get_histogram()

(2) build_histogram_db() 구현

디렉토리에 모아둔 이미지들 각각 히스토그램 만드는 함수 구현

(3) target_histogram() 구현

(4) search() 구현

  • .compareHist(H1,H2, compare_method)
    • 두 히스토그램이 서로 얼마나 잘 일치하는지 나타내는 수치 매개변수를 가져옴
    • 측정항목(상관분석/카이제곱/교집합/Bhattacharyya distance 등)
      • cv.HISTCMP_CORREL : 상관분석(상관계수 Correlation)
      • cv.HISTCMP_CHISQR : 카이제곱 검정(Chi-squared test)
      • cv.HISTCMP_INTERSECT : 교집합(Intersection)
      • cv.HISTCMP_BHATTACHARYYA : 바타차랴 거리 측정 알고리즘(Bhattacharyya distance: 연속적이거나 불연속적인 두 확률 분포의 유사성을 측정하는 통계적 확률 계산으로 오류율을 측정하여 거리를 계산)

참고자료
1. Histogram comparison
2. cv2.compareHist() method
3. compareHist()
4. HistCompMethods

(5) show_result() 구현

result를 입력받아 5개의 이미지를 화면에 출력하는 함 구현

  • .figure() : figure 객체 생성. 그래프를 표현할 액자를 만듦
  • .add_subplot(행, 열) : 행, 열 위치에 그래프를 그림
    • subplot과 원리는 같음
      + subplot : 한 번에 여러개의 그래프를 행X열 만큼 그림

참고자료
1. matplotlib 구성
2. figure 이해
3. 한 화면에 그래프 여러개 그리기 (add_subplot 이용)
4. add_subplot과 subplot의 차이

(6) 총정리

유효하지 않는 이미지 파일명을 넣을 경우 맨아래와 같은 Error 결과를 보임. 이유는 아무리 검색해봐도 모르겠음.....🤯


의문
1. data[:,:] 해석을 어떻게 하는 것일까?
2. (6) 총정리에서 유효하지 않은 이미지 파일명일 때 에러의 의미는 무엇일까?

추가로, 수업당일 하고 나서 다시하려니 자꾸 파일 경로쪽에 에러나길래 해당 파일을 열어보니 404 error.... 결국 디렉토리 내에 파일 전부 지우고 함(rm *.png) 매~~~번 이래야 하나봄ㅠㅠ 귀찮...
리눅스 파일 및 디렉토리 삭제하는 방법

0개의 댓글