Program/OPEN_CV

[Open CV] 기본적인 영상처리 기법 _ 영상의 밝기 조절

사막여유 2022. 5. 6. 14:29
728x90

 

금일부터 시작되는 강의는 기본적인 영상 처리기법에 관한 강의로 기초 사용법이 마무리 된 이후

실질적인 영상처리기법에 관한 내용들을 주로 다루는 것 같다.

 

영상의 화소 처리 기법 ( Point processing ) 영상의 특정 좌표 픽셀 값을 변경하여 출력 영상의 픽셀값으로 설정하는 연산이다.
  - dst(x,y) = f(src(x,y))  ( src는 입력이미지 dst는 출력이미지 )
 여기서 알 수 있듯이 입력영상에 어떠한 함수처리를해서 ( 변환함수 ) 출력에 다시 입력시켜주는것이다.

함수처리에도 다양한 함수가 존재하는데

항등함수 , 입력영상 대비 밝아지는 출력영상 그래프의 함수 , 이진영상변환 함수등이 있다.

 

밝기 조절 수식중 하나인

dst(x,y) = src(x,y) + n 을 보면

입력영상 대비 +n의 픽셀값을 가지는 출력영상을 볼 수 있는데

255이상의 값은 가질수는 없는 saturate 연산을 하게된다.

이는 저번에도 설명한 포화연산과 비슷한 개념이라고 볼 수 있다.

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

 

위 연산을 하기 위해서는 

cv2.add 라는 함수를 사용하게 되는데

src1 에 입력영상 src2 에는 정수값을 넣어주게 된다.

 

그래서 src = cv2.imread('lenna.bmp', cv2.IMREAD_GRAYSCALE) 함수 이후

dst = cv2.add(src,100)의 함수를 위 처럼 사용해도 되지만

dst = src + 100 의 연산을 해주면

후자의 경우 각각의 element (행렬 원소) 에 100의 값을 더해주게 되는 경우이다.

그렇게 될 경우 어떤 영상으로 출력되는지 보면

전자

 

후자

 

위 같은 출력이 발생하는 경우 src는 uint8의 타입인데 numpy에서 위와같이 255보다 커지는 연산을 할 경우

해당 픽셀값에서 255를 뺀값으로 바꾸기 때문에 일어나는 현상이다.

따라서 따로 255이상의 값을 후처리하지 않는경우에는 add함수를 사용하는게 좋다.

또는 np.clip(src + 100., 0 ,255).astype(np.uint8) 로 타입변환을 해서 사용할수도 있다.

 

그리고 컬러영상에서도 밝기처리함수를 사용할 수 있는데

위 GrayScale 에서 사용한 add함수를 사용하게 되면 

 

위 이미지와 같이 색감이 변한것 같은 느낌을 받을 수 있다.

여기서 add 함수의 인자 src1, src2 를 보면 영상 또는 스칼라를 넣으라고 되어있는데

스칼라는 실수값 하나 또는 실수값 4개로 구성된 튜플이라고 설명이 되어있는데

여기에 위처럼 100의 정수값 하나를 넣게되면 4개의 실수값으로 자동으로 변환이 된다고 볼 수 있는데

맨 처음값만 100.0의 실수값이 들어가고 나머지 3개의 값은 0으로 자동 지정이 된다.

따라서 BGR의 OpenCV 행렬에 B값만 100이 더해지기 때문에 파랗게 변하는 것을 볼 수 있다.

 

그래서 전체적으로 밝게 만들려고할때는 100,100,100의 실수 또는 정수값을 넣어주어야 한다.

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/3L3avNW

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

728x90