영상의 밝기조절

전종원·2022년 10월 18일
0

1. 영상의 밝기조절과 구현

보통 영상처리알고리즘에서 메모리 효율성을 위해 그레이스케일 영상을 사용.

영상을 그레이스케일로 받아오는 법

//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();
}

else문 결과이미지


왜 이렇게 될까?

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문 수정 코드

#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);
        }
    }

2. 평균밝기 보정 프로그램

영상의 평균밝기 구하기

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();
}

0개의 댓글