모두야

2. OpenCV 알아보기 본문

study/OpenCV

2. OpenCV 알아보기

미미밍2 2021. 4. 16. 14:34
반응형

OpenCV 알아보기(p35~53)

  • OpenCV에서 이미지를 구성하는 요소로 3가지 데이터가 있다.
  • 이미지 크기, 정밀도, 채널로 구성되어 있으며, 3가지 구성요소를 분리하는 관심영역, 관심채널이 있다.

이미지끼리 연산한다면 이미지의 세 가지 구성 요소가 모두 일치해야 하는 경우가 많으며, OpenCV 함수를 이용할 때에도 이미지의 구성 요소 주우 하나 이상이 함수의 요구사항과 일치해야 하는 조건이 있다. 또한 함수를 효율적으로 처리하기 위해 관심 영역과 관심 채널을 이미지 구성요소에 적용해 이미지의 일부분을 잘라내어 사용해야 하는 경우도 있다. 

 

  1. 이미지의 크기 속성
  2. 정밀도
  3. 채널
  4. 관심영역(ROI:Region Of Interest)
  5. 관심채널(COI)
  6. 히스토그램

1. 이미지의 크기 속성

  • 이미지 크기 = 데이터 크기 = 필드나 변수에 할당될 이미지의 너비 * 이미지의 높이를 의미한다. 
  • 이미지는 행렬(matrix)형태로 구성되어 있다.
  • 많은 알고리즘에서 이미지 크기를 변경하는 메서드인 Image PyramideResize를 전처리 과정에서 적용한다.
  • 단순히 연산할 이미지의 크기를 바꾸는 과정도 딥러닝의 정확도와 연산량에 큰 영향을 미친다.
 OpenCV에서 변수나 필드에 설정된 이미지의 크기를 원본 이미지로 불러오면 오류가 발생할까?
    왜 새로운 이미지를 불러왔을 때 오류가 날까?

  • 변수나 필드에 설정된 이미지 크기 속성 값(액자)가 원본 이미지 크기와 달라 액자에 이미지를 담을 수 없어 오류가 발생한다. 
  • 원본 이미지의 크기를 변경하는 함수를 적용한 후, 변수나 필드로 불러와 사용해야 한다.

 

파이썬에서는 어떻게 이미지 크기를 표현하나요?(예제 2.2)

  • 높이(height)와 너비(width) 이나 행(row) 과 열(column) 로 표시 한다.
  • 행 = 가로줄 갯수 = 높이   ,    열 = 세로줄 갯수 = 너비
# Python OpenCV 에서의 이미지 크기 표현

color = np.zeros((height,width,3),np.unit8)       #색상 이미지
gray = np.zeros((row,cols,1),np.unit8)	  	 #흑백 이미지

np.unit8 : 8-bit unsigned integers 를 사용하여 색상을 표현하기 좋은 0~255 범위로 정밀도를 표현한다.

색상 이미지와 흑백 이미지의 차이는 채널 수이다. 


 

2. 정밀도 (Bit Depth)

  • 정밀도 : 이미지가 얼마나 많은 색상을 표현할 수 있는가?
정밀도 높다 정밀도 낮다
많은 색상을 표현한다 표현하는 색상이 적다
데이터 폭이 넓다 데이터 갯수가 적다
자연스러운 이미지로 표현 육안으로 확인하기 어려운 이미지 변형
데이터 처리 결과 더 정밀하다 정확도가 저하된다

비트 깊이 = 색상 깊이 = 색상 심도 = 하나의 화소 색을 지시하기 위해 활용되는 비트 수

정밀도가 높다고 해서 항상 정확도가 높은 것은 아니다. 너무 많은 데이터로 정확도를 저하시킬 수도 있다.

 

  • 비트(bit) : 색상의 표현 개수를 설정한다.
  • 표현 : nBit, n은 비트의 수 , n 은 2^n 이므로 1-Bit는 2이며, 0과 1 두가지 값만 갖게 된다.
  • 모든 색상을 0과 1의 값으로 표현한다. 
  • 8-bit라면 2^8 이므로, 256가지 값을 갖게 된다.

