앎을 경계하기

Machine Learning/For CV

3. 밝기 변환과 공간 필터링(1)

양갱맨 2020. 10. 31. 18:34

3.1 배경

3.1.1 밝기 변환과 공간 필터링의 기초

공간 도메인 기법들은 영상의 화소들에 직접 작용한다. 일반적으로 공간 도메인 기법들이 계산적으로 더 효율적이고 자원도 더 적게 사용한다.

g(x,y)=T[f(x,y)]g(x,y) = T[f(x,y)]

f(x,y)f(x,y)는 입력영상, g(x,y)g(x,y)는 출력영상, TTff에 대한 연산자이다.

위 그림은 이웃(공간 필터)를 통한 공간필터링이다. 가장 작은 필터의 크기는 1×1이다. 이러한 경우 g가 하나의 점 (x,y)에서의 f의 값에만 종속된다. T는 그레이 레벨의 변환 함수가 된다.

s=T(r)s=T(r)
  • Contrast Strectching s, r은 각각 점(x,y)에서의 g와 f의 밝기를 나타내는 변수들이다. g의 대응 화소를 만들기 위해 f의 모든 화소에 변환을 적용한 효과는 k값 이하의 밝기 레벨들은 어둡게 만들고 이상의 레벨은 밝게 만들어서 원래 영상보다 높은 Contrast를 갖는 영상을 만들게 되는 것이다.

    k값 보다 낮은 r 값들은 변환 함수에 의해서 흑색으로 s의 좁은 범위에 압축된다. 반대로 높으면 흰색으로 압축된다. k값을 기준으로 이진 처리를 할 수 있고(k가 결국 threshold value다.) 이것은 위에서 말한 Neighborhood Processing 방법과 달리 결과가 한 점에서 처리되는 것이 점 처리 기법이다.

3.2 기본적 밝기 변환 함수들

밝기 변환은 가장 간단한 영상 처리에 포함된다. 8비트 환경에서 변환 함수 T의 값들을 담고 있는 테이블은 256개의 요소를 가진다. 영상 개선을 위해 사용되는 기본 함수인 선형, 로가리듬, 거듭제곱-법칙 등이 있다. 항등 함수는 input, output 밝기가 같은 경우이다.

3.2.1 영상 네거티브

레벨 범위가 [0, L-1]인 영상의 네거티브는 다음과 같은 변환에 의해 만들어진다.

s=L1rs = L-1-r

이렇게 영상의 밝기 레벨을 반전시키면 네거티브와 같은 결과를 만드는 것이다. 이러한 변환이 적용되는 것은 주로 이미지가 검은 영역이 많을때, 흰색이나 그레이의 디테일을 개선시키는 데 적합하다.

#이미지 그레이레벨로 변환 후 확인
img = cv2.imread(image_path)
cv2_imshow(img)
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2_imshow(img)

#Image Negative s = L-1-r
#Level Range : [0, L-1]
def Trans_Negative(img, L):
    res = np.zeros(img.shape)
    for x in range(img.shape[0]):
        for y in range(img.shape[1]):
            res[x][y] = L-1-img[x][y]
            if res[x][y]<0:
                res[x][y]=0
    return res

cv2_imshow(Trans_Negative(img, 256))

3.2.2 로그 변환

s=clog(1+r)s=c\log(1+r)

위 식은 로그의 일반형이다. c는 상수이고 r은 0이상이다. 로그 변환은 입력의 낮은 밝기 값들의 좁은 범위를 넓은 범위의 출력 레벨로 매핑한다. 높은 값의 입력에 대해서는 반대로 적용된다.

역로그 변환은 로그 변환의 반대개념이다.

#Log Transformation s = clog(1+r)
#c : Constant, r >= 0
def Trans_Log(img, c):
    res = np.zeros(img.shape)
    for x in range(img.shape[0]):
        for y in range(img.shape[1]):
            res[x][y] = c*math.log(1+img[x][y])
    return res

wide_range_img=np.zeros((32,32))
for i in range(32):
    for j in range(i):
        wide_range_img[i][j]=10**j  #배열에 저장되는 값들의 범위가 커지도록
#반복문 수행 시 범위가 너무 크면 out of range error 발생하니 작게해서 만들고서 사이즈 변환
wide_range_img = cv2.resize(wide_range_img, (320,320))
cv2_imshow(wide_range_img)
cv2_imshow(Trans_Log(wide_range_img, 2))

3.2.3 거듭제곱-법칙(gamma) 변환

s=crγs=cr^\gamma

c와 γ는 양의 상수이다. 로그 함수와 다르게 단순히 감마값을 바꿔서 얻는 변환 곡선 군을 주목한다.

감마보정은 컴퓨터 스크린에 영상을 정확하게 표시해야 할 때 중요하다. 적절하게 보정되지 않은 영상은 퇴색해 보이거나 너무 어둡게 보일 수 있다. 컬러 표현을 정확히 하기 위해서도 감마 보정에 대한 이해가 어느정도 필요하다. 왜냐하면 RGB의 비율이 변경되기 때문에 컬러 표현이 달라진다.

image_path = '/content/colors.png'
img=cv2.imread(image_path)
img = cv2.resize(img, (180,180))

#Gamma Transformation : s=cr^gamma
def Trans_Gamma(img, c, gamma=1.0):
    res = np.zeros(img.shape)
    for z in range(img.shape[2]):
        for x in range(img.shape[0]):
            for y in range(img.shape[1]):
                res[x][y][z] = c*(img[x][y][z]**gamma)
    return res

for i in np.arange(0,3.0,0.5):
    print('i={}'.format(i))
    cv2_imshow(Trans_Gamma(img, 1, i))

'Machine Learning > For CV' 카테고리의 다른 글

3. 밝기 변환과 공간필터링(3)  (0) 2020.11.09
3. 밝기 변환과 공간 필터링(2)  (0) 2020.11.05
2. 디지털 영상 기초(5)  (0) 2020.10.31
2. 디지털 영상 기초(4)  (0) 2020.10.31
2. 디지털 영상 기초(3)  (0) 2020.10.15