행복한 하루

[edx.org] Computer Vision and Image Processing Fundamentals - What is digital image (Week 2-1.2 내용) 본문

Artificial Intelligence/Vision

[edx.org] Computer Vision and Image Processing Fundamentals - What is digital image (Week 2-1.2 내용)

변화의 물결 2021. 12. 18. 01:41

 

 

안녕하세요.

 

  앞의 내용을 이어서 진행해보도록 하겠습니다. 사진에 대한 내용과 PIL, NumPy 라이브러리를 사용하는 방법에 대해서 추가적으로 이야기해주고 있습니다.


1. 양자화(quantization) 이란?

  quantization(양자화)라는 표현이 의미가 애매할 수 있는데, 전자공학 입장에서 보면 빛을 받아들이는 카메라 센서 입장에서 한 cell에 빛이 들어오면 연속적인 전압이 파형의 진폭 패턴으로 표현됩니다. 여기서 전압 값으로 변환하는 것을 샘플링이라고 하고, 다시 아날로그 전압값으로 부터 적정한 디지털 값으로 연결시키는 작업을 양자화(quantiztion) 단계라고 합니다.

  상세한 설명은 아래 참고 사이트 2번을 따라가면 좀 더 깊이 설명해주고 있습니다. (이미지, 내용 참조)

1) 양자화 실습 

  실습에서는 양자화 하는 레벨을 줄여 버리면 어떻게 되는지 보여줍니다. 256 단계 vs 32 단계,

256 단계 vs 16 단계, ... 256 단계 vs 2 단계로 비교 할 수 있게 해 놓았습니다. 즉, 단계가 낮을 수도록 선명도(Intensity)가 낮아지는 것을 알 수 있습니다.

  

