히스토그램
- 영상을 구성하는 픽셀들의 빈도수를 측정하여 그래프(히스토그램)으로 표현
cv2.calcHist(images, channels, mask, histSize, ranges, hist=None, accumulate=None)
- images: 히스토그램을 구할 입력영상 리스트
- channels: 히스토그램을 구할 채널 리스트
- mask: 마스크 영상. 영상전체일 경우 None지정
- histSize: 히스토그램 각 채널의 bin의 개수 리스트
- ranges: 히스토그램 각 채널의 최솟값과 최대값 리스트
밝기 조절하기(brightness)
- 영상을 전체적으로 밝게 또는 어둡게 만드는 연산 (덧셈)
- 밝기 조절 수식
cv2.add(src1, src2)
- 밝기 조절이나 두 영상을 합치기에 사용할 수 있다.
- src1: 첫번째 영상 또는 스칼라
- src2: 두번째 영상 또는 스칼라
- src2를 src1에 더한다.
- pixel에 스칼라 값을 더하거나 빼면 0 ~ 255의 범위를 넘어설 수 있다. ndarray의 type은 uint8(unsigned int8) 로 0 ~ 255범위를 넘어가는 숫자는 순환되어 버린다.
- 계산결과가 0이하가 되면 255로 부터 작아지게 되고 255가 넘어가면 0으로 가서 커지게 된다.
- 그래서 cv2.add() 함수는 값이 순환되지 않도록 0이하의 값은 0으로 255이상의 값은 255가 되도록 처리한다. 이것을 saturate연산이라고 한다.
명암비(Contrast) 조정
명암비/대비(Contrast)란
- 밝은 부분과 어두분 부분 사이의 밝기의 정도 차이
- 영상이 전체적으로 밝은 픽셀들로만 구성되거나 어두운 픽셀들로만 구성되면 명암비가 낮다고 표현한다.
- 영상에 밝은 영역과 어두운 역역이 골고루 섞여있으면 명암비가 높다고 표현한다.
명암비를 변환하는 함수공식 \(g(x, y)=f(x,y)+(f(x,y)-128) \alpha\\ ==\\ (1+\alpha)f(x, y)-\alpha 128\)
- $g$는 결과 image
- $f$는 원본 image
- $x$: x좌표
- $y$: y좌표
- $\alpha$: 대비를 조절하는 값.
- 0: 원본과 동일
- 음수: 명암비를 낮춘다.
- 양수: 명암비를 높인다.
채도 (Saturation) 변환
- 채도: 색의 선명도를 말한다.
- 채도를 변환할 때는 HSV color 타입으로 변환한 뒤 S의 값을 바꾼다.
- HSV : 색상(Hue), 채도(Saturation), 명도(Value)
Filter
Filtering 개요
- 영상에서 필요한 정보만 통과시키고 필요없는 정보는 걸러내는 작업을 말한다.
- N x N행렬을 영상과 Convolution연산(Correlation연산)을 하여 처리한다.
- 영상과 연산하는 N x N 행렬을 커널(Kernel), 마스크(Mask), 윈도우(Window)라고 한다.
- Convolution연산
- 최외곽처리는 바깥에 가상의 픽셀들이 있다고 생각하고 거기에 임의의 값을 채워 계산한다.
- 가상의 바깥픽셀을 Padding이라고 한다.
- 바깥픽셀을 채우는 방법
BORDER_CONSTANT : 같은 값으로 채운다. 보통 0으로 채움 000 abcd 000 BORDER_REPLICATE: 외곽에 있는 값으로 채운다. aaa abcd ddd BORDER_REFLECT: 거울에 반사되는 형식으로 채운다. cba abcd dcb BORDER_REFLECT_101: (OpenCV 기본방식)BORDER_REFLECT와 같은 형식인데 가장 외곽의 값은 반사시키지 않는다. dcb abcd cba
- N x N 행렬이 어떤 값을 가지고 있느냐에 따라 다양한 영상처리가 가능하다.
- Bluring: 영상을 부드럽게 만들기
- Shapening: 영상을 날카롭게 만들기
- 엣지 검출
- Noise 제거
- 다양한 형태의 Kernel이 있으나 보통 3 x 3 행렬을 많이 쓴다.
1
- anchor(고정점): 영상에서 Filtering을 하려는 지점을 가리키는 필터의 중앙점을 사용한다.
Blurring
- 영상을 흐릿/부드럽게 만드는 작업.
- 픽셀간의 값의 차이를 줄여서 날카로운 엣지가 무뎌지고 영상에 있는 Noise(잡음)이 사라지도록 하는 효과가 있다.
엣지(Edge): 물체간의 경계부분으로 contrast(대비)가 크다.
평균값 블러링(Average Blur)
- 주변 픽셀의 평균값을 합성곱하여 적용한다.
- 보통 3 x 3이나 5 x 5 필터를 많이 쓰며 필터의 크기가 커질수록 더 흐릿하게 변환된다.
영상이 뭉게져 세밀한 부분이 잘 안보이는 단점이 있다.
cv2.blur(src, ksize)
- src: blur 처리할 입력영상
- ksize: 필터의 크기. (width, height) 튜플로 지정
- blurring 결과 예시
Gaussian Blur
- 대상 픽셀(Anchor)와 가까운 픽셀은 큰 가중치 멀리있는 픽셀은 작은 가중치를 사용해서 평균(가중평균)을 계산해서 필터링 한다.
- Gaussian 분포(정규분포)의 확률밀도 함수를 사용해 필터에 들어갈 값들을 계산하여 대상픽셀을 기준으로 멀어질 수록 작은 값이 곱해지도록 한다.
- 평균은 0으로 하고 표준편차를 조정하여 흐림의 정도를 조절한다. 표준편차 값을 크게할 수록 흐려진다.
- Filter의 shape은 $(8\sigma + 1,\;8\sigma + 1)$ 나 $(6\sigma + 1,\;6\sigma + 1)$ 으로 정해진다. $\sigma: 표준편차$
cv2.GaussianBlur(src, ksize, sigmaX, sigmaY)
- src: blur를 적용할 영상.
- ksize: 커널크기. (0,0)으로 지정하면 sigma 값에 의해 결정된다. (보통 0,0 으로 설정)
- sigamX: X축방향 sigma(표준편차) 값
- sigamY: Y축방향 sigma(표준편차) 값. 생략하면 sigmaX와 같은 값 사용
잡음 제거
cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)
- 양방향 필터로 선명도는 유지하면서 bluring을 이용해 노이즈를 제거한다.
- src: 잡음을 제거할 입력영상
- d: 필터의 크기 지정. 음수(-1)을 입력하면 sigmaSpace값에 의해 자동 결정된다. 일반적으로 -1을 설정한다.
- sigmaColor
- 엣지인지 아닌지를 판단하는 기준값. 지정한 값보다 크면 엣지라고 생각하고 작으면 엣지가 아니라고 생각해 그 지점을 blurring 한다.
- 이 값을 너무 크게 주면 엣지가 검출이 안되서 그냥 Gaussian Filter 사용하는 것과 같다.
- sigmaSpace: Gaussian Filter에서 지정한 표준편차
샤프닝(Sharpen)
- Blurring의 반대로 흐린영상을 선명한 영상으로 만드는 작업.
- 이미지의 엣지(edge-사물의 윤곽부분)의 대비를 크게 만들어 준다.
- 이미지 전체를 다 선명하게 하는 게 아니라 윤곽(edge)만 선명하게 만들어 명암비(contrast)를 크게해 선명하게 보이게 한다.
- Unsharp mask(언샤프 마스크) 필터링
- Unsharp한 영상을 이용해 Sharp한 영상을 만든다고 해서 Unsharp mask filtering 이라고 한다.
- 원본 이미지에서 blurring 한 이미지를 뺀다음 그것을 원본이미지에 다시 더한다. \(h(x) = f(x)+\alpha(f(x)-\bar{f}(x))\\ f(x): 원본\;이미지\\ \bar{f}(x):\;원본\;이미지를\;blurring한\;이미지\\ \alpha: shappening\,정도\,조절값\)
- 제공 함수는 없고 위 공식을 구현한다.