이미지처리에서 산술연산이라고 하는것은 두개의 영상의 같은 위치에 있는 픽셀들을
서로 더하거나 빼는 등의 연산을 말한다.
곱셈과 나눗셈의 연산도 하기는 하지만 흔히 하는 연산은 아니기때문에 덧셈과 뺄셈을 기본으로해서 알아본다.
- 덧셈연산
2개의 영상을 덧셈 연산할때 같은 위치에 있는 픽셀값을 더하게되면 픽셀값이 255를 넘어가는 경우가 흔하기때문에 Saturate 연산을 꼭 해줘야한다. ( 포화연산 )
dst (x,y) = saturate ( src(x,y) + src2(x,y) ) -> cv2.add ( src, scr2, dst=None, mask=None, dtype=None )를 사용하는데 저번 시간과는 다르게 src , src2에 영상을 넣어주면 덧셈연산을 실행한다.그리고 mask를 사용하게 되면 픽셀값이 0이 아닌 픽셀에 대해서만 덧셈연산이 이루어진다.
dtype 의 의미는 출력 영상의 타입을 지정하는 인자인데 혹시 src가 uint8이고 src2가 float이라고 하면출력 영상 타입을 지정해주어야한다. ( cv2.CV_8U , cv2.CV_32F ... )
- 가중치 합 ( weighted sum )
두 영상의 같은 위치에 존재하는 픽셀 값에 대하여 가중합을 계산하여 결과 영상의 픽셀 값으로 지정된다고 설명 되고 있는데 이는 무슨말이냐면
src영상의 픽셀값과 src2 영상의 픽셀값에 각각의 가중치를 곱해주는데 이 가중치의 값 ( 알파, 베타 ) 은 보통 1로 설정해준다.
가중치 값의 합이 1을 넘기면 픽셀값이 255를 넘길수도 있기때문에 1을 넘기지 않는 것이 좋다
ex )
src 의 20,20의 픽셀값 200 src2의 20,20 픽셀값 150
일반적인 덧셈 연산을 했을 경우에는 350의 값으로 포화연산하면 255의 값을 갖게된다.
하지만 가중치 합을 사용했을때는 ( 200 * 0.6 ) + ( 150 * 0.4 ) = 180의 픽셀값을 갖게 된다.
위 가중치 합을 이용하여 디졸브 효과도 낼 수 있음을 참고하면 좋을 것 같다.
cv2.addweighted ( src1, alpha, src2, beta, gamma, dst=None, dtype=None )위 함수는 opencv에서 제공하는 가중치 합 함수이다.위 설명과 같이 함수를 사용하면 된다.
- 평균연산 ( average )이 연산은 가중치 합에서 다른 비율이 아닌 알파 베타에 0.5 와 0.5 를 곱해 두 영상의 픽셀 평균값을 도출해내는 연산이다.
- 뺄셈 연산 두영상의 같은 위치에 존재하는 픽셀 값에 대하여 뺄셈 연산을 수행하여 결과영상의 픽셀값으로 설정이라고 나와있다. 위와 마찬가지로 두 영상의 뺄셈 결과가 0보다 작으면 포화연산을 수행하여 픽셀값을 0으로 만들어준다.
그리고 A, B의 두개의 영상이 있을때 A에서 B를 뺄때B에서 A를 뺄때의 결과가 달라지므로 이를 꼭 조심해야한다.
예를들어 어떤 사진 중심에 백조 한마리가 있는 사진에서 사진 중심이 검은색으로 칠해져있는 사진을뺄셈 연산하면
중심에 있는 백조한마리만 부각되는 사진이 출력되지만반대로 검은색 칠의 사진에서 백조 사진을 뺄셈연산하면
검은칠이외의 흰색 부분만 반전되어 출력되는현상을 볼 수 있다.
cv2.subtract( src1, src2, dst=None, mask=None, dtype=None )
위 함수를 사용하여 두개의 영상의 뺄셈연산을 수행할 수 있다.
src1, src2의 영상만 인자로 넣어주면 되므로 사용하기 크게 어렵지 않은 함수이다.
- 차이연산
dst ( x, y ) = | src1(x,y) - src2(x,y) | 의 내용을 가진 연산이다.
두 영상의 같은 위치에 존재하는 픽셀 값에 대하여 뺄셈 연산을 수행한 뒤 , 그 절대값을 결과 영상의 픽셀값으로지정이라는 설명을 하고 있는데
이 설명은 두영상의 차이 즉, 차영상의 기능을 가진 연산이다.
두개의 거의 비슷한 영상을 비교할때 같은 픽셀끼리 차이를 주게되면 0이되어 검은 화면으로 나타나고
다른 부분이 있으면 그 부분만 밝게 나와 두 영상의 차이를 알기 쉽게 해주는 아주 좋은 기능이자 연산이다.
cv2.dbsdiff( src1, src2, dst=None ) 의 함수를 사용하면 위와같은 차영상 결과값을 얻을 수 있다.
아직 감이 오지 않을 수 있기에 아래에 결과영상들을 첨부했다.
src1 과 src2의 영상을
- add 하면 중앙의 흰색 부분은 255의 픽셀값을 갖고있기때문에 포화연산으로 인해 그대로 흰색으로 추출되고
나머지 검은배경은 src1의 영상이 그대로 출력된다.
- 그리고 addweighted를 0.5씩 가중해주면 src1 절반 src2의 절반이 출력된다.
- subtract로 뺄셈 연산을 해주면 중앙의 흰색 부분이 255의 값을 갖고있기때문에 포화연산에 의해서 0의 값을
가질수밖에 없다.
- 마지막으로 absdiff 의 차영상 연산을 해주면 검은바탕의 픽셀값 0을 가진 부분을 제외하고 나머지 1이상의 값을
픽셀부분을 도출해내 서로 다른 부분을 찾을 수 있게 된다.
마지막으로 영상의 논리연산에 대해서 알아 봤는데
각각의 픽셀 값을 이진수로 변환하고 비트단위의 논리 연산을 수행할 수 있도록 하는 기능들이 있다.
cv2.bitwise_and(src1, src2, dst=None, mask=None)
cv2.bitwise_or(src1, src2, dst=None, mask=None)
cv2.bitwise_xor(src1, src2, dst=None, mask=None)
cv2.bitwise_not(src1, src2, dst=None, mask=None)
우리가 일반적으로 알고 있는 비트연산을 영상끼리 한다고 생각하면 된다.
하지만 자주사용하지 않기때문에 참고로만 알고있어도 좋을 것 같다.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
'Program > OPEN_CV' 카테고리의 다른 글
[Open CV] 기본적인 영상처리 기법 _ 히스토그램 분석 (0) | 2022.05.10 |
---|---|
[Open CV] 기본적인 영상처리 기법 _ 컬러 영상과 색 공간 (0) | 2022.05.08 |
[Open CV] 기본적인 영상처리 기법 _ 영상의 밝기 조절 (0) | 2022.05.06 |
[Open CV] OpenCV-Python 기초 사용법 _ 실전코딩 (0) | 2022.05.05 |
[Open CV] OpenCV-Python 기초 사용법 _ 연산시간 측정 방법 (0) | 2022.05.04 |