image_gray.quantize(256 // 2)
image_gray.show()

#get_concat_h(image_gray, image_gray.quantize(256//2)).show(title="Lena")
for n in range(3,8):
plt.figure(figsize=(10,10))

plt.imshow(get_concat_h(image_gray, image_gray.quantize(256//2**n)))
plt.title("256 Quantization Levels left vs {} Quantization Levels right".format(256//2**n))
plt.show()

 

  

2) Color Channels

  - 컬러 사진에는 RGB 채널이 존재한다고 앞 내용에서 확인하였습니다. 여기서 그 부분의 내용을 실습합니다. 우선 컬러사진을 하나 불러옵니다. 그리고 RGB로 채널을 분리하여 저장합니다.

  - 원본 컬러사진과 각 채널 이미지와 비교할 수 있도록 get_concat_h() 함수를 사용해서 바로 옆에 출력하도록 한다. (get_concat_h은 처음 내용에서 사용자 정의 함수로 구현되어 있습니다.)

 

def get_concat_h(im1, im2):
    #https://note.nkmk.me/en/python-pillow-concat-images/
    dst = Image.new('RGB', (im1.width + im2.width, im1.height))
    dst.paste(im1, (0, 0))
    dst.paste(im2, (im1.width, 0))
    return dst

  

baboon = Image.open('baboon.png')
baboon

red, green, blue = baboon.split()
get_concat_h(baboon, red)

 

 -  빨간색 채널을 컬러 이미지를 회색조(gray)로 플로팅 하면 빨간색 영역의 선명도가 높은 값을 가짐을 알 수 있습니다. Blue, Green 도 동일합니다.

 

3) NumPy 라이브러리 이용하기

  - 라이브러리를 특징은 다차원 배열과 매트릭스 작업을 가능하게 해 준다는 것입니다. 여기서는 PIL로 이미지를 연산처리를 위한 배열로 바꿔준다는 것입니다.

  - numpy 모듈을 Import 하고 asarray() 함수로 배열로 변환합니다. (원본 이미지를 배열로 만든다)

  

import numpy as np
array= np.asarray(image)
print(type(array))

 

  대신에 array() 함수를 사용해서 배열로 만들면 새로운 이미지가 복사되면서 배열이 만들어진다. 그리고 배열의 속성 중에 shape를 보면 행과 열 채널 수를 알 수 있습니다.

 

array = np.array(image)
# summarize shape
print(array.shape)

 

  배열을 출력해보면 R, G, B 배열로 선명도 값이 저장된 것을 확인할 수 있습니다. 아니면 한 점의 값도 출력해볼 수 있습니다.

print(array)
array[0, 0]

 

   그리고 배열에서 최솟값과 최댓값도 알아낼 수 있습니다.

array.min()
array.max()

  

   - 축을 표시해서 이미지를 볼 수도 있습니다. 그리고 그 간격을 보고 이미지가 보이는 영억도 조절할 수 있습니다.

  

plt.figure(figsize=(10,10))
plt.imshow(array)
plt.show()
  
rows = 256
plt.figure(figsize=(10,10))
plt.imshow(array[0:rows,:,:])
plt.show()

columns = 256
plt.figure(figsize=(10,10))
plt.imshow(array[:,0:columns,:])
plt.show()

 

  - 이미지를 다른 변수로 옮겨서 영상처리를 해보고 싶다면 주의해야 할 것이 있습니다. 이미지 배열을 copy() 함수를 사용해서 다른 변수로 옮겨야 한다는 것입니다. 그냥 B=A라고 한다면 B는 A의 배열을 가리키고 있는 포인터 값은 개념으로 B를 수정하면 A도 수정이 된다는 것입니다. 그렇기 때문에 원본 이미지 손상 없이 작업을 하려고 한다면 copy 함수를 사용하기 바랍니다.

  

A = array.copy()
plt.imshow(A)
plt.show()

  

  - 그냥 대입할 경우, A 값을 대입하여 검은 화면으로 만들었지만, B 이미지 배열이 변경된 것처럼 보이는 것이 위의 이유에서 입니다.

 

B = A
A[:,:,:] = 0
plt.imshow(B)
plt.show()

  

 - 개코원숭이 컬러사진을 읽어온 후 Red 채널의 선명도를 축 표시를 해서 gray 형태로 나타내어 봅니다.

  

baboon_array = np.array(baboon)
plt.figure(figsize=(10,10))
plt.imshow(baboon_array)
plt.show()

baboon_array = np.array(baboon)
plt.figure(figsize=(10,10))
plt.imshow(baboon_array[:,:,0], cmap='gray')
plt.show()

 

 

 - 개코원숭이 이미지 배열을 복사한 후 (원본을 살려두고 편집하기 위해서) red 채널 값만 두고 blue와 green 값을 0으로 초기화하면 Red 형태의 선명도를 볼 수 있습니다. 

 

baboon_red=baboon_array.copy()
baboon_red[:,:,1] = 0
baboon_red[:,:,2] = 0
plt.figure(figsize=(10,10))
plt.imshow(baboon_red)
plt.show()

 

  - Blue 값만 남기고 다른 채널 값 초기화

 

baboon_blue=baboon_array.copy()
baboon_blue[:,:,0] = 0
baboon_blue[:,:,1] = 0
plt.figure(figsize=(10,10))
plt.imshow(baboon_blue)
plt.show()

  

 

  강의가 생각보다 실습할 것이 많고 확인해볼 사항이 많기 때문에 천천히 강의 보셔야 할 것 같습니다. 그리고 장점은 코드도 바꿔보면서 테스트해볼 수도 있어 생각하는 부분들을 변경해서 실행시켜 볼 수도 있습니다. 

 위의 소스는 인터프리터 언어인 python으로 되어 있기 때문에 1편부터 연이어서 실행하면 결과들을 볼 수 있습니다.

 

 

감사합니다.

 

  

<참고 사이트>

1. edx.org - Computer Vision and Image Processing Fundamentals

https://www.edx.org/course/computer-vision-and-image-processing-fundamentals

2. 이미지 샘플링(Sampling)과 양자화(quantization)

https://twlab.tistory.com/19

 

 

 

Comments