OpenCV 16bitImage - eiichiromomma/CVMLAB GitHub Wiki
(OpenCV) 16bit image
16Bit画像の扱い方
グレースケールで16Bit画像を扱う場合
環境依存かも知れないが、Windows(Vistaでlibtiffも含めてリビルド済み)では16Bitどころか圧縮フォーマットはアウト。Linuxでは8Bitは圧縮も確認済み。(16Bitは未確認)
Windows環境で16Bitも問題無く動作。Linuxは未確認(多分大丈夫)。
cvLoadImage("ファイル名",CV_LOAD_IMAGE_ANYDEPTH|CV_LOAD_IMAGE_ANYCOLOR);
とする。これで色、階調数が固定されること無く読み込める。
- プログラム内で16Bit画像を作成
- 表示
- PNG形式で保存
- 読み込み
- Flip処理
- 濃度値読み取り(16Bitの確認)
- Depthの参照(確認その2)
- 表示 といった流れ。 適当に作ったのでエラー処理は皆無。
のような画像が表示され、キーを押すとFlipした画像が表示される。 IrfanViewなどで画像情報を確認すると16Bitになっている事が分かる。
※↑の画像は8Bitに階調を落としてある
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)
#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);
}