컴퓨터 비전(OpenCV) 스터디

230522-28 스터디

2023. 5. 27. 20:54

< OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝 > 교재 5, 6장 공부

 

 

- 5장 영상의 밝기와 명암비 조절

5.1 영상의 밝기 조절

<그레이스케일 영상 다루기>

- 그레이스케일 영상 만드는 3가지 방법

→ 그레이스케일로 영상을 불러오기

Mat img1 = imread("lenna.bmp", IMREAD_GRAYSCALE);

두번째 인자에 IMREAD_GRAYSCALE을 넣어 그레이스케일로 변경하도록 함.

→ 프로그램 동작 중 그레이스케일 영상을 저장할 새로운 Mat 객체 생성하기

Mat img2(480, 640, CV_8UC1, Scalar(0));

CV_8UC1 타입의 객체를 생성

→ 이미 3채널 컬러 영상을 가졌고, 이 영상을 그레이스케일로 변환하기

cvtColor(); 함수 사용

 

<영상의 밝기 조절>

- 영상의 밝기 조절:

영상의 전체적인 밝기를 조절하여 더 밝거나 어두운 영상을 만드는 작업

- 영상의 밝기를 조절하는 방법:

입력 영상의 모든 픽셀에 일정 값을 더하거나 빼는 작업을 수행. 양수 값을 더하면 영상이 밝아지고, 양수값을 빼면 영상이 어두워짐.

- 영상의 밝기 조절의 수식 표현:

dst(x, y) = src(x, y) + n

src는 입력 영상, dst는 출력 영상, n은 조절할 밝기 값을 나타냄.

n의 값을 조절하면 영상의 밝기 조절이 가능.

픽셀 연산을 하다가 0-255의 값을 넘어버릴 수 도 있으므로 이 안의 값만 갖도록 포화연산을 사용해야함.

 

<영상의 밝기 조절 직접 구현하기>

- 연산자 함수 사용하지 않고 직접 영상 밝기 조절 코드 작성하기

→ 직접 모든 픽셀을 방문하여 일정 상수 더하거나 빼는 코드 작성

1. dst객체 미리 생성: Mat dst(src.rows, src.cols, src.type());

2. dst.at <uchar> (j, i) = scr.at <uchar> (j, i) + 100 ; 

3. 출력 시 포화 연산 수행하도록 unsigned char a = 256;, 조건문 작성

(saturate_cast() 함수로도 포화 연산 수행 가능)

 

<트랙바를 이용한 영상의 밝기 조절>

- 밝기 정도 (n)을 수정하고 싶을 때 밝기 조절 프로그램에 트랙바를 부착해 다시 빌드하지 않고 바로 수정해 결과 확인할 수 있도록 할 수 있음.

brightness4() 함수 구현, createTrackbar() 함수 사용해 0-100까지의 값을 조정할 수 있도록 함

 

5.2 영상의 명암비 조절

<기본적인 명암비 조절 방법>

- 명암비:

영상에서 밝은 영역과 어두운 영역 사이에 드러나는 밝기 차이의 강도

- 명암비 낮다:

영상이 전반적으로 어둡거나 또는 전반적으로 밝은 픽셀로만 구성된 경우, 흐릿한 느낌을 줌

- 명암비 높다:

밝은 영역과 어두운 영역이 골고루 섞여 있는 영상, 사물 구분이 잘 되어 선명한 느낌을 줌

- 명암비 조절은 전체 픽셀에 적절한 실수를 곱하는 곱셈 연산을 사용

- 어떤 실수를 곱하냐에 따라 결과 품질이 달라짐

- 명암비 조절 수식:

dst(x, y) = saturate(s x src(x, y))

상수 s를 곱한 결과가 255보다 커지지 않도록 포화 연산 사용해야 함.

- s = 0.5인 경우:

픽셀이 가질 수 있는 범위가 0-128로 줄어 명암비가 감소

- s = 2인 경우:

셀은 0부터 255 사이의 값으로 변하기 때문에 명암비가 높아짐

 

<효과적인 명암비 조절 방법>

- 단순히 상수를 곱하는 방법은 오히려 사물 윤곽 구분이 어려워 잘 사용하지 않음

- 명암비를 효과적으로 높이기 위해서는 밝은 픽셀은 더욱 밝게, 어두운 픽셀은 더욱 어두워지게 변경해야 함.

- 픽셀 값이 어둡고 밝다는 기준은 어떻게 설정하냐에 따라 다름. (여기선 128을 기준으로 명암비 조절해보겠다)

- 수식:

dst(x, y) = src(x, y) + (src(x, y) - 128) x a (a는 -1보다 같거나 큰 실수)

입력 영상의 픽셀 값이 128보다 크면 더욱 밝게 만들고, 128보다 작으면 픽셀 값을 더 작게 만드는 방식을 사용

- 포화 연산까지 포함한 최종 수식:

dst(x, y) = saturate(src(x, y) + (src(x, y) - 128) x a)

