동작중 영상을 저장할 새로운 공간 생성 : CV_8UC1 타입 생성
Mat img2(480, 640, CV_8UC1, Scalar(0));
컬러 영상 변환 cvtColor()
Mat img1 = imread("jnary.bmp", IMREAD_COLOR);
Mat img2;
cvtColor(img1, img2, COLOR_BGR2GRAY);
영상의 밝기 조절
영상의 밝기 조절 함수의 그래프
dst = cv2.add(src, 100) # 밝기 증가
dst = cv2.subtract(src, 100) # 밝기 감소
dst = np.empty(src.shape, src.dtype)
def update(pos):
dst = cv.add(src, pos)
cv.imshow('dst', dst)
cv.createTrackbar('Brightness', 'dst', 50, 100, update)
명암비
dst(x, y) = saturate(s * src(x, y))
s = 0.5
밝은 곳과 어두운 곳의 차이가 128로 줄어듬
낮은 명암비
s = 2
차이가 510으로 늘어남 (saturate 감안X)
높은 명암비
한계
밝고 어두운 기준 : 중간값인 128
alpha = 1.0
dst = cv.convertScaleAbs(src, alpha=1+alpha, beta=-128*alpha)
밝고 어두운 기준 : 영상의 평균 밝기
히스토그램
bin
channels = [0]
histSize = [256]
histRange = [0, 256]
hist = cv.calcHist([img], channels, None, histSize, histRange)
def getGrayHistImage(hist):
_, histMax, _, _ = cv.minMaxLoc(hist) #최댓값 추출
imgHist = np.ones((100, 256), np.uint8) * 255 #흰색배경 준비
for x in range(imgHist.shape[1]):
pt1 = (x, 100)
pt2 = (x, 100 - int(hist[x, 0] * 100 / histMax))
cv.line(imgHist, pt1, pt2, 0)
return imgHist
hist_img = getGrayHistImage(hist)
cv.imshow('histogram', hist_img)
Mat src = imread("camera.bmp", IMREAD_GRAYSCALE);
Mat hist = calcGrayHist(src);
Mat hist_img = getGrayHistImage(hist);
imshow("src", src);
imshow("srcHist", hist_img);
영상의 밝기와 명암비를 가늠할 수 있는 유용한 도구로 사용
그레이스케일 전 구간에 걸쳐서 나타나도록 변경하는 선형 변환 기법
→ G : 입력 영상 픽셀 값 중 가장 큰/작은 그레이스케일 값
명암비 높아짐
원본 영상의 분포 : Gmin ~ Gmax
Gmin → 0, Gmax → 255 변환 : 양방향으로 늘리기
변환함수
(Gmin, 0), (Gmax, 255) 지나는 직선의 방정식
직선의 기울기 : 255 / (Gmax - Gmin)
Y절편 : -255(Gmax - Gmin)
→ OpenCV에서 따로 제공 X
minMaxLoc()으로 직접 구현
gmin, gmax, _, _ = cv.minMaxLoc(src)
dst = cv.convertScaleAbs(src, alpha=255.0/(gmax-gmin),
beta=-gmin/(gmax-gmin)*255)
cv.imshow('dstHist', getGrayHistImage(calcGrayHist(dst)))
def histogram_Stretching():
src = cv2.imread('jnary.bmp', cv2.IMREAD_GRAYSCALE)
gmin, gmax, _, _ = cv2.minMaxLoc(src)
dst = cv2.convertScaleAbs(src, alpha=255.0/(gmax-gmin), beta=-gmin*255.0/(gmax-gmin))
#포화연산까지 진행하는 함수
cv2.imshow('src', src)
cv2.imshow('srcHist', getGrayHistImage(calcGrayHist(src)))
cv2.imshow('dst', dst)
cv2.imshow('dstHist', getGrayHistImage(calcGrayHist(dst)))
cv2.waitKey()
cv2.destroyAllWindows()
Histogram Equalization(균등화, 평탄화)
평활화 계산
h(g) : 그레이스케일값이 g인 픽셀 개수
H(g) : 누적함수(픽셀값 변환 함수)
누적함수의 최댓값이 255가 되도록 정규화
→ 찾고자하는구간까지의픽셀개수/전체픽셀개수 (0~1)
Lmax : 영상이 가질 수 있는 최대 밝기 값 (그레이스케일 Lmax = 255)
round() : 반올림 함수 → 정수값으로
equalizeHist(src, dst)
그레이스케일 영상만 입력으로 받음
3채널로 구성된 컬러영상 입력 시 → ERROR
def histogram_equalization():
src = cv2.imread('jnary.bmp', cv2.IMREAD_GRAYSCALE)
...
dst = cv2.equalizeHist(src)
cv2.imshow('dstHist', getHistImage(calcGrayHist(dst)))