2

Python で HDR Mertens 露出フュージョンを実行すると、C++ でまったく同じ関数を実行したときに得られない奇妙な色のアーティファクトが発生します。( HDR チュートリアルを実行しただけです)

データ型に問題があるように思えますが、すべてのオプションを試しましたが、何も機能しません。私は何か間違ったことをしていますか?

OpenCV 3.0.0 で Python 3.5 64 ビットを実行しています。

露出画像はウィキペディアから取得しました: 1/30 秒1/4 秒2.5 秒15 秒

Python コード:

import cv2
import numpy as np

img_fn = ["640px-StLouisArchMultExpEV+4.09.jpg",
          "640px-StLouisArchMultExpEV+1.51.jpg",
          "640px-StLouisArchMultExpEV-1.82.jpg",
          "640px-StLouisArchMultExpEV-4.72.jpg"]
img_list = [cv2.imread(fn) for fn in img_fn]

# Exposure fusion using Mertens
mergeMertens = cv2.createMergeMertens()
resFusion = mergeMertens.process(img_list)

# Convert datatype to 8-bit and save
resFusion_8bit = np.uint8(resFusion*255)
cv2.imwrite("fusion.png", resFusion_8bit)

Pythonで得た結果:

ここに画像の説明を入力

C++で得た結果:

ここに画像の説明を入力

4

1 に答える 1

3

ここで起こることは、R、G、B サブピクセルの一部の 8 ビット オーバーフローとアンダーフローが原因です。それらのいくつかは[0.0 .. 1.0] 、融合後の間隔の外にあり、255 を掛けると、結果はマイナスまたは 255 を超えます。

np.uint8結果を切り捨て、最下位の 8 ビットのみを保持します。たとえば、次のようになります。

  • の値は次の-2ように保存されます254

  • の値は次の257ように保存されます1

[0 .. 255]これは、範囲内の結果をクリッピングすることで解決できます。

resFusion_8bit = np.uint8(resFusion*255)

np.clip(resFusion*255, 0, 255, out=resFusion)
resFusion_8bit = resFusion.astype('uint8')

imwriteまたは、最初に に変換せずに に255 を乗算した値を直接渡すことができuint8、クリッピングが処理されます。これは、提供されている C++ の例で行われているのと同じです。したがって、スクリプトは次のように書き換えることができます。

import cv2

img_fn = ["640px-StLouisArchMultExpEV+4.09.JPG",
          "640px-StLouisArchMultExpEV+1.51.JPG",
          "640px-StLouisArchMultExpEV-1.82.JPG",
          "640px-StLouisArchMultExpEV-4.72.JPG"]
img_list = [cv2.imread(fn) for fn in img_fn]

# Exposure fusion using Mertens
mergeMertens = cv2.createMergeMertens()
resFusion = mergeMertens.process(img_list)

# Save
cv2.imwrite("fusion.png", resFusion*255)

.JPG(これはウィキペディアの元の名前であり、ファイル名の大文字と小文字が区別される Linux でこれを実行したため、ファイル拡張子を - 大文字に置き換えたことに注意してください。)

于 2015-12-06T13:00:24.167 に答える