Пример #1
0
def HDR(_imgs_nx1, _times_nx1, method=Debevec):
    assert _imgs_nx1.dtype == np.uint8 and _times_nx1.dtype == np.float32, "Type Error"
    assert len(_imgs_nx1) == len(
        _times_nx1) and len(_times_nx1) > 0, "Len Error"
    if method == Debevec:
        CalibrateDebevec = cv2.createCalibrateDebevec(samples=70, random=True)
        crf = CalibrateDebevec.process(src=_imgs_nx1, times=_times_nx1)
        merge_debvec = cv2.createMergeDebevec()
        hdr_img = merge_debvec.process(src=_imgs_nx1,
                                       times=_times_nx1,
                                       response=crf)
        tonemap = cv2.createTonemapDurand(gamma=1.4)
        res_img = tonemap.process(hdr_img.copy())
        return crf, hdr_img, res_img
    if method == Robertson:
        CalibrateRobertson = cv2.createCalibrateRobertson()
        crf = CalibrateRobertson.process(src=_imgs_nx1, times=_times_nx1)
        merge_robertson = cv2.createMergeRobertson()
        hdr_img = merge_robertson.process(src=_imgs_nx1,
                                          times=_times_nx1,
                                          response=crf)
        #local tonermap
        tonemap = cv2.createTonemapDurand(gamma=1.4)
        res_img = tonemap.process(hdr_img.copy())
        return crf, hdr_img, res_img
    if method == Mertens:
        merge_mertens = cv2.createMergeMertens()
        res_img = merge_mertens.process(_imgs_nx1)
        # cv2.imshow("ss", res_img)
        # cv2.waitKey(0)
        # cv2.destroyAllWindows()
        # res_mertens_8bit = np.clip(res_img*255, 0, 255).astype('uint8')
        # cv2.imwrite("PyFusion.png", res_mertens_8bit)
        return res_img
Пример #2
0
def Rendering(img_list,exposure_times):
    # Merge exposures to HDR image
    merge_debvec = cv2.createMergeDebevec()
    hdr_debvec = merge_debvec.process(img_list, times=exposure_times.copy())
    merge_robertson = cv2.createMergeRobertson()
    hdr_robertson = merge_robertson.process(img_list, times=exposure_times.copy())
    
    # Tonemap HDR image
    tonemap1 = cv2.createTonemapDurand(gamma=2.2)
    res_debvec = tonemap1.process(hdr_debvec.copy())
    tonemap2 = cv2.createTonemapDurand(gamma=1.3)
    res_robertson = tonemap2.process(hdr_robertson.copy())

     # Exposure fusion using Mertens
    merge_mertens = cv2.createMergeMertens()
    res_mertens = merge_mertens.process(img_list)

     # Convert datatype to 8-bit and save
    res_debvec_8bit = np.clip(res_debvec*255, 0, 255).astype('uint8')
    res_robertson_8bit = np.clip(res_robertson*255, 0, 255).astype('uint8')
    res_mertens_8bit = np.clip(res_mertens*255, 0, 255).astype('uint8')

    cv2.imwrite("ldr_debvec.jpg", res_debvec_8bit)
    cv2.imwrite("ldr_robertson.jpg", res_robertson_8bit)
    cv2.imwrite("fusion_mertens.jpg", res_mertens_8bit)
Пример #3
0
def main():
    global client, img
    images = []
    delta = 25
    set_param('auto_exposure', True)
    set_param('auto_frame_rate', True)
    ev_auto = get_param('exposure')
    print("EV_auto: {0}".format(ev_auto))
    set_param('auto_exposure', False)
    # exposure = [ev_auto - delta, ev_auto, ev_auto + delta]
    exposure = [ev_auto - delta, ev_auto + delta]
    for ev in exposure:
        t = time.time()
        set_param('exposure', int(ev))
        delta_t = time.time() - t
        print("time: {0}".format(delta_t))
        time.sleep(1)
        name = 'image exposure :' + str(ev)
        images.append(img.copy())
        # EV = log2(f^2 / t)
        # et = math.pow(f, 2.0) / math.pow(2.0, ev)
        cv2.imshow(name, img.copy())

    exposure_times = np.array(exposure, dtype=np.float32)
    # debvec
    merge_debvec = cv2.createMergeDebevec()
    hdr_debvec = merge_debvec.process(images, times=exposure_times.copy())
    # robertson
    merge_robertson = cv2.createMergeRobertson()
    hdr_robertson = merge_robertson.process(images,
                                            times=exposure_times.copy())

    tonemap1 = cv2.createTonemapDurand(gamma=2.2)
    res_debvec = tonemap1.process(hdr_debvec.copy())
    tonemap2 = cv2.createTonemapDurand(gamma=1.3)
    res_robertson = tonemap2.process(hdr_robertson.copy())

    #  mertens not
    merge_mertens = cv2.createMergeMertens()
    res_mertens = merge_mertens.process(images)

    cv2.imshow('debvec', res_debvec)
    cv2.imshow('robertson', res_robertson)
    cv2.imshow('mertens', res_mertens)

    while True:
        key = cv2.waitKey(1) & 0xff
        if key == ord('q'):
            break
