불러온 이미지를 3차원 배열안에 넣고 싶습니다.

게시판 IDL Q&A 불러온 이미지를 3차원 배열안에 넣고 싶습니다.

6 답변 글타래를 보이고 있습니다
  • 글쓴이
    • #957 Reply
      룰루
      회원

      안녕하세요.

      궁금한게 하나 있어 글 남깁니다 .(,,)

      말 그대로 이미지를 불러서 차곡차곡 쌓고 싶은데 생각만큼 잘 안되네요.ㅠ

      저번에는 세 장을 불러서 했기 때문에

      img1, img2, img3
      이런식으로 이미지를 한꺼번에 불러

      img(*,*,0)=img1
      img(*,*,1)=img2
      img(*,*,2)=img3

      이렇게 넣어버리고 끝냈는데.. 이번에는 좀더 많은 이미지를 넣어야 되서..

      img= intarr(801,609,101)

      for i = 0, 100 do begin

      file = “c:\test\” + strtrim(string(i+1), 2) + “.jpg”

      read_jpeg, file, img1
      isz=size(img1)
      img =reform(img1(0,*,*),isz(2), isz(3))
      isz=size(img1)

      img(*,*,i) = img1

      endfor

      이렇게 하면 i가 돌면서 차례대로 넣을 줄 알았는데 img안에 완전 텅 비어 있네요.

      어떻게 해야 될까요?ㅠ

    • #959 Reply
      sando
      회원

      isz=size(img1) 가 두번있는데, 이유가 있는지요?
      img =reform(img1(0,*,*),isz(2), isz(3)) 도 어떤 의도인지요?
      혹시 {대신 [ 를 쓰면 어떤가요? img[*,*,i]=img1 와 같이요~

      for 가 도는데, isz 와 img 응 두번씩 입력하게 되는데, 이게 좀 이상합니다~ img 의 type 이 바뀌어버릴것 같습니다.

      더 자세한 답변은 뒤에요^^

    • #960 Reply
      Jonghyuk
      회원

      sando님 말씀대로입니다.
      아래와 같이 시도해 보시면 어떨까요?

      img= intarr(801,609,101)

      for i = 0, 100 do begin
      file = “c:\test\” + strtrim(string(i+1), 2) + “.jpg”
      read_jpeg, file, img1
      isz=size(img1)
      img1 =reform(img1[0,*,*],isz(2), isz(3))
      img[*,*,i] = img1
      endfor

      img1이 3채널 데이터인데, 이중 0번 채널만 추출하는 것으로 추측됩니다. 그래서 좌변이 img가 아니라 img1이 되는 것이 적당할 것 같습니다.
      img1(0, *, *) 도 허용이 되는 문법입니다만, 요즘에는 img1[0, *, *] 으로 브라켓을 사용하는 것이 권장됩니다. 함수 img1 과 배열 img1이 명시적으로 구분되는 장점이 있습니다.

    • #970 Reply
      룰루
      회원

      아 감사함니다.^^; 잘 해결 되었네요.ㅎ

      IDL도 참..ㅎ 제가 제가 아직 컴퓨터 언어를 잘 이해하질 못해서

      쉬울거 같은데도 잘 안되네요 .ㅠㅠ

      sando님 질문에 몇가지 답변을 드릴꼐요.

      제가 이번에 불러드린 이미지는 저번과 같은 801 x 609 사이즈의 jpeg이미지입니다.

      file = “c:\test\” + strtrim(string(i+1), 2) + “.jpg”
      read_jpeg, file, img1

      으로 이미지를 읽으면 무슨 이유인지 모르겠는데,

      img1의 배열이 801 x 609의 2차원 배열이 아니라 3 x 801 x 609의 3차원 배열로 읽더군요.

      실제로 tv, img1 으로 뿌려주면 검은 화면만 나오고 이미지가 나오지 않았구요.

      그래서 img1의 배열을 801 x 609 사이즈로 만들어 주기 위해서

      img1 =reform(img1[0,*,*],isz(2), isz(3)) 를 넣었습니다.

      그리고 isz=size(img1)는 사실 매번 이미지의 배열을 넣어줘도 상관은 없지만..

      그것도 그것 나름대로 귀찮을거 같아서 size함수를 사용해서 한꺼번에 들어갈 수 있도록 넣었습니다.ㅎ

      reform하기전에 size 는 3차원 배열이라 Second dimension이 801이고 Third dimension이 609라서

      reform 함수에 isz(2)와 isz(3)을 넣었습니다.

      reform후에 size는.. 지금 가만히 생각해보니 할 필요는 없었는데 쓸대없는 짓이 되어 버렸네요.ㅎ

      이번에는 사용하지 않았지만 예전 코드에는 reform후 2차원으로 바뀐 img배열의 행과 열을

      알기 위해서 넣었습니다. 그럼 801 x 609 의 정보는 First dimension인 isz(1)과

      Second dimension인 isz(2)이 가지고 있기 때문에 그 이후에는 전부 isz(1)과 isz(2)를

      사용했엇지요.ㅎ

      그냥 그대로 size함수를 다시 사용하지 않고 그대로 isz(2)와 isz(3)을 사용하면 되는데 말이지요.ㅎㅎ

    • #971 Reply
      Sangwoo
      회원

      img1의 배열이 801 x 609의 2차원 배열이 아니라 3 x 801 x 609의 3차원 배열로 인식된다면 이건 단일 채널 이미지가 아닌 RGB 이미지입니다. Red, Green, Blue 3개의 채널이 함께 존재하는 이미지 자료인 셈이죠. 따라서 이러한 배열에 대하여 그냥 REFORM 함수를 사용하신 부분을 보면, reform(img1[0,*,*],isz(2), isz(3))라고 되어 있는데요. 이렇게 되면 첫번째 채널, 즉 Red 채널 이미지만 읽어오게 됩니다. Green, Blue 채널의 정보는 완전히 손실되는 셈이죠. 그러므로, RGB 채널의 정보를 가급적 다 살리면서도 단일 채널 이미지의 형태로 읽으려면 다음과 같이 read_jpeg 명령에서 /grayscale이란 키워드를 사용하여 읽는 것이 좋습니다.

      read_jpeg, file, img1, /grayscale

      그러면 img1 배열이 801×609의 형태로 바로 인식이 될겁니다. 이건 두 경우 모두에 대하여 TV 명령으로 img1을 표출해서 비교해보시면 그 차이를 바로 아실 수 있을겁니다.

    • #972 Reply
      룰루
      회원

      그렇군요.

      처음 이미지를 만들때 grayscale로 만들었기 때문에 RGB정보를 가질거라곤

      생각을 못했었습니다. 다시 한번더 확인을 해봐야겠네요.

      감사함니다.ㅎㅎ

    • #974 Reply
      Sangwoo
      회원

      만약 애초에 grayscale로 만들어졌다면 어쩌면 R, G, B 채널의 내용들이 서로 다 같을 수도 있는데, 그런 경우라면 원래 방법대로 하셔도 아무 지장은 없을 것 같습니다. 하여간 확인을 한번 해보시는 것이 가장 좋을 것 같네요.

6 답변 글타래를 보이고 있습니다
'불러온 이미지를 3차원 배열안에 넣고 싶습니다.'에 답변달기
글쓴이 정보: