일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 골빈해커
- 딥러닝 스터디
- 딥러닝
- matlab 영상처리
- 파이토치 김성훈 교수님 강의 정리
- 김성훈 교수님 PyTorch
- 해리스 코너 검출
- TensorFlow
- 파이토치
- c언어
- MFC 프로그래밍
- 팀프로젝트
- object detection
- 가우시안 필터링
- c언어 정리
- c++공부
- c++
- 모두의 딥러닝
- pytorch zero to all
- C언어 공부
- 케라스 정리
- 딥러닝 공부
- 파이토치 강의 정리
- Pytorch Lecture
- 모두의 딥러닝 예제
- 컴퓨터 비전
- 미디언 필터링
- tensorflow 예제
- 영상처리
- pytorch
- Today
- Total
ComputerVision Jack
[영상처리 - 화질 향상 기법] 본문
영상의 반전
영상의 밝기 값을 반전 시킴 - 픽셀의 밝기 값을 변경한다.
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의 경우는 최솟값과 최댓값
히스토그램 균등화
'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 |