색상을 표현할 때 적어도 몇 비트가 필요한가요?

  • 8비트 = 그레이스케일(Grayscale)

 

U8 (Unsigned 8-bit integers) 

: 8비트 정밀도 이미지를 표현할 때 U8의 정밀도 값을 가장 많이 활용한다.

: unsigned 는 부호 없음을 의미하고, integers는 정수형을 의미한다.

: 즉, 부호가 없는 8비트 정수형을 의미 == (0~255)

: 반대로 부호가 있다면 signed 이며 (-127~127) 범위의 색상을 표현한다.

 

OpenCV 형식 데이터 형식 의미
np.unit8 byte 8-bit unsigned integers
np.int8 sbyte 8-bit signed integers
np.unit16 uint16 16-bit unsigned integers
np.int16 int16 16-bit signed integers
np.float32 float 32-bit floating point number
np.double double 64-bit floating point number

 

▶ n.uint8이 표현할 수 있는 범위를 정수로 표현하면 얼마인가요?

- unsigned 부호 없는 정수형, 8-bit = 2^8 = 256 이므로 (0~255) 를 표현한다.

 


3. 채널

  • 채널 : 그래픽스 이미지의 색상 정보 를 갖고 있다. (Red,Green,Blue ...)
  • 색상 이미지를 표시할 때는 3~4채널로 다채널, 다중채널을 의미한다.
  • 흑백 이미지는 1채널을 가지고 단일 채널을 의미한다. 색상의 어둡고 밝은 정도만 표현한다.

 

  • 검은색에 가까울 수록 0이 되며, 흰색에 가까울 수록 255가 된다.
  • 단일 채널에서는 검은색과 흰색만 표현되므로, 색상 이미지 Blue를 표현하더라도 3채널 이여야 한다.
  • 어떤 채널을 사용하고, 몇 개의 채널을 사용할 지 여부가 알고리즘과 연산량에 큰 영향을 미친다.

채널은 총 몇개인가요?
: 색상(3~4채널), 흑백(1채널)


 흑백 이미지를 가져올 때 왜 단일 채널을 사용해야 하나요? 3채널을 쓰면 안되나요?

  •  흑백 이미지를 다중 채널로 사용하면 동일한 값이 3회 반복되어 불필요한 연산량 증가와 정확도 감소를 초래한다.

 

OpenCV 에서는 RGB 순서가 아닌, BGR 순서를 사용한다.


4. 관심영역 (ROI: Region Of Interest)

  • 관심 영역 : 이미지 상에서 관심있는 영역

 

OpenCV 에서 데이터로 N차원 배열을 사용한다.

1920 X 1280 비율의 컬러 이미지를 가져온다면 몇 개의 데이터 공간이 생성되나요?
: 1920*1280*3 = 7,372,800 개의 공간 생성
: 1개의 공간에 256개의 데이터 할당 가능하다

 

관심 영역을 사용해야 하는 이유를 설명한다면요?

위의 3가지 OpenCV 구성요소 중 하나의 데이터가 커질 때 마다 기하급수적으로 처리해야할 데이터 양이 늘어난다.

이를 방지하기 위해, 관심영역을 이용하여 불필요한 데이터 양을 줄인다.

  • 이미지를 처리할 때, 객체를 탐지하거나 검출하는 영역을 명확하게 관심 영역이라 지정할 수 있다. (ex)바운딩 박스)
  • 객체를 검출하고, 관심 영역 설정 후 관심 영역 안에서 알고리즘을 적용하면 연산량이 줄고 정확도가 높아져 효율성이 높아진다,
  • 데이터는 보존되며, 외부 영역에 대한 연산이 수행되지 않아 알고리즘의 정확도와 연산 속도를 높인다.

 


 

5. 관심 채널 (COI, Channel of Interest)

  • 관심 채널(COI, Channel of Interest) : 이미지 상에서 관심있는 채널

데이터의 형태를 변형하는 것이 아닌, 특정 영역을 불러와 연산량의 감소와 정확도를 향상 시킨다.

