입력 영상의 특정 좌표 픽셀 값을 변경하여 출력 영상의 해당 좌표 픽셀 값으로 설정하는 연산
결과 영상의 픽셀 값이 정해진 범위에 있어야 한다. [0, 255]
밝기 조절, 반전, 명암비 조절, 이진화 등
수식
그래프
결과
모든 픽셀값을 최댓값인 255에서 뺀 값으로 설정한다. 밝은 픽셀은 어둡게, 어두운 픽셀은 밝게 변경된다.
수식
그래프
결과
직접 구현
Mat dst(src.rows, src.cols, src.type());
for (int y = 0; y < src.rows; y++) {
for (int x = 0; x < src.cols; x++) {
int v = src.at<uchar>(y, x) + 50;
v = (v > 255) ? 255 : (v < 0) ? 0 : v;
dst.at<uchar>(y, x) = v;
}
}
saturate_cast()
템플릿 함수: OpenCV 포화 연산 함수
int v = src.at<uchar>(y, x) + 50;
v = (v > 255) ? 255 : (v < 0) ? 0 : v;
dst.at<uchar>(y, x) = v;
직접 구현한 코드의 위 부분을 saturate_cast()
를 이용하여 아래처럼 작성할 수 있다.
dst.at<uchar>(y, x) = saturate_cast<uchar>(src.at<uchar>(y, x) + 50);
평균 밝기가 211이던 좌측 원본 사진을, 평균 밝기가 128인 우측 사진으로 보정하였다.
아래는 예제 코드이다.
// 1. argv[1] 영상을 그레이스케일 형태로 불러오기 (src)
Mat src = imread(argv[1], IMREAD_GRAYSCALE);
// 2. 입력 영상의 평균 밝기 구하기
// 3. 평균 밝기가 128이 되도록 밝기 보정하기
Mat dst = src + (128 - m);
int s = 0;
for (int j = 0; j < src.rows; j++) {
for (int i = 0; i < src.cols; i ++) {
s += src.at<uchar>(j, i);
}
}
int m = s / (src.rows * src.cols);
cout << "Mean value: " << m << endl;
int m = sum(src)[0] / src.total();
cout << "Mean value: " << m << endl;
int m = mean(src)[0];
cout << "Mean value: " << m << endl;
📙강의 - 강사 황선규