본문 바로가기
ੈ✩‧₊˚Computer Science/컴퓨터비전

[OpenCV] Threshold(임계값 설정), Inrange

by 샨샨 2020. 10. 29.
반응형

Threshold : 이미지를 이진화 하여 흑/백을 나누는 기술

threshold 함수에는 cv.thresholdcv.adaptivethreshold 가 있다.

 

기본임계처리

cv.threshold(Mat src, Mat dst, double thresh, double maxval, int type)

Mat src : input image

Mat dst : output image

double thresh : 임계값

double maxval : 임계값을 넘었을 때의 value

int type : threshold type

 

[threshold type]

THRESH_BINARY : 픽셀 값이 threshold 보다 크면 maxval(255 흰색), 아니면 0(검정)

THRESH_BINARY_INV :픽셀 값이 threshold 보다 크면 0, 아니면 maxval

THRESH_TRUNC : 픽셀 값이 threshold 보다 크면 임계값, 아니면 픽셀 값 그대로 할당

THRESH_TOZERO : 픽셀 값이 threshold 보다 크면 픽셀값 그대로, 작으면 0 할당

THRESH_TOZERO_INV : 픽셀 값이 threshold 보다 크면 0, 작으면 픽셀값 그대로

1) input 2) THRESH_BINARY 3) THRESH_BINARY_INV 4) THRESH_TRUNC 5) THRESH_TOZERO 6) THRESH_TOZERO_INV


적응임계처리

기본 임계처리는 임계값을 이미지 전체에 적용하여 처리하기 때문에 하나의 이미지에 음영이 다르면 일부 영역이 모두 흰색 또는 검정색으로 보여지게 되므로 적응임계처리를 이용한다. (이미지의 작은 영역별로 thresholding)

cv.adaptiveThreshold(Mat src, Mat dst, double maxval, int adaptiveMethod, int thresholdType, int blockSize, double C)

Mat src : input image

Mat dst : output image

double maxval : 임계값을 넘었을 때의 value

int adaptiveMethod : 임계값을 결정하는 계산 방법

int thresholdType : threshold type (THRESH_BINARY, THRESH_BINARY_INV)

int blockSize : thresholding을 적용할 영역의 사이즈(3, 5, 7,9 같은 홀수를 사용해야 한다.)

double C : 평균에서 뺄 상수값

 

[adaptive method]

ADAPTIVE_THRESH_MEAN_C : 적용할 픽셀 (x,y)를 기준으로 (blocksize * blocksize)안에 있는 픽셀값의 평균 - C 값을 문턱값으로 설정

ADAPTIVE_THRESH_GAUSSIAN_C : 적용할 픽셀 (x,y)를 기준으로 (blocksize * blocksize)안에 있는 가우시안 윈도우 기반 가중치의 합 - C 값을 문턱값으로 설정

#include "cv.hpp"
#include <iostream>

using namespace cv;
using namespace std;
int main(){
    Mat image = imread("lena.png");
    cvtColor(image,image,CV_BGR2GRAY);
    Mat dst1,dst2;
    adaptiveThreshold(image,dst1,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,7,10);
    adaptiveThreshold(image,dst2,255,ADAPTIVE_THRESH_GAUSSIAN_C,THRESH_BINARY,7,10);
    imshow("dst1",dst1);
    imshow("dst2",dst2);
    imshow("input",image);
    waitKey(0);
}

1) input 2) ADAPTIVE_THRESH_MEAN_C 3) ADAPTIVE_THRESH_GAUSSIAN_C


Inrange 

범위를 설정해서 그 범위 안에 들어가면 흰색, 범위 안에 들어가지 않으면 검은색으로 출력

void inRange(cv::InputArray src, cv::InputArray lowerb, cv::InputArray upperb, cv::OutputArray dst)

src : input image

lowerb : lower boundary (scalar로 씀)

upperb : upper boundary (scalar로 씀)

dst : output image (same size with src and CV_8U)

#include "cv.hpp"
#include <iostream>

using namespace cv;
using namespace std;
int main(){
    Mat image = imread("hand.jpg");
    Mat dst;
    cvtColor(image,image,CV_BGR2YCrCb);
    inRange(image,Scalar(0,133,77),Scalar(255,173,127),dst);

    imshow("inrage",image);
    imshow("dst",dst);
    waitKey(0);
    return 0;
}

1) input 2) output

 

반응형