[컴퓨터 비전] 08 Intensity Transformation

이찬영·2024년 2월 22일
0

컴퓨터 비전

목록 보기
7/20

[컴퓨터비전 STUDY / KOCW 한동대학교 황성수 교수님 강의 Review]

Intensity transformation

입력 영상의 각 픽셀이 가지고 있는 Intensity 값을 어떤 함수를 사용해서 해당 출력 Intensity 값으로 매핑하는 과정을 일컫는 말이다.

Intensity transformation의 예시는 다음과 같다.


1. Image negatives

  • 영상의 Intensity level이 [0, L-1] 일 때, Image negatives로 mapping을 하면
    s = L-1-r (s: output r: input) 로 출력된다.

  • 이미지의 어두운 영역에 내장된 흰색 또는 회색 디테일을 강화하는 데 적합한 방법이다.

다음은 실행 코드이다.

 int main() {
 	Mat image = imread("lena.png", 0);		// image를 grayscale로 읽음
 	Mat negative_img = image.clone();		// 원본 image의 복제본 생성
 	for (int i = 0; i < image.rows; i++)
 		for (int j = 0; j < image.cols; j++)
 			negative_img.at<uchar>(i, j) = 255 - image.at<uchar>(i, j);		// Image negative 수행
 imshow("Input image", image);
 imshow("Negative transformation", negative_img);
 
 waitKey(0);
 return 0;
 }

결과는 다음과 같다.


2. Log transformation

  • s = c log(1+r) , c : constant, r : input, s : output

  • 좁은 범위의 낮은 Intensity 값을 더 넓은 범위의 출력 레벨 범위에 매핑한다.
    -> 이것은 어두운 영역의 대비를 개선시킨다.

주의할 점은, 영상이 밝아지는 것이 아니라 어두운 영역의 detail이 증가한다는 것이다.
반면에, 밝은 영역의 detail은 감소한다.

다음은 실행 코드이다.

 int main() {
 	Mat image = imread("lena.png", 0);
 	Mat f_img, log_img;
 	double c = 1.5f; // scale constant
 	
    image.convertTo(f_img, CV_32F);
 	f_img = abs(f_img) + 1;
 	log(f_img, f_img);
 	normalize(f_img, f_img, 0, 255, NORM_MINMAX); // normalize image to (0~255)
 	convertScaleAbs(f_img, log_img, c); // scaling by c, conversion to an unsigned 8-bit type
    
 	imshow("Input image", image);
 	imshow("Log transformation", log_img);
 	waitKey(0);
 }

결과는 다음과 같다.


3. Power-Law (Gamma) transformation

  • s = cr^r , c : constant, s : output, r : input

  • 감마 값에 따라 영상의 어두운 픽셀 범위가 확대된다.
    (어두운 픽셀 세부 정보가 강조 표시됨)

    감마 값이 1보다 작으면, 어두운 영역의 detail은 증가하고, 밝은 영역의 detail은 감소한다.
    감마 값이 1이면, 입력값과 출력값이 동일하다.
    감마 값이 1보다 크면, 어두운 영역의 detail은 감소하고, 밝은 영역의 detail은 증가한다.

예시는 다음과 같다.

다음은 실행 코드이다.

int main() {
	Mat image = imread("lena.png", 0);
 	Mat gamma_img;
 	MatIterator_<uchar> it, end;
 	float gamma = 0.5;		// 감마값
 	unsigned char pix[256];
    
    // 감마 보정 테이블 생성
 	for (int i = 0; i < 256; i++) {
 		pix[i] = saturate_cast<uchar>(pow((float)(i / 255.0), gamma) * 255.0f);
 	}
 	gamma_img = image.clone();
 	
    // 생성된 테이블을 사용하여 이미지의 각 픽셀에 감마 보정 적용
 	for (it = gamma_img.begin<uchar>(), end = gamma_img.end<uchar>(); it != end; it++) {
 		*it = pix[(*it)];
 	}
 
 	imshow("Input image", image);
 	imshow("Gamma transformation", gamma_img);
 	waitKey(0);
 }

결과는 다음과 같다.


4. Piecewise-linear transformation

  • 우리는 mapping을 더 복잡한 함수로 수행할 수 있다.

다음은 Thresholding 방식이라고 한다.
임계값 K보다 크면 255, K보다 작으면 0으로 매핑시킨다.

profile
자율주행, AI, 클라우드

0개의 댓글