Python進(jìn)行高動態(tài)圖像合成

數(shù)據(jù)準(zhǔn)備

首先踩蔚,我們準(zhǔn)備三張不同曝光的圖像,如下圖所示。

曝光時間0.05
曝光時間0.0125
曝光時間0.003125

利用幾個helper函數(shù)來從文件夾里讀取圖像和圖像的曝光時間。

import PIL.ExifTags
from PIL import Image
import cv2
import numpy as np
from libtiff import TIFF
from os import listdir
from os.path import isfile, isdir, join

#讀取文件夾下文件
def ListFiles(FilePath):
    onlyfiles = [f for f in listdir(FilePath) if isfile(join(FilePath, f))]
    return onlyfiles

#獲得圖像文件屬性
def get_exif(fn):
    img = Image.open(fn)
    exif = {PIL.ExifTags.TAGS[k]: v
            for k, v in img._getexif().items()
            if k in PIL.ExifTags.TAGS
            }
    return exif

#獲得圖像曝光時間
def get_exposure_time(fn):
    exif = get_exif(fn)
    exposure_time = exif.get('ExposureTime')
    return exposure_time[0]/exposure_time[1]

#獲取圖像曝光時間序列和圖像
def getImageStackAndExpos(folderPath):
    files = ListFiles(folderPath)
    exposTimes = []
    imageStack = []
    for file in files:
        filePath = join(folderPath,file)
        exposTime = get_exposure_time(filePath)
        currImage = cv2.imread(filePath)
        exposTimes.append(exposTime)
        imageStack.append(currImage)
    #根據(jù)曝光時間長短奈梳,對圖像序列和曝光時間序列重新排序
    index = sorted(range(len(exposTimes)), key=lambda k: exposTimes[k])
    exposTimes = [exposTimes[i] for i in index]
    imageStack = [imageStack[i] for i in index]
    return exposTimes,imageStack

預(yù)處理

由于上面的三張圖像在拍攝的時候存在一定的抖動和位移情況,可以用SIFT算法對其配準(zhǔn)Python進(jìn)行SIFT圖像對準(zhǔn)解虱。在配準(zhǔn)的時候攘须,首先需要找到一張曝光最好的照片作為基準(zhǔn)照片,下面的一個函數(shù)計算照片中曝光不足和曝光過量的像素個數(shù)殴泰,把曝光不足和曝光過量像素最少的圖像作為參考圖像于宙。

def getSaturNum(img):
    gray_image = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    underExpos=np.count_nonzero(gray_image==0)
    overExpos = np.count_nonzero(gray_image==255)
    return underExpos + overExpos


def getRefImage(imgStack):
    saturNum = imgStack[0].shape[0]*imgStack[0].shape[1]
    for imgIndex in np.arange(len(imgStack)):
        curImg = imgStack[imgIndex]
        curSaturNum = getSaturNum(curImg)
        print(curSaturNum)
        if curSaturNum <= saturNum:
            saturNum = curSaturNum
            refIndex = imgIndex

    return  refIndex

在獲得參考圖像以后,使用Python進(jìn)行SIFT圖像對準(zhǔn)中提供的siftImageAlignment進(jìn)行配準(zhǔn)悍汛,并且返回已經(jīng)對其的圖像序列限煞。

def siftAlignment(imgStack,refIndex):
    refImg = imgStack[refIndex]
    outStack = []
    for index in np.arange(len(imgStack)):
        if index == refIndex:
            outStack.append(refImg)
        else:
            currImg = imgStack[index]
            outImg,_,_ = siftImageAlignment(refImg,currImg)
            outStack.append(outImg)
    return outStack

HDR合成

為了合成HDR圖像,首先要擬合相機(jī)響應(yīng)函數(shù)(Camera Response Function员凝,CRF),關(guān)于擬合CRF的算法奋献,后續(xù)博客中將詳細(xì)介紹健霹,這里,我們先關(guān)注Opencv-Python的實現(xiàn)瓶蚂。

import numpy as np
import cv2
import Utility #Utility為前面函數(shù)所在的模塊

exposTimes,images = Utility.getImageStackAndExpos('stack_alignment')
refImgIndex= Utility.getRefImage(images)
images = Utility.siftAlignment(images,refImgIndex) 

exposTimes = np.array(exposTimes,dtype=np.float32) #需要轉(zhuǎn)化為numpy浮點數(shù)組
calibrateDebevec = cv2.createCalibrateDebevec(samples=120,random=True)  
###采樣點數(shù)120個糖埋,采樣方式為隨機(jī),一般而言窃这,采用點數(shù)越多瞳别,采樣方式越隨機(jī),最后的CRF曲線會越加平滑
responseDebevec = calibrateDebevec.process(images, exposTimes)  #獲得CRF
mergeDebevec = cv2.createMergeDebevec()
hdrDebevec = mergeDebevec.process(images, exposTimes, responseDebevec) #
# Save HDR image.
cv2.imwrite("hdrDebevec.hdr", hdrDebevec) 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杭攻,一起剝皮案震驚了整個濱河市祟敛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兆解,老刑警劉巖馆铁,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異锅睛,居然都是意外死亡埠巨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門现拒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辣垒,“玉大人,你說我怎么就攤上這事印蔬⊙埃” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長哥遮。 經(jīng)常有香客問我岂丘,道長,這世上最難降的妖魔是什么眠饮? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任奥帘,我火速辦了婚禮,結(jié)果婚禮上仪召,老公的妹妹穿的比我還像新娘寨蹋。我一直安慰自己,他們只是感情好扔茅,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布已旧。 她就那樣靜靜地躺著,像睡著了一般召娜。 火紅的嫁衣襯著肌膚如雪运褪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天玖瘸,我揣著相機(jī)與錄音秸讹,去河邊找鬼。 笑死雅倒,一個胖子當(dāng)著我的面吹牛璃诀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蔑匣,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼劣欢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了裁良?” 一聲冷哼從身側(cè)響起凿将,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎价脾,沒想到半個月后丸相,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡彼棍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年灭忠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片座硕。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡弛作,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出华匾,到底是詐尸還是另有隱情映琳,我是刑警寧澤机隙,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站萨西,受9級特大地震影響有鹿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谎脯,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一葱跋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧源梭,春花似錦娱俺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至烛愧,卻和暖如春油宜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怜姿。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工验庙, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人社牲。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像悴了,于是被迫代替她去往敵國和親搏恤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361