OpenCV 16bitImage - eiichiromomma/CVMLAB GitHub Wiki

(OpenCV) 16bit image

16Bit画像の扱い方

グレースケールで16Bit画像を扱う場合

TIFFの場合

環境依存かも知れないが、Windows(Vistaでlibtiffも含めてリビルド済み)では16Bitどころか圧縮フォーマットはアウト。Linuxでは8Bitは圧縮も確認済み。(16Bitは未確認)

PNGの場合

Windows環境で16Bitも問題無く動作。Linuxは未確認(多分大丈夫)。

cvLoadImageの引数

cvLoadImage("ファイル名",CV_LOAD_IMAGE_ANYDEPTH|CV_LOAD_IMAGE_ANYCOLOR);

とする。これで色、階調数が固定されること無く読み込める。

テストサンプル

  1. プログラム内で16Bit画像を作成
  2. 表示
  3. PNG形式で保存
  4. 読み込み
  5. Flip処理
  6. 濃度値読み取り(16Bitの確認)
  7. Depthの参照(確認その2)
  8. 表示 といった流れ。 適当に作ったのでエラー処理は皆無。

のような画像が表示され、キーを押すとFlipした画像が表示される。 IrfanViewなどで画像情報を確認すると16Bitになっている事が分かる。

※↑の画像は8Bitに階調を落としてある

Python

import cv2
import numpy as np

src = np.array([[c * r for c in range(256)] for r in range(256)], dtype=np.uint16)
cv2.imshow('src', src)
cv2.waitKey(0)
cv2.imwrite('16pngtest.png', src)

src2 = cv2.imread('16pngtest.png', cv2.IMREAD_ANYDEPTH | cv2.IMREAD_ANYCOLOR)
src2 = cv2.flip(src2, 1)
cv2.imshow('src2', src2)
cv2.waitKey(0)
print(src[:, 255])
print("Depth: ", src.dtype)

旧C I/F

    #include <cv.h>
    #include <highgui.h>
    #include <stdio.h>

    void main()
    {
      int x,y;
      IplImage *src = cvCreateImage(cvSize(256,256),IPL_DEPTH_16U,1);
      for (y=0; y<256; y++){
        for (x=0; x< 256; x++){
          ((UINT16 *)(src->imageData + y*src->widthStep))[x]=x*y;
        }
      }
      cvNamedWindow("src",1);
      cvShowImage("src",src);
      cvWaitKey(0);
      cvSaveImage("16pngtest.png)",src);
      cvReleaseImage(&src);
      IplImage *src2=cvLoadImage("16pngtest.png)",CV_LOAD_IMAGE_ANYDEPTH|CV_LOAD_IMAGE_ANYCOLOR);
      cvFlip(src2,src2,1);
      cvNamedWindow("src2",1);
      cvShowImage("src2",src2);
      y=128;
      for(x=255; x>=0; x-- ){
        printf("x=%d,Intensity=%d\n",x,((UINT16 *)(src2->imageData + y*src2->widthStep))[x]);
      }
      printf("Depth=%d\n",src2->depth);
      cvWaitKey(0);
      cvReleaseImage(&src2);
    }
⚠️ **GitHub.com Fallback** ⚠️