OpenCV 이진 영상 처리 - (1)

Lily·2023년 10월 26일
0

TIL

목록 보기
13/21

영상의 이진화

  • 영상 픽셀을 0 또는 255로 만드는 연산
    • 배경 vs 객체
    • 관심영역 vs 비관심영역
double threshold(InputArray src, OutputArray dst,
				 double thresh, double maxval, int type);
                 
// 또다른 threshold 사용법
Mat mag;
Mat dst = mag > 120;
  • src : 입력 영상. 다채널, 8비트 또는 32비트 실수형
  • dst : 출력 영상. src와 동일한 크기, 동일 타입, 같은 채널 수
  • thresh : 사용자 지정 임계값
  • maxval : THRESH_BINARY 또는 THRESH_BINARY_INV 방법 시 최댓값 (보통 255)
  • type : 임계값에 의한 반환 함수 지정 또는 자동 임계값 설정 방법 지정
    • THRESH_BINARY : 가장 많이 사용

      dst(x,y)={maxvalsrc(x,y)>thresh0otherwisedst(x,y) =\begin{cases}maxval & src(x,y)>thresh\\0 & otherwise\end{cases}

    • THRESH_BINARY_INV : 가장 많이 사용

      dst(x,y)={0src(x,y)>threshmaxvalotherwisedst(x,y) =\begin{cases}0 & src(x,y)>thresh\\maxval & otherwise\end{cases}

    • THRESH_TRUNC

      dst(x,y)={threshsrc(x,y)>threshsrc(x,y)otherwisedst(x,y) =\begin{cases}thresh & src(x,y)>thresh\\src(x,y) & otherwise\end{cases}

    • THRESH_TOZERO

      dst(x,y)={src(x,y)src(x,y)>thresh0otherwisedst(x,y) =\begin{cases}src(x,y) & src(x,y)>thresh\\0 & otherwise\end{cases}

    • THRESH_TOZERO_INV

      dst(x,y)={0src(x,y)>threshsrc(x,y)otherwisedst(x,y) =\begin{cases}0 & src(x,y)>thresh\\src(x,y) & otherwise\end{cases}

    • THRESH_OTSU : Otsu 알고리즘으로 임계값 결정
    • THRESH_TRIANGLE : 삼각 알고리즘으로 임계값 결정
  • 반환값 : 사용된 임계값

\\
\\

자동 임계값 결정 방법

  • 영상의 히스토그램이 bimodal(쌍봉)이고, 전경&배경 픽셀 분포가 비슷하면(비슷한 분산, 빈도)?
    • 쌍봉 가운데 움푹 패인 부분을 픽셀값 평균으로 구해 threshold로 지정
  • 히스토그램이 bimodal이지만, 전경&배경 픽셀 분포가 크게 다르다면(분산이 다르고 빈도도 다름)?
    • thresholds 구하기가 애매함

Otsu 이진화 방법

  • 입력 영상이 배경과 객체 두 개로 구성되어 있다고 가정 (bimodal histogram)
  • 임의의 임계값 T에 의해 나눠지는 두 픽셀 분포 그룹의 분산이 최소가 되는 T를 선택 (=minTσ12(T)+σ22(T)=\displaystyle \min_{T} \sigma_1^2(T)+\sigma_2^2(T))
  • 일종의 최적화 알고리즘(optimization algorithm)
  • threshold() 함수의 type 인자에 THRESH_OTSU를 지정

\\
\\

지역 이진화

  • 전역 이진화:
    • 영상의 전체에 대해 동일한 임계값을 사용하여 이진화를 수행하는 기법
    • 문제점: 불균일한 조명 환경에 취약
  • 균일하지 않은 조명의 영향을 해결하려면?
    • 불균일한 조명 성분을 보상한 후 전역 이진화 수행
    • Surface fitting 방식이 있긴 하지만 어려움
  • 지역 이진화(local threshold, local binarization)
    • 픽셀 또는 영역마다 다른 임계값을 사용하여 이진화를 수행
    • 보통 영상을 특정 크기 영역으로 분할하여 이진화를 수행하거나 각 픽셀 근방에 윈도우를 설정하고 해당 윈도우에서 임계값을 결정하여 이진화를 수행
      • 영역 또는 윈도우의 크기는?
      • 윈도우의 형태는? Uniform? Gaussian?
      • 윈도우를 겹칠 것인가? Overlap? Non-overlap?
      • 윈도우 안에 배경 또는 객체만 존재한다면? (bimodal 형태가 아니면 하나의 가우시안 봉우리 맥시멈 값을 threshold로 채택해 얼룩덜룩 해질 것임)

\\
\\

적응형 이진화

  • 픽셀 단위로 마스크를 그리고 그 내부 가중 평균값을 구해서 특정 C값을 뺌으로써 threshold를 정하고, 이를 활용해 픽셀 단위로 THRESH_BINARY 방식으로 값을 이진화 함
  • 지역 이진화보단 연산량이 많음
  • 실제로는 미리 가우시안 필터로 평균낸 이미지를 만들어(=gaussianSrc) src vs gaussianSrc - C 를 토대로 이진화 한다고 함
void adaptiveThreshold(InputArray src, OutputArray dst,
				 		double maxValue, int adaptiveMethod,
                        int thresholdType, int blockSize, double C);
  • src : 입력 영상. 다채널, 8비트 또는 32비트 실수형
  • dst : 출력 영상. thresholdType이 THRESH_BINARY인 경우 아래 수식을 사용

    dst(x,y)={maxValuesrc(x,y)>T(x,y)0otherwisedst(x,y) =\begin{cases}maxValue & src(x,y)>T(x,y)\\0 & otherwise\end{cases}

  • maxValue : 이진화에서 사용할 최댓값
  • adaptiveMethod : 블록 평균 계산 방식 지정
    • ADAPTIVE_THRESH_MEAN_C : 산술 평균
    • ADAPTIVE_THRESH_GAUSSIAN_C : 가우시안 가중치 평균
  • thresholdType : THRESH_BINARY 또는 THRESH_BINARY_INV
  • blockSize : 사용할 블록 크기. 3이상의 홀수(3,5,7,...)
  • C : 블록 내 평균값 또는 가중 평균값에서 뺄 값. (x,y) 픽셀의 임계값으로 T(x,y)=μB(x,y)CT(x,y)=\mu_{B}(x,y)-C를 사용

\\
\\

모폴로지 연산

  • 영상을 형태학적인 측면에서 다루는 기법
    • 이진영상의 구조적 관계를 다룸
    • 잡음 제거, 픽셀이 연결되어 있는지 아닌지 확인 등
  • 다양한 영상 처리 시스템에서 전처리 또는 후처리 형태로 널리 사용
  • 수학적 모폴로지
  • 구조 요소(structuring element)
    • 모폴로지 연산의 결과를 결정하는 커널, 마스크
    • 1x3, 3x1, 3x3, ...

침식(erosion) 연산

  • 구조 요소가 객체 영역 내부에 완전히 포함될 경우 고정점 픽셀을 255로 설정, 나머지는 버림(=0) (구조 요소 AND 객체 이미지)
  • 침식 연산은 객체 외곽을 깎아내는 연산, 객체의 크기는 줄어들고 배경은 확대됨
  • 객체 내부의 홀(hole)이 커짐
  • 작은 크기의 잡음 제거 효과
void erode(InputArray src, OutputArray dst, InputArray kernel,
			Point anchor=Point(-1,-1),
			int iterations=1, int borderType=BORDER_CONSTANT,
			const Scalar& borderValue=morphologyDefaultBorderValue());
  • src : 입력 영상. 다채널, 8비트 또는 32비트 실수형
  • dst : 출력 영상. src와 동일한 크기와 타입

    dst(x,y)=min(x,y):element(x,y)0src(x+x,y+y)dst(x,y)=\displaystyle \min_{(x^\prime,y^\prime):element(x^\prime,y^\prime)\neq0}src(x+x^\prime, y+y^\prime)

  • kernel : 구조 요소.
    • Mat()을 지정하면 3x3 사각형 구성요소를 사용
    • getStructuringElement() 함수에 의해 생성 가능
  • anchor : 고정점 위치. Point(-1, -1)이면 중앙점을 사용
  • iterations : 침식 연산 반복 횟수

팽창(dilation) 연산

  • 구조 요소가 객체 영역이 한 픽셀이라도 만날 경우 고정점 픽셀을 255로 설정 (구조 요소 OR 객체 이미지)
  • 팽창 연산은 객체 외곽을 확대시키는 연산
  • 객체 내부의 홀이 채워짐
void dilate(InputArray src, OutputArray dst, InputArray kernel,
			Point anchor=Point(-1,-1),
			int iterations=1, int borderType=BORDER_CONSTANT,
			const Scalar& borderValue=morphologyDefaultBorderValue());
  • src : 입력 영상. 다채널, 8비트 또는 32비트 실수형
  • dst : 출력 영상. src와 동일한 크기와 타입

    dst(x,y)=max(x,y):element(x,y)0src(x+x,y+y)dst(x,y)=\displaystyle \max_{(x^\prime,y^\prime):element(x^\prime,y^\prime)\neq0}src(x+x^\prime, y+y^\prime)

  • kernel : 구조 요소.
    • Mat()을 지정하면 3x3 사각형 구성요소를 사용
    • getStructuringElement() 함수에 의해 생성 가능
  • anchor : 고정점 위치. Point(-1, -1)이면 중앙점을 사용
  • iterations : 팽창 연산 반복 횟수

구조 요소 (커널) 생성

Mat getStructuringElement(int shape, Size ksize, 
						  Point anchor=Point(-1,-1));
  • shape : 구조 요소 모양 지정 상수

    shapedescription
    MORPH_RECT사각형 모양
    MORPH_CROSS십자가 모양
    MORPH_ELLIPSE사각형에 내접하는 타원
  • ksize : 구조 요소 크기

  • anchor : MORPH_CROSS 모양의 구조 요소에서 중심 좌표

    • Point(-1,-1)을 지정하면 구조 요소의 중앙점을 사용
  • 반환 값 : 0과 1로 구성된 CV_8UC1 타입의 행렬 (1의 위치가 구조 요소 모양을 결정)

이진 영상의 열기(Opening)와 닫기(Closing)

  • 열기 연산: 침식 \Rightarrow 팽창
    • 작은 돌기, 작은 객체가 사라지고, 얇은 연결선이 끊어짐
  • 닫기 연산: 팽창 \Rightarrow 침식
    • 작은 홈, 작은 홀이 사라지고, 얇은 연결선이 두꺼워짐

범용 모폴로지 연산 함수

void morphologyEx(InputArray src, OutputArray dst, 
			 	  int op, InputArray kernel,
                  Point anchor=Point(-1,-1),
                  int iterations=1,
                  int borderType=BORDER_CONSTANT,
			 	  const Scalar& borderValue=morphologyDefaultBorderValue());
  • src, dst : 입력 영상과 출력 영상

  • op : 모폴로지 연산 상수

    morphology typedescription
    MORPH_ERODE침식
    MORPH_DILATE팽창
    MORPH_OPEN열기
    MORPH_CLOSE닫기
    MORPH_GRADIENT= 팽창 - 침식
  • kernel : 구조 요소

  • anchor : 고정점 위치. Point(-1, -1)이면 중앙점을 사용

  • iterations : 연산 반복 횟수

\\
\\

References

  • 자율주행 데브코스 황선규 강사님
profile
First Attempt In Learning

0개의 댓글