본문 바로가기
OpenCV/OpenCV-Chapter

CH03 Opencv-Python 영상 처리 기법(화소, 연산)

by kiimy 2021. 12. 18.
728x90
728x90

영상의 화소 처리 기법

화소 처리(Point processing)

입력 영상의 특정 좌표 픽셀 값을 변경하여 출력 영상의 해당 좌표 픽셀 값으로

설정하는 연산

  • f1 : 항등함수(반전)
  • f2 : 영상의 밝기 조절(픽셀값 조절)
  • f3 :  0 or 255 이진영상으로 변환

영상의 밝기 조절

cv2.add(src1, src2, dst=None, mask=None, dtype=None) -> dst
'''
src1: (입력) 첫 번째 영상 또는 스칼라
src2: (입력) 두 번째 영상 또는 스칼라
dst: (출력) 덧셈 연산의 결과 영상
mask: 마스크 영상, 픽셀값이 0이 아닌 부분에 대해서만 덧셈 연산이 된다
dtype: 출력 영상(dst)의 타입. (e.g.) cv2.CV_8U, cv2.CV_32F 등
'''

dst = src + 100(브로드캐스팅) 
==> 255값보다 커지는 경우 그 값을 0에 가까운 값으로 바뀐다.
==> (256 = 0 , 257 = 1, ....) 반전 효과
밝은 부분이 검은색으로 변함/ so, cv2.add() 사용

y = x+ n / y= x- n

* + : 255보다 커질 순 없으니 0 (포화, Saturate 연산)

* - : 영상의 이미지가 음수가 될 수 없으니 0 (포화, Saturate 연산)

스칼라(Scalar)는 실수 값 하나 또는 실수 값 네 개로 구성된 튜플
dst를 함수 인자로 전달하려면 dst의 크기가 src1, src2와 같아야 하며, 타입이 적절해야 함

src = cv2.imread('lenna.bmp')

# add or np.clip 사용시
# 컬러 영상의 밝기 100만큼 증가시키기
dst1 = cv2.add(src, (100, 100, 100, 0))
dst2 = np.clip(src + 100., 0, 255).astype(np.uint8)

'''
grayscale = (100, 0, 0, 0) = B, G, R, D
실수값 하나 지정하면 나머진 기본값 0으로 설정됨

numpy.clip(array, min, max)

    array 내의 element들에 대해서

    min 값 보다 작은 값들을 min값으로 바꿔주고

    max 값 보다 큰 값들을 max값으로 바꿔주는 함수.


'''

영상의 산술 및 논리 연산

1. 덧셈 연산

# img2 검은 부분은 더해도 원래 의미가 없기 때문에 img1부분만 가져오고
# img2 흰 부분(값 = 255)를 더하면 해당 부분을 255으로 출력
dst1 = cv.add(img1, img2, dtype=cv.CV_8U)

2. 가중치 합(weighted sum)

cv2.addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None) -> dst

# cv.addWeighted = img1의 가중치 , img2의 가중치
# 두 이미지의 가중치 합은 되도록 1로 설정 => 두 입력 영상의 평균 밝기를 유지
dst2 = cv.addWeighted(img1, 0.5, img2, 0.5, 0)

3. 뺄셈 연산

cv2.subtract(src1, src2, dst=None, mask=None, dtype=None) -> dst
# 색이 있는 이미지는 보통 255에 가까운 색(특히 gray) - 가운데 검은색 이미지(0)
# 순서가 중요함

4. 차이 연산

cv2.absdiff(src1, src2, dst=None) -> dst
# cv.absdiff = 절대값
# 뺄셈 연산과 달리 입력 영상의 순서에 영향을 받지 않음
# ==> 정상 이미지(img1), 어떤 객체가 추가된 이미지(img2)
# ==> 추가된 객체를 반환

728x90

댓글