관심 채널은 어디에 활용되나요?

 

 

 


6. 히스토그램

  • 히스토그램 : 도수 분포표 중 하나로 데이터의 분포를 몇 개의 구간으로 나누고 각 구간에 속하는 데이터를 시각적으로 표현한 막대 그래프
  • 이미지에서 사용하는 히스토그램은 X축 : 픽셀의 값, Y축 : 해당 픽셀의 갯수
  • 이미지의 픽셀값을 히스토그램으로 표현하면 이미지의 특성을 쉽게 확인할 수 있다.
▶ 히스토그램이 갖는 세 가지 중요 요소를 말하고, 이를 설명해주세요.

1) 빈도 수(BINS) : 히스토그램 그래프의 X 축 간격
픽셀값의 범위는 0~255로 총 256개의 범위를 갖고 있으며,  빈도 수 값이 8이라면 0~7,8~15,  , 248~255 범위로 총 32개의 막대가 생성된다.

2) 차원 수(DIMS) : 히스토그램을 분석할 이미지의 차원
그레이스케일은 단일 채널이므로 하나의 차원에 대해 분석할 수 있고, 색상 이미지는 다중 채널이므로 세 개 이상의 차원에 대해 분석할 수 있다.

3) 범위 (RANGE) : 히스토그램 그래프의 X 축 범위
이미지를 측정하려는 픽셀값의 범위로서, 특정 픽셀값 영역에 대해서 분석하게 하는데 쓰인다.

<그림 2.12>

 

▶ 어떤 흑백 이미지를 가져와, 히스토그램을 출력해주세요.(예제 2.8 수행)
import cv2
import numpy as np 

image=cv2.imread("histogram.jpg")
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
result = np.zeros((image.shape[0],256), dtype=np.uint8)

hist = cv2.calcHist([image],[0],None,[256],[0,256])
cv2.normalize(hist,0,255,cv2.NORM_MINMAX)

for x,y in enumerate(hist):
    cv2.line(result,(x,image.shape[0]),(x,image.shape[0]-y),255)

dst = np.hstack([image[:,:,0],result])
cv2.imshow("dst",dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

▶ 히스토그램 클래스를 분석하고, 각각의 요소를 설명해주세요. C# openCV에만 있고 python-openCV에는 없는 요소는 무엇인가요?
# Python OpenCV 히스토그램 계산 함수

hists = cv2.calcHist(
	images,
        channels,
        mask,
        histSize,
        ranges,
        hist=None,
        accumulate=False
        )

입력 이미지(image)의 특정 채널(channels)에 대해 히스토그램을 계산한다.

특정 채널은 히스토그램의 X축이 된다.

입력 이미지가 단일 채널일 경우 채널 = 0, 다중 채널 이미지일 경우 Blue =0, Green=1, Red=2 이다.

 

마스크(Mask) : 이미지 분석할 영역을 따로 설정한다. 입력 이미지 그대로 분석한다면 None을 사용한다.

히스토그램 크기(HistSize) : 빈도수(BINS) 설정

누산(accumulate) : 히스토그램이 누적해 반영할지 설정한다.

결과는 매번 히스토그램(hist)에 저장된다.

 

Python OpenCV 에서는 함수의 결과를 반환값으로 받아 사용한다. 함수의 인자에 결과를 받을 변수를 전달하는 것이 아니라, 결과를 함수의 반환값으로 받아 사용한다.

 

C# OpenCVSharp 에만 적용하는 것  <Mat 클래스>

- 차원 수(dims) : 특정 채널 매개변수의 배열 요소 수

- 균일성(uniform) : 히스토그램이 균일한지에 대한 플래그 

                           : True 일 경우, 차원의 순서에 따라 히스토그램 차원 마다 범위 배열의 요소가 사용된다.

                           : False 일 경우, 범위 배열의 모든 요소가 차원의 순서에 따라 순차 배치된다.

반응형

'study > OpenCV' 카테고리의 다른 글

1. OpenCV 설치  (0) 2021.04.16