2

フラットフィールドを画像に適用する 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_16UCV_8Uどちらも機能しません。

どんな助けでも大歓迎です!

編集

以下の提案に従って、いくつかの imshow コマンドを追加して、opencv が正しく処理していることを実際にテストしてみました。私の除算コマンドまで、すべてが正常に機能しているようです。その後、私の画像配列は空白になります。

4

2 に答える 2

1

通常の画像ブラウザを使用して 16 ビット画像を開くと、8 ビット画像しか正しく表示できないため、通常は完全に暗くなります。

これを解決するには、まず OpenCV highgui を使用して 16 ビット イメージを表示してみます。imshow("test",image) ; waitKey(0) ;画像が正しく表示されるかどうかを確認できます。もしそうなら、あなたのイメージを 8bit に変換し、Mat img8bit ; image.convertTo(img8bit, CV8U, 255./65535.) ;この新しい Mat を imwrite することができます。

于 2012-12-19T22:10:50.027 に答える
1

それは実際に私の除算コマンドであることがわかりました。私は同僚が作成した同様のアプリケーションに基づいてコードを作成していたので、彼らがどのように除算を行ったかを調べました。これが何を達成しているのかは100%わかりませんが、分割を次のように変更すると機能します。

divide( image, flat_img, image, image.depth() == 16 ? UCHAR_MAX : USHRT_MAX );

予測を行うだけで、その条件は、画像の深度に基づいてデータのスカラーを設定しています。私がまだ持っている1つの長引く質問は、私が持っているものとそうなるであろうものの違いは何ですかdivide( image, flat_img, image, image.depth() == 8 ? UCHAR_MAX : USHRT_MAX );. どちらも同じ画像のように見えるものを生成します。ほとんどの場合、何が起こっているのかをもう少しよく理解しようとしています。

于 2012-12-20T15:09:51.710 に答える