Пример #4
0
def CRF_merge_Robertson(paths, exposures):
    # Loading exposure images into a list
    img_fn = paths
    img_list = [cv.imread(str(fn)) for fn in img_fn]
    exposure_times = np.array(exposures, dtype=np.float32)

    # Merge exposures to HDR image
    merge_Robertson = cv.createMergeRobertson()
    hdr_Robertson = merge_Robertson.process(img_list,
                                            times=exposure_times.copy())

    # Tonemap HDR image
    tonemap = cv.createTonemapMantiuk()
    res_Robertson = tonemap.process(hdr_Robertson.copy())

    # Convert datatype to 8-bit and save
    res_Robertson_8bit = np.clip(res_Robertson * 255, 0, 255).astype('uint8')
    cv.imwrite("img/LDR_robertson.jpg", res_Robertson_8bit)
Пример #5
0
import cv2 as cv
import numpy as np

# Loading exposure images into a list
img_fn = ["img0.jpg", "img1.jpg", "img2.jpg", "img3.jpg"]
img_list = [cv.imread(fn) for fn in img_fn]
exposure_times = np.array([15.0, 2.5, 0.25, 0.0333], dtype=np.float32)

# Merge exposures to HDR image
merge_debevec = cv.createMergeDebevec()
hdr_debevec = merge_debevec.process(img_list, times=exposure_times.copy())
merge_robertson = cv.createMergeRobertson()
hdr_robertson = merge_robertson.process(img_list, times=exposure_times.copy())

# Tonemap HDR image
tonemap1 = cv.createTonemap(gamma=2.2)
res_debevec = tonemap1.process(hdr_debevec.copy())
tonemap2 = cv.createTonemap(gamma=1.3)
res_robertson = tonemap2.process(hdr_robertson)

# Exposure fusion using Mertens
merge_mertens = cv.createMergeMertens()
res_mertens = merge_mertens.process(img_list)

# Convert datatype to 8-bit and save
res_debevec_8bit = np.clip(res_debevec * 255, 0, 255).astype('uint8')
res_robertson_8bit = np.clip(res_robertson * 255, 0, 255).astype('uint8')
res_mertens_8bit = np.clip(res_mertens * 255, 0, 255).astype('uint8')
cv.imwrite("hdr_debevec.jpg", res_debevec_8bit)
cv.imwrite("hdr_robertson.jpg", res_robertson_8bit)
cv.imwrite("fusion_mertens.jpg", res_mertens_8bit)
Пример #6
0
def recover_camera_response(inputFolder = '.', 
		exposureListFile = None,
    	outputResponseCurve = "camera_response.spi1d",
    	outputResponseFormat = "spi1d",
    	calibrationApproach = "berkeley",
    	mergeExposures = False,
    	mergedExposuresOutput = None,
    	verbose = False,
    	robertsonMaxIter = 30.0,
    	robertsonThreshold = 0.01,
    	berkeleyLambda = 20.0,
    	berkeleySamples = 1024,
    	berkeleySamplePlacementRandom = False):
	extensions = generalExtensions

	if exposureListFile:
		with open(exposureListFile, 'r') as f:
			exposuresList = f.readlines()

		exposuresList = [x.strip() for x in exposuresList if len(x) > 1]

		imageUris = [x.split(' ')[0] for x in exposuresList]		
		exposure_times = [1.0/float(x.split(' ')[1]) for x in exposuresList]

	else:		
		imageUris = sorted( os.listdir( inputFolder ) )
		imageUris = [x for x in imageUris if (os.path.splitext(x)[-1].lower()[1:] in extensions) and (x[0] != '.')]

		if verbose:
			print( imageUris )

		cwd = os.getcwd()
		os.chdir( inputFolder )

		exposure_times = [0]*len(imageUris)
		for i in range(len(imageUris)):
			exposure_times[i] = getShutterSpeed( imageUris[i], verbose=verbose )

	# List has to be sorted from longest shutter speed to shortest for opencv functions to work
	exposure_times, imageUris = (list(x) for x in zip(*sorted(zip(exposure_times, imageUris))))
	imageUris.reverse()

	exposure_times.reverse()
	exposure_times = np.array(exposure_times, dtype=np.float32)

	if verbose:
		for exposure in zip(exposure_times, imageUris):
			print( "Image : %s, Shutter speed : %2.6f" % (exposure[1], exposure[0]) )

	img_list = [cv2.imread(fn) for fn in imageUris ]

	if not exposureListFile:
		os.chdir( cwd )

	if calibrationApproach == "robertson":
		merge = cv2.createMergeRobertson()
		calibrate = cv2.createCalibrateRobertson()

		calibrate.setMaxIter(robertsonMaxIter)
		calibrate.setThreshold(robertsonThreshold)

		if verbose:
			print( calibrationApproach )
			print( "\tmax iter  : %d" % robertsonMaxIter )
			print( "\tthreshold : %f" % robertsonThreshold )
	else:
		merge = cv2.createMergeDebevec()
		calibrate = cv2.createCalibrateDebevec()

		calibrate.setLambda(berkeleyLambda)
		calibrate.setSamples(berkeleySamples)
		calibrate.setRandom(berkeleySamplePlacementRandom)

		if verbose:
			print( calibrationApproach )
			print( "\tlambda    : %3.2f" % berkeleyLambda )
			print( "\tsamples   : %d" % berkeleySamples )
			print( "\trandom    : %s" % berkeleySamplePlacementRandom )

	if verbose:
		print( "recovering camera response" )

	curve = calibrate.process(img_list, times=exposure_times)

	if verbose:
		print( "writing camera response - %s, %s" % (outputResponseFormat, outputResponseCurve) )

	if outputResponseFormat == "spi1d":
		with open(outputResponseCurve, "w") as f:
			f.write( "Version 1\n" )
			f.write( "From 0.000000 1.000000\n" )
			f.write( "Length 256\n" )
			f.write( "Components 3\n" )
			f.write( "{\n" )
			for i in range(len(curve)):
			    f.write( "%3.6f %3.6f %3.6f\n" % (curve[i][0][0]*0.18, curve[i][0][1]*0.18, curve[i][0][2]*0.18) )
			f.write( "}\n" )
	else:
		with open(outputResponseCurve, "w") as f:
			for i in range(len(curve)):
			    f.write( "%3.6f %3.6f %3.6f\n" % (curve[i][0][0], curve[i][0][1], curve[i][0][2]) )

	if mergedExposuresOutput:
		if verbose:
			print( "merging exposures" )

		hdr = merge.process(img_list, times=exposure_times.copy(), response=curve.copy())
		cv2.imwrite(mergedExposuresOutput, hdr)
