OpenCV 영상 조작

이주희·2022년 10월 8일
1

밝기 조절

cvtColor 함수

컬러 영상을 변환
cvtColor(입력 영상, 출력 영상, 컬러 변환 코드)
cvtColor(img, img2, COLOR_BGR2GRAY);
컬러 영상을 그레이스케일로 변환

밝기 조절은 영상에 +n을 함으로써 조절

포화 연산

자료형이 가질 수 있는 값의 범위를 벗어나면 최솟값 또는 최댓값으로 원소 값 설정

밝기 조절

cv2의 add,subtract 함수 활용

dst = cv.add(src, 100)
dst = cv.subtract(src, 100)

import cv2 as cv
import numpy as np

img = cv.imread('CV images/lenna.bmp',cv.IMREAD_GRAYSCALE)
cv.imshow('img',img)

cv.waitKey()
cv.destroyAllWindows()
dst = cv.add(img, 100)
dst2 = cv.subtract(img, 100)
cv.imshow('dst',dst)
cv.imshow('dst2',dst2)
cv.waitKey()
cv.destroyAllWindows()

직접 구현

numpy를 이용해서 빈 행렬을 직접 만들어준 후 이중 for문으로 값 저장해준다

dst = np.empty(img.shape, dtype = np.uint8)
for y in range(img.shape[0]):
    for x in range(img.shape[1]):
        dst[y][x] = saturated(img[y][x]+100)

결과는 같음

명암비

밝은 영역과 어두운 영역 사이에 드러나는 밝기 차이의 강도
높으면 선명해 보인다!

명암비 조절 방법

  1. 모든 픽셀에 곱셈 연산을 하여 생성함
    cv2의 multiply 함수를 사용

    이와 같은 방식으로 만들면 흰 영역이 너무 많이 발생
    -> 오히려 윤곽 구분이 어려워진다
  1. 명앙비 효과적으로 바꾸려면 밝은 픽셀은 밝게, 어두운 픽셀은 어둡게 변경해야함
    ex) 픽셀값이 128 이상이면 더 크게, 128 미만이면 더 작게 만든다...

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

  • a가 -1 ~ 0 이라면 명암비가 감소
    -1이라면 128만 남으므로 이미지가 중간값으로 통일됨

  • a가 0 이상이면 명암비가 증가

  • 포화연산 필요!

히스토그램

각 픽셀별 개수를 막대그래프 형태로 표현
색의 분포를 확인할 수 있음

빈 : 히스토그램 가로축
작으면 대략적 형태가 되고 많으면 세밀한 형태가 됨

calcHist

void calcHist(Mat img, int nimages, int channels, InputArray mask...)

256*1의 행렬을 반환해준다

직접 히스토그램 행렬을 막대그래프 형태로 나타내야함

0개의 댓글