관리 메뉴

ComputerVision Jack

[영상처리 - 화질 향상 기법] 본문

Image Processing/C++ opencv Lib

[영상처리 - 화질 향상 기법]

JackYoon 2020. 1. 14. 22:24
반응형

영상의 반전

영상의 밝기 값을 반전 시킴 - 픽셀의 밝기 값을 변경한다.

g(x, y) = 255 - f(x, y)

출력 영상 = 255 - 입력 영상

 

[코드]

Mat image = imread("../_res/lenna.bmp", IMREAD_GRAYSCALE);
CV_Assert(!image.empty());

# 영상처리의 이미지 lenna를 gray컬러로 읽어옵니다.

CV_Assert();는 영상이 잘 읽어오면 False 실패하면 True를 반환합니다. (영상 읽기 체크)

 

Mat result(image.size(), image.type());

# 반전 결과가 저장될 Mat객체를 생성합니다.

 

for (int i = 0; i < image.rows; i++) {
    for (int j = 0; j < image.cols; j++) {
        result.at(i, j) = saturate_cast(255 - image.at(i, j));
    }
}

#이미지의 좌표를 돌면서 255 - 원본 이미지 값 차이를 구해 result에 저장합니다.

saturate_cast는 값의 차이가 255를 벗어나는 경우를 고려하여 오버플로우를 스스로 방지해줍니다.

[실행결과]

영상 반전

영상 밝기 조절

영상의 밝기 값을 밝게 하거나 어둡게 변경

밝기 값이 작을수록 어둡고 클수록 밝다.

g(x, y) = f(x, y) + n

 

[코드]

result.at(i, j) = saturate_cast(image.at(i, j) + 100); 쉽게 구현이 가능하다. 조금 특별하게 trackbar를 사용하려한다.

 

namedWindow(title, WINDOW_AUTOSIZE);
createTrackbar("밝기 변화", title, &value, 255, onChange, (void*)& image);

# 윈도우를 제작 하고 trackbar를 만들어 윈도우에 붙인다.

 

void onChange(int value, void* userdata) {
    Mat img = *(Mat*)userdata;
    int add_value = value + 10;
    Mat result(img.size(), img.type());
    for (int i = 0; i < img.rows; i++) {
        for (int j = 0; j < img.cols; j++) {
            result.at(i, j) = saturate_cast(img.at(i, j) + add_value);
        }
    }
    imshow(title, result);
}

# 트랙바 시스템 콜백 함수에 연결될 onChange()함수 

[실행 결과]

밝기 변환

영상 명암비 조절

영상의 밝고 어두움의 비율

명암비가 크다 = 영상이 선명하다

명암비가 작다 = 영상이 뿌옇다

g(x, y) = f(x, y) + a( f(x, y) - 128)

  •  -1 <= a <=0 명암비 감소
  • 0 <= a <= 1 명암비 증가

[코드]

result.at(i, j) = saturate_cast(image.at(i, j) + 0.7 * (image.at(i, j) - 128));

#식 그대로 saturate_cast해서 넣어주면 된다.

 

[실행 결과]

영상 명암비

영상 감마 보정

지수 함수를 이용하여 영상을 비 선형적으로 보정함

g(x, y) = ( f(x, y) / 255)^1/r x 255

일반적으로 모니터는 원본 신호에 비해 어둡게 표현이 된다.

감마가 역수로 동작함에 주의하자

 

[코드]

result.at(i, j) = saturate_cast(pow(image.at(i, j) / 255.0, 10 / GAMMA_R) * 255);

#마찬가지로 수식을 그대로 적용한다.

GAMMA_R은 #define으로 value를 설정

 

[실행 화면]

감마 보정

히스토그램 분석

영상의 히스토그램

[코드]

memset(cnt, 0, sizeof(int) * 256);
for (int y = 0; y < img.rows; y++)
    for (int x = 0; x < img.cols; x++)
        cnt[img.at(y, x)]++;

#256 크기의 배열을 만들어서 픽셀 값에 해당하는 배열의 인덱스 값을 증가시킨다.

 

히스토그램을 통하여 전반적인 영상에 대해 알 수 있다.

 

히스토그램 스트레칭

히스토그램의 구간이 조밀할 경우 히스토그램을 스트래칭해서 늘린다.

g(x, y) = f(x, y) - Gmin / Gmax - Gmin x 255

Gmin과 Gmax의 경우는 최솟값과 최댓값

 

히스토그램 균등화

 

영상 밝기 변환.zip
0.00MB

반응형

'Image Processing > C++ opencv Lib' 카테고리의 다른 글

[영상처리 - 특징값 추출]  (0) 2020.01.23
[영상처리 - 기하학적 변환]  (0) 2020.01.21
[영상처리 - 공간적 필터링]  (0) 2020.01.19
[영상처리 - 영상의 연산]  (0) 2020.01.16
[영상처리 개요]  (0) 2020.01.14
Comments