보통 영상처리알고리즘에서 메모리 효율성을 위해 그레이스케일 영상을 사용.
//1
Mat img1 = imread("lenna.bmp", IMREAD_GRAYSCALE);
//2
Mat img2(rows, cols, CV_8UC1);
//3
Mat img3("lenna.bmp", IMREAD_COLOR);
Mat img4;
cvtColor(img3, img4, COLOR_BGR2GRAY);
입력영상의 특정좌표 픽셀값을 변경하여 출력영상의 해당죄표 픽셀 값으로 설정하는 연산
밝기값이 255를 넘거나 0보다 적어지면 각각 255, 0으로 처리하는 saturate 현상이 발생한다.
int main()
{
Mat src;
src = imread("lenna.bmp", IMREAD_GRAYSCALE);
if (src.empty()) {
cerr << "Image load failed!" << endl;
return -1;
}
#if 0
Mat dst = 255 - src; // 색상반전
#else
Mat dst(src.rows, src.cols, CV_8UC1, Scalar(0)); // dst 크기정의
for(int y=0; y < src.rows; y++) {
for(int x=0; x < src.cols; x++) {
dst.at<uchar>(x,y) = src.at<uchar>(y, x) + 50;
}
}
#endif
imshow("src", src);
imshow("dst", dst);
waitKey();
}
왜 이렇게 될까?
src.at<uchar>(y, x) -> unsigned char(8-bits)
50 -> int(32-bits)
src.at<uchar>(y, x) + 50 -> int형으로 처리됨
dst.at<uchar>(x,y) -> unsigned char(8-bits)
int형을 unsigend char에 넣으려고 하면 앞에 8bit만 가져오고 그 이상은 버려버림
즉, 픽셀값 256 -> 1 0000 0000 인데 8비트만 가져가므로 0000 0000으로 표시되어 검은색이 된다.
#else
Mat dst(src.rows, src.cols, CV_8UC1, Scalar(0)); // dst 크기정의
for(int y=0; y < src.rows; y++) {
for(int x=0; x < src.cols; x++) {
int v = src.at<uchar>(y, x) + 50;
//if (v > 255) v = 255;
//if (v < 0) = v = 0;
//v = v > 255 ? 255 : v < 0 ? 0 : v;
dst.at<uchar>(x,y) = saturate_cast<uchar>(src.at<uchar>(y, x) + 50);
}
}
int main()
{
Mat src;
src = imread("lenna.bmp", IMREAD_GRAYSCALE);
if (src.empty()) {
cerr << "Image load failed!" << endl;
return -1;
}
//평균밝기
int m = mean(src)[0];
//평균밝기가 128이 되도록 밝기보정
Mat dst = src + (128 - m);
imshow("src", src);
imshow("dst", dst);
waitKey();
}