자연스럽게 명암비 조절 가능.

 

5.3 히스토그램 분석

- 주어진 영상의 픽셀 밝기 분포(히스토그램)를 조사하여 밝기 및 명암비를 적절하게 조절하는 방법

- 히스토그램 분석을 통해 영상의 밝기 및 명암비를 자동으로 조절하는 히스토그램 스트레칭과 히스토그램 평활화 기법

 

<히스토그램 구하기>

- 영상의 히스토그램(histogram):

영상의 픽셀 값 분포를 그래프 형태로 표현한 것

각 그레이스케일 값에 해당하는 픽셀의 개수를 구하고 이를 막대 그래프 형태로 표현

- 가로축 (bin):

픽셀 값 범위를 표시함 (0-255 이므로 보통 256개)

히스토그램의 빈 개수가 항상 픽셀 값 범위와 같아야 하는 것은 아님. 범위를 조절해 빈 개수 더 작게 만들 수도 있음.

 빈 개수가 줄어들면 히스토그램이 표현하는 영상의 픽셀 값 분포 모양이 좀 더 대략적인 형태로 바뀌고, 빈 개수가 많으면 세밀한 픽셀 값 분포 표현이 가능.

- 구현:

calcHist() 함수 사용.

한 장의 영상뿐만 아니라 여러 장의 영상으로부터 (여러 채널도 가능) 히스토그램을 구할 수 있음.

갖는 인자가 많아 잘 설정해야함.

- 구현 코드:

→ 그레이 스케일 영상의 히스토그램 그래프 그리기

minMaxLoc()함수로 히스토그램의 최댓값을 찾음.

line함수로 히스토그램 막대그래프 그림

 

<히스토그램 스트레칭>

- 영상의 히스토그램이 그레이스케일 전 구간에 걸쳐서 나타나도록 변경하는 선형 변환 기법

- 보통 명암비가 낮은 영상은 히스토그램이 특정 구간에 집중되어 나타나게 되는데, 이러한 히스토그램을 마치 고무줄을 잡아 늘이듯이 펼쳐서 히스토그램 그래프가 그레이스케일 전 구간에서 나타나도록 변환하는 기법

- 히스토그램 스트레칭을 수행한 영상은 명암비가 높아지기 때문에 대체로 보기 좋은 사진으로 바뀜

- 수식:

 

<히스토그램 평활화>

- 히스토그램 스트레칭과 더불어 영상의 픽셀 값 분포가 그레이스케일 전체 영역에서 골고루 나타나도록 변경하는 알고리즘의 하나

- 히스토그램 그래프에서 특정 그레이스케일 값 근방에서 픽셀 분포가 너무 많이 뭉쳐 있는 경우 이를 넓게 펼쳐 주는 방식으로 픽셀 값 분포를 조절

- 수식: 

- 정규화 과정 거치는 수식:

 

 

- 6장 영상의 산술 및 논리 연산

6.1 영상의 산술 연산

- 영상은 일종의 2차원 행렬이기 때문에 행렬의 산술 연산(arithmetic operation)을 그대로 적용할 수 있음.

 

<영상의 덧셈 연산>

- 수식:

src1과 src2는 입력 영상이고, dst는 덧셈 연산의 결과 영상

- 포화 연산을 포함한 덧셈 연산 수식:

- add 함수로도 구현 가능

두 개의 행렬 또는 영상을 입력으로 받고, 하나의 행렬 또는 영상을 출력으로 생성

- 영상에 가중치를 부여한 덧셈 연산

 

<영상의 뺄셈 연산>

- 두 영상에서 같은 위치에 있는 픽셀끼리 빼기 연산을 수행

- 두 영상의 뺄셈 순서에 상관없이 픽셀 값 차이가 큰 영역을 두드러지게 나타내고 싶다면 차이 연산을 수행

 

<곱셈과 나눗셈 연산>

- 행렬의 곱셈을 수행하는 경우는 거의 없지만, 두 영상에서 같은 위치에 있는 픽셀 값끼리 서로 곱하거나 나누는 연산을 수행할 수 는 있음.

- multiply() 함수와 divide() 함수를 제공

 

6.2 영상의 논리연산

- 픽셀 값을 이진수로 표현하여 각 비트(bit) 단위 논리 연산을 수행

- 영상의 비트 단위 논리 연산을 수행하는 bitwise_and(), bitwise_or(), bitwise_xor(), bitwise_not() 함수를 제공

- 각각 논리곱, 논리합, 배타적 논리합, 부정 연산을 수행.

 

 

 

 

 

'컴퓨터 비전(OpenCV) 스터디' 카테고리의 다른 글

230626-230702 스터디  (0) 2023.06.28
230619-25 스터디  (0) 2023.06.22
230619-25 스터디  (0) 2023.06.22
230612-18 스터디  (0) 2023.06.18
230515-21 스터디  (0) 2023.05.18