이미지 크기
이미지를 구성하는 세가지 요소 : 크기, 정밀도, 채널
위 구성요소를 분리하는 채널 : 관심영역, 관심채널
-> opencv 함수를 사용할때 이미지 구성요소 중 하나 이상의 함수가 요구사항과 일치해야함
이미지 : 행렬(matrix) 형태로 구성
이미지의 크기 = 데이터의 크기 -> 고화질 이미지 = 과도한 연산
opencv에서 원본 이미지를 불러올 경우 에러 : 이미지 크기 속성값이 액자 역할을 함
액자 크기와 이미지 크기가 다르면 담을 수 없음 -> 원본 이미지 크기 변경
액자 : 변수/필드, 이미지 크기 재설정시 액자크기 또한 재설정 필요
-> 원본 이미지에서 45도 회전할 경우 각 모서리가 잘린 형태가 됨 = 이미지 누락
이미지크기와 액자의 크기는 별개의 속성. 자동으로 변환x
이미지크기 표현방식 : 너비(width)와 높이(height), 행(row)과 열(column)
언어 플랫폼과 함수마다 이미지 크기 기준을 파악해야 오류를 줄임
정밀도
정밀도 : 이미지가 얼마나 많은 색상을 표현할 수 있냐
높을수록 많은 색상 표현이 가능하므로 데이터의 폭이 넓어지고 자연스러운 이미지로 표시
정밀도가 높다고 정확도가 높아지지는 않음. 오히려 많은 데이터로 인해 정확도 저하 가능성
비트 : 색상의 표현 개수
표현방식 : n-Bit, n은 비트의 수를 의미. 이때 n의 의미는 2의n제곱 이므로 1-Bit는 2의 값임
1-Bit의 경우 0과 1 두가지 값만 갖음. 모든 색상의 표현을 0과 1의 값을 지니는 색상으로 표현
-> 두가지 색상이 아닌 두가지 숫자로 색상을 표현
색상을 표현할때 적어도 8-Bit (256가지 값)여야 유의미한 데이터를 얻음
즉, 8비트 정밀도를 사용할 때 흑백 색상을 원활하게 표현, 그레이스케일 메소드에서 사용
1비트 : 이진화, 4비트 : 저화질, 8비트 : 그레이스케일 이미지
8비트 정밀도 이미지를 표현할때 u8(unsigned 8bit integers) 주로 활용.
OpenCV 형식 | 데이터 형식 | 의미 |
np.uint8 | byte | 8-bit unsigned integers |
np.int8 | sbyte | 8-bit signed integers |
np.uint16 | 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 |
[python opencv 정밀도 형식]
color = np.zeros((height, width, 3), np.uint8)
gray = np.zeros((rows, cols, 1), up.uint8)
<정밀도 표현>
파이썬에서는 np.<n-Bit> 형식 사용. color:색상이미지, gray:그레이스케일 이미지
채널
채널 : 그래픽스 이미지의 색상 정보
-> Red, Green, Blue 추가로 Alpha로 구성. 이외 Hue, Saturation, Value 등
색상표현 : 3~4개의 채널(다채널, 다중채널), 1개의 채널(단일채널)
색상이미지(BGR)에서 Red 값만 추출한다고 해서 이미지가 빨간색으로 표현되지 않음.
-> OpenCV에서는 RGB가 아닌 BGR 순서 사용
-> 분리된 이미지를 한 가지 채널로만 색상을 표현해야 하기 때문
해당 성분에 가까울수록 흰색(255)으로 출력, 성분과 먼 값일수록 검은색(0)으로 출력
color = np.zeros((height, width, 3), np.uint8)
gray = np.zeros((rows, cols, 1), up.uint8)
<채널 표현>
파이썬에서는 (row, column, 채널 수) 형식
단일채널 사용 : 간단히 흑백이나 특정 색상 데이터 가져올 때 사용. -> 다중채널시 동일한 값 3회 반복 비효율적. 연산량 증가와 정확도의 감소 초래
관심영역
관심영역 : 이미지상에서 관심 있는 영역 (ROI : Region Of Interest)
OpenCV에선 주요 데이터로 N차원 배열 사용. 1920x1280 3채널시 7,374,800개의 공간 생성
하나의 공간당 할당 데이터 수는 256. 데이터가 커질때마다 기하급수적으로 데이터 증가
이를 방지하고자 관심영역을 사용해 불필요한 데이터 양을 줄임
알고리즘 구성시 초기 검출단계 : 이미지 전체에 대한 오브젝트 검출
추가적인 알고리즘 적용 : 해당 오브젝트의 이미지 영역(관심영역)에서 알고리즘 적용
ex. 이미지에서 시계를 찾아 현재 시간 확인 > 시계 객체 검출(관심영역 설정) > 시간 검출
관심채널
관심채널 : 이미지상에서 관심 있는 채널 (COI : Channel Of Interest)
특정 영역을 불러와 연산량의 감소와 정확도를 향상
채널을 분리하여 특정 채널에 대한 연산을 수행하면 데이터의 양이 3/1로 줄어듬
반환하는 데이터의 양은 3배로 늘어남 …
특정채널의 밝기 분포를 계산하거나 알파 혼합(투명도를 가진 이미지 두개 혼합) 등에 활용
히스토그램
히스토그램 : 데이터의 분포를 몇 개의 구간으로 나눈 후 각 구간에 속하는 데이터를 시각적으로 표현한 막대그래프, 도수 분포표 중 하나.
픽셀값을 X축으로, 픽셀수를 Y축으로 한다면 그레이스케일 이미지의 색상 값 빈도수 파악가능. 이미지의 밝은 픽셀과 어두운 픽셀이 어떤 형태로 분포하는지 알 수 있음.
세가지 주요 요소
- 빈도수(BINS) : 히스토그램 그래프의 X축 간격
-> 픽셀값의 범위 0~255 / 빈도수 값 8 / 0~7 범위로 32개의 막대 생성
- 차원수(DIMS) : 히스토그램을 분석할 이미지의 차원
-> 색상차원 (단일채널/다중채널 ..)
- 범위(RANGE) : 히스토그램 그래프의 X축 범위
-> 특정 픽셀값의 영역 분석
hist = cv2.calcHist(
images,
channels,
mask,
histSize,
ranges,
hist = None,
accumulate = False
)
<히스토그램 계산 함수>
입력이미지(images)의 특정 채널(channels)에 대해 히스토그램 계산.
단일채널:0, 다중채널: blue 0, green 1, red 2
마스크(mask)는 이미지를 분석할 영역을 따로 설정하는 역할. 그대로일경우 None값
히스토그램 크기(histSize)는 빈도수(bins) 설정 및 크기 설정
히스토그램 범위(ranges)는 범위(range) 설정
누산(accumulate)는 누산해 반영할지 설정
Numpy 데이터
Numpy 라이브러리 : Numeric lib + NumArray lib -> 높은수준의 다차원 배열 계산
모든 python OpenCV 배열 구조는 Numpy 배열로 변환.
이외에도 SciPy, Matplotlib 같은 라이브러리도 사용 가능
Numpy의 배열 클래스 중 ndarray 사용.
세가지 주요 요소
- 차원의 수(ndim) -> 이미지 너비, 높이, 채널로 3차원으로 간주
- 차원의 크기(shape) -> 이미지 너비, 높이, 채널의 값
- 데이터형식(dtype) -> 정밀도를 설정해 데이터의 폭 설정
import numpy as np
array = np.array([[1, 2, 3], [4,5,6]])
print(array.ndim)
print(array.shape)
print(array.dtype)
<Numpy 배열의 기본 요소>
2
(2, 3)
int32
- numpy 라이브러리 임포트
- np.array() 구문으로 ndarray 생성하여 배열 클래스 사용
- array() 함수는 리스트나 튜플 형태의 인수를 받음.
- ndim, shape, dtype을 사용해 차원의 수, 차원의 크기, 데이터 형식 확인
*리스트, 튜플 등과 동일하게 인수로 전달된 Numpy 배열은 참조형식임.
이 값을 변경하면 원본 값도 변경됨
'영상처리 > OpenCV' 카테고리의 다른 글
배열 병합 및 분리 (0) | 2022.06.07 |
---|---|
배열 차원 변형 (0) | 2022.06.07 |
배열의 블록 단위 요소에 접근 (0) | 2022.06.07 |
배열의 개별 단위 요소에 접근 방법 (0) | 2022.06.07 |
ndarray 클래스 - N차원 배열 (0) | 2022.06.07 |