Category: R

  • 이미지 회전

    이미지 회전

    수학의 정석 수학 II 에 아마 회전변환에 대하여 나와 있었던 것 같다.

    원점을 중심으로 한 회전변환은 인터넷에서 쉽게 찾을 수 있었는데,

    특정 점을 기준으로 한 회전변환은 찾기가 힘들었다.

    정석 책을 다시 살 수도 없는 노릇이고.

    그래서 인터넷을 뒤지고 뒤져본 끝에 찾을 수 있었다.

    사실 맞는지 잘 모르겠다. 

    종류가 이거랑 비슷한거 하나가 더 있었기는 했는데 왠지 둘 다 맞는듯한…

    점(a, b)를 기준으로 θ 만큼 회전변환은 다음과 같이 하면 된다고 한다.

    Matrix 계산이 오히려 더 구현하기 쉬워서 좋았다.


    계산을 최소한도로 하는 것이 목적이었으니 (a, b)는 (r, r)로 하면 된다.

    이 사진이 동그랗게 찍힌다는게 정말 좋았다.

    아니면, 좀 더 귀찮아졌을지도…

    처음 사진은 원본

    다음 사진은 시계 반대방향으로 5도 회전

    이 사진은 33도 회전.

    회전의 정도가 크면 클수록 검은 부분이 나오는데..

    짐작가는 원인은 있으나

    이 부분은 해결을 할지 말지를 좀 고민해봐야…

    안과형이랑 이야기해 본 결과에 따르면

    실제로 안구외상 등으로 외안근 혹은 이러한 근육을 담당하는

    신경 손상이 발생하지 않는다면,

    거의 회전(rotation)이 일어나지 않는다고 한다.

    아마, 이 부분은 실제로 분석하는데 사용되지 않을 것으로 예상된다.

  • 이미지 이동

    이미지 이동

    rasterImage()를 사용하면 그냥 회전이 되는 것 같기도 한데…

    아마 이 방법은 화면으로 출력에 관여하는 것 같다.

    실제 영상 자료를 다루어야 한다면 필요 없는 부분일 듯 하다.

    그보다 문제는 영상 정보의 수치처리에 어렵다.


    뭔가 획기적으로 편한 방법이 있을 수 있겠지만,

    일단 무식한 방법으로 접근해 보기로 한다.

    직접 좌표를 이동하는 방법이다.


    내가 알고 있는 회전 변환은 2차원 평면에서는 별 문제 없이 적용시킬 수 있지만

    matrix에서 0과 음의 좌표 따위는 취급하지 않는다.


    이걸 고민해야하는 이유는 그림 파일을 불러오면 

    1사분면에 위치하며 x 축과 y축에 바짝 붙어있는(?) 

    커다란 직사각형 모양으로 그림 픽셀 좌표가 형성되게 된다.


    그런데 어느 특정점을 기준으로 이 사각형을 회전시키게 되면

    1사분면이 아닌 2, 3, 4 사분면에 사각형의 일부가 이동하는데 문제가 있다.

    이 사분면에 위치하는 정보를 없애면 그만이지만

    그림 정보의 손실이 없으려면

    회전한 사각형이 1사분면에만 존재하여야 하며

    그로 인하여 회전하기전에 사각형을 1사분면 방향으로 이동시켜 주는 것이 필요하다.

    가장 생각없이 옮기는 방법은

    원래 사각형이 가로 a픽셀, 세로 b픽셀의 크기라고 하면

    이와 같은 크기의 matrix(a,b)를 가지고 있다고 할 수 있고,

    이 (a, b) 보다 겁나 큰 (c, d)의 크기를 가지는 matrix 를 만들어

    그 내부로 적당히 평행 이동시키면 된다.

    이 방법의 문제는 c, d 의 크기를 어느 정도로 잡을 것이냐의 문제와

    크기가 크면 클 수록 계산에 시간이 소요된다는 단점이 있다.

    계산 시간의 소요는 multicore 사용이 어려운 R에서는 큰 문제이다. 

    최적화시켜보기 위하여 오랜만에 좀 생각을 많이 해 보았다.

    1사분면에 있는 사각형은 가로 a, 세로 b의 크기를 가지고 있다.

    이 사각형을 구성하는 4개의 점은 반지름이 r인 원위에 있다고 생각해보면

    반지름은 다음과 같다.

    이 원의 공식은 다음과 같다.

    이 원이 최소한으로 평행 이동하여 원의 모든 부분이 1사분면 혹은 x, y축에 위치하기 위해서는

    원의 중심이 (a/2, b/2) 에서 (r, r)에 해당하도록 평행 이동 시키면 될 것이다.

    이 원은 가로, 세로 2r 인 정사각형 내부에 존재하게 된다.

    그러니깐 최소한으로 하려면 matrix(2r, 2r) 을 만들어서 

    x 축으로 살짝, y 축으로 살짝 옮겨주면 되겠다.

  • 그림 파일 불러오기

    그림 파일 불러오기

    통계 목적으로 주로 사용할 수 있지만 사실 응용 범위는 끝이 없는 R

    특정 질환의 전과 후 비교한 안저사진 분석 그림을 본 순간 R에서도 가능할 것이라는 생각이 들었다.

    우선 인터넷에서 안저사진 하나를 구한 다음에 시작했다.

     

    원래는 크기가 4배쯤 컸지만 편의를 위하여 가로 600픽셀 크기로 줄였다.

    R에서 그림 파일을 불러오는 방법은 쉽다. 난 JPEG 파일을 구했기 때문에 다음과 같이 적용했다.


    library(jpeg)

    before_original <- readJPEG(“F:/retina_re.jpg”, native=FALSE)

    readJPEG 라는 명령어를 사용하면 되며, native 항목의 옵션에서 FALSE가 기본항목이다. 

    FALSE를 선택하게 되면 가로픽셀 x 세로픽셀 크기의 matrix 3개(RGB, 3 channel) 가 합쳐진 matrix 로 구성된다.

    이 방법으로 불러오면 색상에 대한 정보는 최소값이 0, 최대값이 1로 된다고 한다.

    (차원인거 같기는 한데 사실 어떻게 불러야 하는지 모르겠음)

    따라서, 

    before_original [,,1] Red

    before_original [,,2] Green

    before_original [,,3] Blue 

    가 되겠다.

    나중에 편리할 것 같아서 각각을 나눠서 늘 쓰는 X x Y 의 matrix 로 구성했다.

    before_original_1 <- before_original[,,1]

    before_original_2 <- before_original[,,2]

    before_original_3 <- before_original[,,3]

    잘 불러와졌는지 확인하기 위하여 각각의 점들에 해당하는 색상 정보를 바탕으로 점을 찍어 보기로 하였다.

    빈 화면을 그리는 방법을 몰라서 우선 빈 화면을 하나 그려야 했다.

    그림 파일은 아마 좌측 상단부터 (1,1) 로  구성이 되어 있겠지만,

    내가 아는 수학의 세계에서 (1,1)은 좌측 하단에 존재한다.

    즉, y축으로 대칭된 구조이다. 그래서 다음과 같이  살짝 변경했다. 

    plot(c(1,before_original_width), c(-before_original_height, -1), type=”n”, xlab=””, ylab=””)

    점을 그려넣어야 하는데, 

    점의 색상 정보를 입력하는 것은 rgb() 를 사용하면 쉽게 적용시킬 수 있다. 

    maxColorValue 는 사실 기본이 1이다.

    그래서 사각형의 점을 쭈욱 그려보면

    for (Y in 1:before_original_height){

      for (X in 1:before_original_width){

        points(X, -Y, pch=15, cex=1, col=rgb(before_original_1[Y, X], before_original_2[Y, X], before_original_3[Y, X], maxColorValue = 1))

    }}

    살짝 뭉게지기는 했지만, 같은 화면임을 알 수가 있다.

  • stringr

    요즘 시간을 내서 텍스트에 특정 단어가 있는지, 어떤 위치에 있는지를 확인해야 하는 것을 해야하는데 인터넷에서 정보를 찾던 중에 stringr 이라는 package 를 알게 되었다. 유사한 기능이 분명히 내장되어 있겠지만, 사용하기에 편해서 좋다.