フラットフィールドを画像に適用する C++ プログラムを作成しようとしています。画像を読み込んで、読み込んだ別の画像で分割し、PNG としてエクスポートすることになっています。私のプログラムは正しくコンパイルされますが、真っ黒な画像しか生成されません。
#include <climits>
#include <stdio.h>
#include <string>
#include <opencv/cv.h>
#include <opencv/highgui.h>
using namespace cv;
using namespace std;
int main( int argc, char *argv[] )
{
const char *flat_file = argv[1];
const char *img_file = argv[2];
const char *out_file = argv[3];
Mat flat_img;
flat_img = imread( flat_file, CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH );
Mat image;
image = imread( img_file, CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH );
GaussianBlur( flat_img, flat_img, cv::Size(3,3), 0, 0, BORDER_REPLICATE );
divide( image, flat_img, image, 1.0, -1 );
imwrite( out_file, image );
return 0;
}
すべての入力ファイルは 16 ビット TIFF です。現在、結果の出力ファイルは正しいピクセル寸法を持つ 16 ビットの PNG ですが、完全に黒です。
私は C++ と OpenCV の両方に非常に慣れていないため、何が欠けているのか完全にはわかりません。このスレッドは、おそらく浮動小数点値が原因であることを示唆しているようです。浮動小数点からの変換は問題ありませんが、ソースの 16 ビットの性質を維持する必要があります。image.convertTo( image, CV_16U );
分割コマンドの後に行を追加しようとしましたがCV_16U
、CV_8U
どちらも機能しません。
どんな助けでも大歓迎です!
編集
以下の提案に従って、いくつかの imshow コマンドを追加して、opencv が正しく処理していることを実際にテストしてみました。私の除算コマンドまで、すべてが正常に機能しているようです。その後、私の画像配列は空白になります。