私は現在、写真からのビデオプロジェクトで立ち往生しています。
問題 :
バグのため、UE4 から画像を抽出しています。スクリーンショットのレンダリング中にすべてのライトが考慮されるわけではありません。出力は HDR 画像です。最初の露出のように、エクスポートされた画像が非常に暗いため、明るさを改善したいと考えています。
UE4 で「露出バイアス」パラメータを使用すると、シーンの明るさを十分に調整できますが、このパラメータをスクリーンショットのレンダリングに適用することはできません。
試行:
Tonemapper アルゴリズムを使用すると (具体的cv::TonemapDrago
には)、より良い画像結果を得ることができます:
私の場合、トーンマップアルゴリズムの主な問題は、領域の明るさに応じてグローバルな明るさが変化するためです。2番目の画像では、ウィンドウが多くの光を追加するため、アルゴリズムはすべての明るさを低くして平均を調整します. レンダリングされたビデオでは、光の変化は非常に残忍です。
明るさと彩度を変更しようとしましたが、成功しませんでした。アルゴリズムのいくつかのステップTonemapDrago
で定数を使用しようとするコードを修正しました。
質問 :
HDR画像から「露光時間を選択」したいです。トーンマップは、同じ画像の複数の露光時間に基づいていますが、私の場合は興味深いものではありません。
他のアイデアは大歓迎です。
編集:
CV::マットの深さは 5、タイプは CV_32FC3
cout << mat.step
19200ください
私の問題を解決するために使用する2つのサンプルを次に示します。
編集2:
gimp で .HDR 画像を開くことができません。イベントは「explosure blend」プラグインを使用しています。Photoshop を使用して十分な結果を得ることができます。その背後にあるアルゴリズムのアイデアはありますか? OpenCV による 6 つのトーンマップ アルゴリズムのいずれかで、露出補正を選択できます。
編集3:
私はopenGLのこのチュートで説明されているアルゴリズムに従いました。これにより、このC +コードが提供されます。
cv::Mat exposureTonemap (cv::Mat m, float gamma = 2.2, float exposure = 1)
{
// Exposure tone mapping
cv::Mat exp;
cv::exp( (-m) * exposure, exp );
cv::Mat mapped = cv::Vec3f(1.0) - exp;
// Gamma correction
cv::pow(exp, 1.0f / gamma, exp);
cv::imshow("exposure tonemap", exp );
cv::waitKey();
return exp;
}
このアルゴを .HDR 写真に適用すると、ガンマと露出を 1 と 1 に補正しても非常に明るい結果が得られました。
コードを読むと、引数として 1 と 1 が画像を変更してはならないため、何か問題があります。それを修正し、回答が投稿されました。@ user3896254に感謝します(Geもコメントで見ました)