image function의 setdata method에서 min_value / max_value 고정

게시판 IDL Q&A image function의 setdata method에서 min_value / max_value 고정

이 게시글은 5개 답변과 2명 참여가 있으며 마지막으로  Sangwoo에 의해 9 시간, 19 분 전에 업데이트 됐습니다.

  • 글쓴이
  • #5129

    chokh
    회원

    안녕하세요.

    NG 체계에서의 소소한 팁을 얻고자 합니다.
    image function에서 setdata method를 이용해서 표출되는 데이터를 변경하는 경우 자동으로 min_value와 max_value가 변환되어서 표출되는 것을 막는 방법에 대한 질문입니다.

    image1 과 image2가 있고 제가 원하는 data range가 [min, max]라고 가정합시다.
    먼저 image1을 그리면 다음과 같습니다.

    img=image(image1, min_value=min, max_value=max)

    이후에 image2를 동일한 셋팅으로 그리려면 setdata method를 사용하게 됩니다. 다시 처음부터 그리는 것 보다 setdata method를 사용하는게 빠르고 간편하겠죠?

    img.setdata, image2

    축 스타일이나 title 등 여러가지 환경은 그대로인데 min_value와 max_value가 image2의 값들에 맞게 셋팅되어서 표출됩니다. 물론, 다시 제가 원하는 data range로 바꿀 수 있습니다.

    img.min_value=min
    img.max_value=max

    하지만 번거로울 뿐더러 한 두장의 이미지면 괜찮겠지만 많은 이미지를 표출할 때는 그만큼 시간이 많이 들어 문제가 되는 것 같습니다.

    사소하지만 min_value, max_value가 변경되지 않게 하는 방법이 있는지 알고 싶습니다.

  • #5130

    Sangwoo
    회원

    아시다시피 IMAGE 함수 자체에 MIN_VALUE, MAX_VALUE 속성이 있는데, IMAGE 함수를 처음 사용할 때 이 속성들에 대하여 값을 구체적으로 지정해버리면 됩니다. 예를 들면 다음과 같은 방식입니다.

    im = IMAGE(data, MIN_VALUE=0, MAX_VALUE=100, ~~~)

    이렇게 하면 나중에 SetData 메서드에 의하여 IMAGE 함수에 대응되는 데이터가 변경된다 하더라도, 표출에 있어서 최소 및 최대값은 고정된 채로 유지된다는 점을 활용하시면 됩니다.

    • 이 답변은  Sangwoo에 의해 3 주, 5 일 전에 수정됐습니다.
    • 이 답변은  Sangwoo에 의해 3 주, 5 일 전에 수정됐습니다.
  • #5158

    chokh
    회원

    답변 감사드립니다. Q&A 게시판에 답변을 어떻게 다는지 한참 고생하다가 이제서야 달게 되었습니다.

    제가 테스트 해 본 결과 setdata method를 사용시에 image함수에 대응되는 데이터가 변경되면 min_value, max_value가 고정되지 않고 새로운 데이터에 맞춰서 자동으로 조정됩니다. (저는 windows 7에서 IDL 8.6.1 을 사용중에 있습니다.)

    혹시 image function 자체에 그런 기능이 없다면 다른 방법을 알고 계신지 궁금합니다. (예를 들면, structure에서 특정 field 값을 고정시키는 기능이 있다든지….)

  • #5159

    Sangwoo
    회원

    제가 다시 한번 확인해본 결과, 말씀하신대로 SetData 메서드를 사용할 경우 최소 및 최대값이 리셋이 되는 현상이 발견되는군요. 다만 이러한 현상은 이미지 데이터의 값들이 바이트(Byte)형이 아닐 경우에 발생합니다. 바이트형일 경우에는 제가 원래 언급했던대로 min_value, max_value에 의한 범위 고정이 가능합니다. 그러나 만약 실제 사용하시는 데이터의 값들이 바이트형이 아닌 실수나 정수 등인 경우라면, 대상 데이터에 대하여 바이트스케일을 직접 해주어야 합니다. 예를 들어 data1과 data2라는 이미지 배열을 -50~+50의 범위로 고정한 채 SetData 메서드를 사용하여 연속으로 표출하고자 할 경우라면 다음과 같은 방식으로 BYTSCL 함수를 사용하면 됩니다.

    im = IMAGE(BYTSCL(data1, MIN=-50, MAX=50), ~~~)
    im.SetData, BYTSCL(data2, MIN=-50, MAX=50)

    약간 번거로울 수 있지만, 일단 이러한 방법을 고려해보시면 어떨까 합니다.

  • #5160

    chokh
    회원

    말씀하신 방법이 좋아보이지만, 간간히 마우스 포인터를 가져다 대어서 해당 pixel의 value를 확인하는 경우, 혹은
    colorbar를 그릴 때 등등 몇 가지 고래해야 할 점들이 생기는것 같습니다. 일단 setdata method 자체에서 해결할
    수 있는 방법이 없는 점을 확인시켜 주셔서 감사드립니다.

    방금 전 생각난 (아주 간단한) 해결책으로 setdata method를 적용하면서 min_value, max_value를 원래 지정된 값으로 환원시켜 주는 간단한 procedure를 짜서 사용하겠습니다.

    다시한번 답변 감사드립니다.

  • #5163

    Sangwoo
    회원

    맞습니다. 제가 제시했던 방법은 말씀하신 것들과 같은 한계점이 있습니다. 따라서 어차피 SetData만 단독으로 사용하기보다는, 다음과 같이 SetData를 사용하면서 필요에 따라 타 속성들을 별도로 설정해주는 것이 가장 확실한 해결책일 것 같습니다.

    mn = -50; minimum value
    mx = 50; maximum value
    im = IMAGE(data1, MIN_VALUE=mn, MAX_VALUE=mx, ~~~)
    im.SetData, data2
    im.MIN_VALUE=mn
    im.MAX_VALUE=mx

답변은 로그인 후 가능합니다.