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으로 적용했을 때 결과를 확인할 수 있다.