본문 바로가기
OpenCV

OpenCV ] 유용한 함수들. sum(), mean(), minMaxLoc(), normalize(), cvRound()

by eteo 2022. 8. 18.

 

sum() : 주어진 행렬의 전체 원소 합 반환

Scalar sum(InputArray src);

 

mean() : 주어진 행렬의 원소 평균 반환

Scalar mean(InputArray src, InputArray mask = noArray());

 

위 두 함수는 4채널 이하의 행렬에 대해서만 동작하고 반환형이 Scalar 타입임.

 

 

 

 

 

minMaxLoc() : 주어진 행렬의 최소값, 최대값을 찾는 함수로 최소값, 최대값이 있는 좌표 정보도 함께 알아낼 수 있음.

 

최소값, 최대값을 받을 double 형 변수의 주소와 최소값, 최댓값 위치 좌표를 받을 Point형 변수의 주소를 매개변수로 전달하고 필요 없는 경우 0을 대입

void minMaxLoc(InputArray src, CV_OUT double* minVal,
                            CV_OUT double* maxVal = 0, CV_OUT Point* minLoc = 0,
                            CV_OUT Point* maxLoc = 0, InputArray mask = noArray());

 

 

 

normalize() : 행렬의 노름(norm) 값을 정규화하거나 또는 원소 값 범위를 특정 범위로 정규화할 때 사용하는 함수

 

정규화란 비율을 유지한 채 값을 특정 값 영역으로 변환하는 기법으로, 모든 데이터가 같은 정도의 스케일(중요도)로 반영되도록 해주는 것이 정규화의 목표.

특히 실수로 구성된 행렬을 그레이스케일 영상 형태로 변환하고자 할 때 사용하면 유용.

 

void normalize( InputArray src, InputOutputArray dst, double alpha = 1, double beta = 0,
                             int norm_type = NORM_L2, int dtype = -1, InputArray mask = noArray());
  • src : 입력 행렬
  • dst : 출력 행렬. src 와 같은 크기
  • alpha : (원소 값 범위 정규화인 경우) 최솟값. (노름 정규화인 경우) 목표 노름 값
  • beta : (원소 값 범위 정규화인 경우) 최댓값
  • norm_type : 정규화 타입. 원소값 범위 정규화인 경우 NORM_MINMAX
  • dtype : 결과 영상의 타입
  • mask : 마스크 영상

 

 

 

 

 

cvRound() : 실수 값을 정수로 변환 할 때 반올림 함수. 0.5보다 크면 올림, 0.5보다 작으면 내림이고 특이한 점은 소수점아래 정확하게 0.5인 경우 가장 가까운 짝수로 반올림을 수행함. (ex. 2.5인 경우 2 반환, 3.5인경우 4 반환)

 

cvCeil() : 무조건 올림

cvFloor() : 무조건 내림

 

int cvRound(double value);
int cvRound(float value);

 

 

 

 

void useful_func() {

	Mat img = imread("lenna.bmp", IMREAD_COLOR);

	cout << "Sum: " << sum(img) << endl;
	cout << "Mean: " << mean(img) << endl;
	cout << "Mean: " << sum(img) / (img.rows * img.cols) << endl;

	cout << endl;

	Mat img1 = imread("lenna.bmp", IMREAD_GRAYSCALE);
	cout << "Mean: " << (int)mean(img1)[0] << endl;

	cout << endl;

	double minVal, maxVal;
	Point minPos, maxPos;
	minMaxLoc(img1, &minVal, &maxVal, &minPos, &maxPos);

	cout << "minVal: " << minVal << " at " << minPos << endl;
	cout << "maxVal: " << maxVal << " at " << maxPos << endl;

	cout << endl;

	Mat src = Mat_<float>({ 1,5 }, { -1.f, -0.5f, 0.f, 0.5f, 1.f });
	Mat dst;
	
    //-1에서 1 사이의 실수로 구성된 1×5 행렬을 0부터 255 사이의 정수 행렬이 되도록 변환 
	normalize(src, dst, 0, 255, NORM_MINMAX, CV_8UC1);

	cout << "src: " << src << endl;
	cout << "dst: " << dst << endl;

	cout << endl;

	cout << "cvRound(2.5): " << cvRound(2.5) << endl;
	cout << "cvRound(2.51): " << cvRound(2.51) << endl;
	cout << "cvRound(3.4999): " << cvRound(3.4999) << endl;
	cout << "cvRound(3.5): " << cvRound(3.5) << endl;
	

}

 

결과