opencv c++ double Threshold(이중 임계값 처리)를 통한 이미지 이진화

  • 최초 작성일: 2022년 1월 11일(화)

목차

[TOC]


목표

이전에는 Thresholding에 대해 알아봤고, Thresholding이 이미지 크기를 작게하고, 데이터를 단순화함으로써 연산처리 속도를 높이기 위한다는 것을 알았다.

하지만, 이 방법은 극단적으로 데이터를 처리하기 때문에, 가운데 값을 가지는 데이터를 처리하기에는 어려움이 있다.

그래서 이번에는 double thresholding에 대해서 알아보자.

double thresholding을 위해선 opencv의 내장 함수인 inRange() 함수를 사용할 수 있다.


그럼 시작하기에 앞서, inRange() 함수에 대해 먼저 알아보자면, inRange(src, lower_value, upper_value, dst)

  • src: 입력 이미지
  • lower_value: threshold 값 1, 아래 임계치 (쉽게 말해 하한)
  • upper_value: threshold 값 2, 위 임계치 (쉽게 말해 상한)
  • dst: 출력 이미지

이때, lower_value와 upper_value는 Scalar 값으로 넣어줘야하는데, Scalar::all(value) 이런 식으로 넣어주면 된다.

픽셀 값들 중에서 내가 원하는 범위의 값들만을 추출하고자 할 때 사용할 수 있다.

따라서 lower_value <= survive_value <= upper_value 범위의 값들만 살아남게 된다.



실습

이중 임계값 처리에 대해서 어느정도 이해를 했다면, 이제 직접 코드를 실행해보면서 결과를 확인하고 비교해보자. 다양한 임계값들을 넣어보면서 변화하는 결과를 비교해보고 원리를 이해하자.



소스 코드

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int ac, char** av) {
	Mat img = imread("lion.png", 0);	// grayscale
  // Mat img = imread("doctor.png", 0);	// grayscale
  
	Mat img_threshold, img_threshold_150;

	Mat img_inRange;

	inRange(img, Scalar::all(151), Scalar::all(180), img_inRange);

	imshow("original", img);
	imshow("inRange", img_inRange);

	waitKey(0);

	return 0;
}


결과

inRange()의 임계값 범위를 150~180으로 적용했을 때 결과를 확인할 수 있다.

image

image