Пример #7
0
import cv2
import numpy as np

# 第一阶段只是将所有图像加载到列表中。此外,我们将需要常规HDR算法的曝光时间。注意数据类型,因为图像应为1通道或3通道8位(np.uint8),曝光时间需要为float32,以秒为单位。
# Loading exposure images into a list
img_fn = ["1tl.jpg", "2tr.jpg", "3bl.jpg", "4br.jpg"]
img_list = [cv2.imread(fn) for fn in img_fn]
exposure_times = np.array([15.0, 2.5, 0.25, 0.0333], dtype=np.float32)

# Merge exposures to HDR image
# 在这个阶段,我们将曝光序列合并成一个HDR图像,显示了我们在OpenCV中的两种可能性。第一种方法是Debvec,第二种是Robertson。请注意,HDR图像的类型为float32,而不是uint8,因为它包含所有曝光图像的完整动态范围。

merge_debvec = cv2.createMergeDebevec()
hdr_debvec = merge_debvec.process(img_list, times=exposure_times.copy())
merge_robertson = cv2.createMergeRobertson()
hdr_robertson = merge_robertson.process(img_list, times=exposure_times.copy())

# Tonemap HDR image
# 我们将32位浮点HDR数据映射到范围[0..1]。实际上,在某些情况下,值可能大于1或低于0,所以注意我们以后不得不剪切数据,以避免溢出。
tonemap1 = cv2.createTonemapDurand(gamma=2.2)
res_debvec = tonemap1.process(hdr_debvec.copy())
tonemap2 = cv2.createTonemapDurand(gamma=1.3)
res_robertson = tonemap2.process(hdr_robertson.copy())

# Exposure fusion using Mertens
# 这里我们展示了一种可以合并曝光图像的替代算法,我们不需要曝光时间。我们也不需要使用任何tonemap算法,因为Mertens算法已经给出了[0..1]范围内的结果。
merge_mertens = cv2.createMergeMertens()
res_mertens = merge_mertens.process(img_list)

# Convert datatype to 8-bit and save
    images, exposTimes = alignment.process(image_list,exposTimes,'SIFT')

    print(len(images))

    exposTimes = np.array(exposTimes,dtype=np.float32) #convert to numpy float
    # print('exposure time:', exposTimes)

    # restore camera response
    calibrateDebevec = cv2.createCalibrateDebevec()
    responseDebevec = calibrateDebevec.process(images, times=exposTimes)  #获得CRF
    mergeDebevec = cv2.createMergeDebevec()
    hdrDebevec = mergeDebevec.process(images, times=exposTimes.copy(), response=responseDebevec.copy())
    #
    # calibrateRobertson = cv2.createCalibrateRobertson()
    # responseRobertson = calibrateRobertson.process(images, times=exposTimes)
    mergeRobertson = cv2.createMergeRobertson()
    hdrRobertson = mergeRobertson.process(images, times=exposTimes.copy())#, response=responseRobertson.copy())


    hdrMyDebevec = Debevec.process(images, exposTimes)

    myRobHdr = Robertson.Robertson()
    hdrMyRobertson = myRobHdr.process(images, exposTimes)

    # # Save HDR image.
    cv2.imwrite("./res/deb/hdrDebevec.hdr", hdrDebevec)
    cv2.imwrite("./res/rob/hdrRobertson.hdr", hdrRobertson)
    cv2.imwrite("./res/MyDeb/hdrMyDebevec.hdr", hdrMyDebevec)
    cv2.imwrite("./res/MyRob/hdrMyRobertson.hdr", hdrMyRobertson)