줄리아에서 이미지 불러오고 행렬로 변환 저장하는 법

줄리아에서 이미지 불러오고 행렬로 변환 저장하는 법

How to read and save an image convert to matrix in julia

코드

using Images

cd("C:/Users/rmsms/OneDrive/examples")
pwd()

example = load("example.jpg")
typeof(example)
size(example)

gray1 = Gray.(example)
typeof(gray1)
size(gray1)

M = convert(Array{Float64},gray1)
typeof(M)
size(M)
colorview(Gray, M.^(1/2))

save("rgb.png", colorview(RGB, example))
save("gray1.png", colorview(Gray, gray1))
save("gray2.png", colorview(Gray, transpose(gray1)))
save("gray3.png", colorview(Gray, M.^(1/2)))

예제 코드를 위에서부터 간략하게 이해해보자:

  • cd() : Change Directory, 작업 경로를 원하는 곳으로 바꿔준다.

  • pwd() : Print Working Directory, 작업 경로를 출력해준다. 예제를 그대로 따라해보고싶다면 위의 파일을 작업 경로에 다운로드 받고 파일 이름을 example.jpg로 수정하자.

example.jpg

20191213\_185204.png

  • load() : 작업 경로 내의 이미지 파일을 불러준다. 불러온 이미지의 타입은 Array{RGB{Normed{UInt8,8}},2}이다. 여타 언어에서 칼라 이미지를 세 개의 행렬을 하나로 묶어서 텐서로 표현하는 것과는 조금 다르다. 실제로 그러한 방식은 이미지를 수학적으로는 이해하기 편할지 모르나 색 공간과 라이브러리에 따라 통일된 규격이 없어 많은 혼선을 초래해왔다. 줄리아에서는 아예 타입 하나로 만들고 가로 세로 2차원인 배열로 이해한다. 이미지는 불러오는 순간 Plot 판넬에 프린트된다. 20191213\_184951.png

  • Gray() : 이미지를 흑백으로 변환하는데 사용되었다. 실제로 사용될 땐 Gray()가 아니라 Gray.()임에 주목하자. 이는 이 함수 자체는 하나의 픽셀을 흑백으로 바꿔주는 것이고 점을 찍어서 모든 픽셀에 대해서 적용한 것을 의미한다.

  • size() : 이미지의 크기를 반환한다. 언급했듯 칼라와 흑백을 모양이 다른 다른 텐서로 취급하지 않고 자료형이 다르고 크기가 같은 배열로 취급하고 있다. 20191213\_185608.png

  • Convert() : Array{Float64}, 즉 행렬로 gray1 이미지를 변환시켰다. 그러면 0이 검은 색이고 1이 흰색인 행렬로 흑백 이미지가 표현된다.

  • colorview() : 이 자체가 이미지나 행렬을 출력하는 함수다. 굳이 행렬을 이미지로 다시 바꿀 필요 없이 바로 Plot 판넬에서 이미지를 확인해볼 수 있다. 예제 코드에서는 행렬 $M$ 의 각 성분에 루트를 취해주었다. 행렬의 모든 성분은 $[0,1]$ 에 속하므로 이 변환은 이미지를 전체적으로 밝게 보정해준 것에 해당한다. 20191213\_190355.png 20191213\_190404.png

  • save() : 작업 디렉터리에 이미지를 저장한다:gray1.png : 흑백으로 저장되었다.gray2.png : 흑백이고 전치행렬을 취한 상태로 저장되었다.gray3.png : 흑백이고 밝게 보정된 상태로 저장되었다.rgb.png : 원본 그대로 색을 가진 채 저장되었다.

환경

  • OS: Windows
  • julia: v1.5.0
댓글