jpg이미지에서 컬러테이블을 뽑아내려고 합니다

게시판 IDL Q&A jpg이미지에서 컬러테이블을 뽑아내려고 합니다

4 답변 글타래를 보이고 있습니다
  • 글쓴이
    • #2835 Reply
      hm_park
      회원

      안녕하세요
      며칠전에 이어 다시 질문을 드리네요.

      영상처리한 이미지에 색깔을 입히기 위해서 loadct를 사용해서 입히는 작업들을 해 보다가
      마음에 드는 색깔이 있는 이미지에서 컬러테이블을 뽑으면 좋겠다는 생각을 하게 되었습니다.

      인터넷에 떠도는 대부분의 이미지가 jpg화일이어서 jpg화일에서 컬러테이블을 따오고자 시도중인데 잘 안되네요.
      jpg화일을 읽을 때 이미지 배열과 컬러테이블을 따로 불러냈고, 그걸 IDL상에서 다시 표시하도록 해 보고 있습니다.(이미지 화일은 http://sdo.gsfc.nasa.gov/assets/img/latest/latest_1024_HMIIC.jpg 을 사용하였습니다)

      read_jpeg,’image.jpg’,img,ct ;<–이 때 ct의 배열은 (252,3)이었습니다.
      device,decom=0
      tvlct,ct(*,0),ct(*,1),ct(*,2)
      window,xs=1024,ys=1024
      tv,img

      이렇게 코드를 만들었을경우 윈도우창에 이미지가 그려지지만 원래 JPG를 볼 때와는 다르게 나옵니다.
      tvlct에 문제가 있는것같아 여러 옵션들(/HLS,/HLV)을 사용해 봤지만 이상하게 나오는건 똑같습니다.
      물론 read_png 프로시저를 사용하여 단순히 읽어서 표시할 때 true 옵션을 쓰면 제대로 표시되겠지만 그럴경우에는 컬러테이블을 뽑아낼 수가 없습니다.
      컬러테이블을 뽑아내어서 이미지에 제대로 표시할 수 있도록 하는 방법이 없을까요?
      답변 부탁드립니다.

      • 이 게시글은 hm_park에 의해 7 years, 11 months 전에 수정됐습니다.
      • 이 게시글은 hm_park에 의해 7 years, 11 months 전에 수정됐습니다.
    • #2838 Reply
      Sangwoo
      회원

      올려주신 코드의 내용을 보면, 제대로 하신 것이 맞습니다. 언급하신 JPG 파일을 갖고 저도 동일한 방식으로 표출을 해봤는데, 제가 볼 땐 원본 이미지의 모습과 거의 비슷하게 나오거든요. 중간에 있는 TVCLT 부분은 저의 경우는 TVLCT, ct 라고 적긴 했지만 어차피 결과는 같습니다. 이미지 배열의 픽셀값을 보면 최대값이 242가 나오고, 색상의 값은 251까지 존재하는 상태입니다. 따라서 TV로 표출하면 픽셀값에 맞게 컬러테이블상의 색상들이 매칭이 되면서 제대로 표출이 되는 것이 맞습니다. “다르게 나온다”고 느끼시는 그 다름의 정도가 어느 정도인지 궁금합니다.

      참고로 그래픽창에 표출된 이미지를 다시 별도의 JPG 파일로 저장해봤습니다. JPG 파일 생성에 있어서는 다음과 같은 과정을 거쳤습니다.

      cap = TVRD(/TRUE)
      WRITE_JPEG, ‘20160526_jpg_sav.jpg’, cap, QUALITY=100, /TRUE

      이렇게 저장된 그림 파일은 아래 링크에서 볼 수 있습니다. JPEG 포맷 자체의 특성상, IDL의 그래픽창에서 보이는 모습에 비하여 미세한 열화가 있긴 하지만 심각할 정도의 차이는 나지는 않습니다. 혹시나 지난번 질문/답변에서 언급하신 그래픽 뷰어의 문제는 아닌지 궁금합니다.

      http://www.spweather.com/~lee/20160526_jpg_sav.jpg

      • #2839 Reply
        hm_park
        회원

        이미지를 링크할 웹페이지가 없어서 코드를 적어볼까 합니다.
        이미지는 같은 링크의 512×512영상을 사용하였습니다.

        window,xs=1024,ys=512
        read_jpeg,’latest_512_HMIIC.jpg’,img1
        tv,img1,0,0,/true ;;일반적으로 읽어서 표시할때의 영상입니다.
        read_jpeg,’latest_512_HMIIC.jpg’,img2,ct
        device,decom=0
        tvlct,ct
        tv,img2,512,0 ;;컬러테이블을 적용하여 표시할때의 영상입니다.

        이렇게 두 그림을 비교해 볼 경우 영상의 질의 저하가 확연히 나타나며 오른쪽의 그림을 tvrd()를 사용하여 저장하더라도 같은 결과를 나타냅니다. 원본과 비교했을때 질이 많이 떨어지거든요.
        혹시 제가 뭔가 놓친 것이 있을까요?

        tvrd(/true)와 write_jpeg를 사용하여 저장한 이미지 링크 첨부합니다.
        http://cfile208.uf.daum.net/image/2467C2465746ABC22083B5

        • 이 답변은 hm_park에 의해 7 years, 11 months 전에 수정됐습니다.
    • #2841 Reply
      mwkim
      회원

      안녕하세요.

      혹시나 해서 READ_JPEG 함수를 살펴봤는데,

      TWO_PASS_QUANTIZE 키워드를 사용하면 해결되는 것(또는 그런 것)처럼 보여서 글 남깁니다.

      READ_JPEG로 읽어온 데이터를 24비트일 때와 8비트일 때는 비교했을 때

      값에 차이가 있어 이 부분을 찾아보니 해당 키워드를 사용했을 때가 원본과 가깝게 나타났습니다.
      (원리는 저도 잘 모르겠습니다.)

      좀 더 구체적으로 알려드리면 JPEG 그림 자체가 256 컬러에 딱 맞지 않습니다.
      (24비트로 그림을 읽어서 확인한 결과 총 10032개의 색 검색)

      따라서 8비트로 읽어서 표출하면 원본과 다르게 표출되는 문제는 어쩔 수 없이 발생할 것 같습니다.

    • #2842 Reply
      Sangwoo
      회원

      제가 아까 올렸던 댓글의 내용에 약간 잘못된 부분이 있어서 다시 보충해서 설명을 해보겠습니다. 우선 JPEG 포맷 파일에 저장된 이미지는 무조건 24비트 트루컬러 이미지입니다. 그런데 이 파일을 읽을 때 컬러테이블을 가져오도록 설정을 하면 8비트 이미지 배열로 읽혀집니다. 따라서 원본은 3X512X512인데 이를 512X512로 읽은 셈입니다. 이렇게 되면 색상 디테일은 상당 부분 손실됩니다. 결론적으로 얘기한다면, JPEG 파일에 담긴 24비트 이미지를 컬러테이블이 동반된 8비트 데이터로 읽을 경우에는 원본과 같은 품질을 절대로 재현할 수 없습니다. 이 과정에서 얻어진 컬러테이블 데이터는 원본의 색상 디테일을 그냥 대충 흉내낸 결과 정도라고 이해하면 됩니다. 어차피 컬러테이블이란 개념 자체가 8비트 이미지에서만 유효하기 때문입니다.

      다만 8비트 데이터로 읽을 때, 바로 위의 댓글에서 언급되었던 TWO_PASS_QUANTIZE 키워드를 사용하여 two pass color quantization이라는 기법을 적용할 경우에는 그런대로 괜찮은 품질을 얻을 수는 있습니다. 즉, 그래픽창을 가로로 좀 더 늘인 후 이 방법을 적용하여 다음과 같이 읽어서 표출해보면 좀 더 나아진 품질의 결과를 얻을 수는 있습니다. 물론 이렇게 얻어진 결과도 8비트 배열이기 때문에 근본적으로 원본의 24비트 품질과 같을 수는 없겠지만, 눈으로 보기에는 좀 더 나은 것은 사실입니다.

      READ_JPEG, file, img3, ct3, /TWO_PASS
      HELP, img3, ct3
      TVLCT, ct3
      TV, img3, 2

      이 결과들을 캡쳐한 그림을 아래 링크에 올립니다. IDL에서 얻은 결과의 모습을 그대로 살리고자 일부러 PNG 포맷으로 저장하였습니다. 첫번째는 24비트 트루컬러 표출, 두번째는 8비트 표출, 세번째는 TWO_PASS 키워드를 사용하여 얻은 8비트 데이터 표출에 해당됩니다.

      http://www.spweather.com/~lee/20160526_figures.png

      사실 이미지 자체가 좀 밋밋한 편이어서 저도 처음에 순간적으로 착각을 했었습니다. 하여간 이 내용으로 참조하시기 바랍니다.

    • #2843 Reply
      hm_park
      회원

      조금전에 두 분의 글을 보고 시도를 해 보았습니다.
      two_pass_quantize나 dither 옵션을 쓰니까 이미지 품질이 나아지는 것을 확인하였습니다.
      답변 감사드립니다.

4 답변 글타래를 보이고 있습니다
'jpg이미지에서 컬러테이블을 뽑아내려고 합니다'에 답변달기
글쓴이 정보: