解析hdr图像文件的python实现
如题
import cv2
import numpy as np
def rgbe2float(rgbe):
res = np.zeros((rgbe.shape[0],rgbe.shape[1],3))
p = rgbe[:,:,3]>0
m = 2.0**(rgbe[:,:,3][p]-136.0)
res[:,:,0][p] = rgbe[:,:,0][p] * m
res[:,:,1][p] = rgbe[:,:,1][p] * m
res[:,:,2][p] = rgbe[:,:,2][p] * m
return res def readHdr(fileName = 'belgium.hdr'):
fileinfo = {}
with open(fileName, 'rb') as fd:
tline = fd.readline().strip()
if len(tline)<3 or tline[:2] != '#?':
print 'invalid header'
return
fileinfo['identifier'] = tline[2:] tline = fd.readline().strip()
while tline:
n = tline.find('=')
if n>0:
fileinfo[tline[:n].strip()] = tline[n+1:].strip()
tline = fd.readline().strip() tline = fd.readline().strip().split(' ')
fileinfo['Ysign'] = tline[0][0]
fileinfo['height'] = int(tline[1])
fileinfo['Xsign'] = tline[2][0]
fileinfo['width'] = int(tline[3]) data = [ord(d) for d in fd.read()]
height, width = fileinfo['height'], fileinfo['width']
if width<8 or width>32767:
data.resize((height, width, 4))
return rgbe2float(data) img = np.zeros((height, width, 4))
dp = 0
for h in range(height):
if data[dp] !=2 or data[dp+1]!=2:
print 'this file is not run length encoded'
print data[dp:dp+4]
return
if data[dp+2]*256+ data[dp+3] != width:
print 'wrong scanline width'
return
dp += 4
for i in range(4):
ptr = 0
while(ptr < width):
if data[dp]>128:
count = data[dp]-128
if count==0 or count>width-ptr:
print 'bad scanline data'
img[h, ptr:ptr+count,i] = data[dp+1]
ptr += count
dp += 2
else:
count = data[dp]
dp += 1
if count==0 or count>width-ptr:
print 'bad scanline data'
img[h, ptr:ptr+count,i] = data[dp: dp+count]
ptr += count
dp +=count
return rgbe2float(img)
if __name__ == '__main__':
m = readHdr()
m1,m2 = m.max(), m.min()
img = (m-m2)/(m1-m2)
m1 = m[:,:,0].copy(); m[:,:,0] = m[:,:,2]; m[:,:,2]=m1
cv2.imwrite('tmp.jpg', img*255)
解析hdr图像文件的python实现的更多相关文章
- Xml解析之——Java/Android/Python
Xml解析之——Java/Android/Python 一.Xml文件 test.xml <note> <to>George</to> <from>Jo ...
- 解析prototxt文件的python库 prototxt-parser(使用parsy自定义文件格式解析)
解析prototxt文件的python库 prototxt-parser https://github.com/yogin16/prototxt_parser https://test.pypi.or ...
- 解析搜狗词库(python)
#!/usr/bin/python # -*- coding: utf-8 -*- import struct import sys import binascii import pdb #搜狗的sc ...
- julia与python中的列表解析.jl
julia与python中的列表解析.jl #=julia与python中的列表解析.jl 2016年3月16日 07:30:47 codegay julia是一门很年轻的科学计算语言 julia文档 ...
- Python网页解析
续上篇文章,网页抓取到手之后就是解析网页了. 在Python中解析网页的库不少,我最开始使用的是BeautifulSoup,貌似这个也是Python中最知名的HTML解析库.它主要的特点就是容错性很好 ...
- 精通 Oracle+Python,第 3 部分:数据解析
进行数据解析的理由不计其数,相关的工具和技巧也同样如此.但是,当您需要用这些数据做一些新的事情时,即使有“合适的”工具可能也是不够的.这一担心对于异类数据源的集成同样存在.用来做这项工作的合适工具迟早 ...
- Python自动化运维之7、生成器、迭代器、列表解析、迭代器表达式
迭代器和生成器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外 ...
- Python中第三方的用于解析HTML的库:BeautifulSoup
背景 在Python去写爬虫,网页解析等过程中,比如: 如何用Python,C#等语言去实现抓取静态网页+抓取动态网页+模拟登陆网站 常常需要涉及到HTML等网页的解析. 当然,对于简单的HTML中内 ...
- python批量解析域名a记录
#encoding:utf-8 import requests import json import dns.resolver import sys reload(sys) sys.setdefaul ...
随机推荐
- BZOJ1177:[APIO2009]Oil(枚举,前缀和)
Description 采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井.被拍卖的整块土地为一个矩形区域,被划分为M×N个小块. Siruseri地质 ...
- 文件断点上传,html5实现前端,java实现服务器
断点上传能够防止意外情况导致上传一半的文件下次上传时还要从头下载,网上有很多关于断点的实现,这篇文章只是从前到后完整的记录下一个可用的实例,由于生产环境要求不高,而且就是提供给一两个人用,所以我简化了 ...
- (转)进程process和线程thread的关系
写的很好很明白cpu每次只能执行一个进程,所以其他进程会挂起 在一个进程中,允许存在n个线程,n个线程共享这个进程中的资源 多个线程在共享的时候存在资源互斥,一次只能一个线程,会需要加锁 一次存在固定 ...
- [LuoguP2403][SDOI2010]所驼门王的宝藏
题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...
- ASP.NET如何批量保存动态生成的文本框?
对于OA系统,表单签核功能必不可少.而根据公司的情况,表单自然又五花八门,所以就要求能够让用户自己建立表单并设定表单的流程.填写内容等等.我之前写过一篇文章[地址:pivot的用法(SQL SERVE ...
- Web | ES6的异步编程
js对于异步操作有三个解决方案,分别是Promise,generator,async/await. 下面分别说说这三种方案的一些基础. Promise promise对象用于表示一个异步操作的最终状态 ...
- iOS之利用腾讯Bugly程序调试,测试代码bug、卡顿等情况
1.自己先写一个 Demo 演示一下利用bugly测试崩溃的具体情况. 在ViewController里面实现崩溃代码如下: 运行后 毫无疑问程序报错了! 2.使用到第三方的框架Bugly,官方下载 ...
- js基础(闭包)
1. "闭包就是跨作用域访问变量." [示例一] var name = 'wangxi' function user () { // var name = 'wangxi' fun ...
- C++快速开发样本工程的建立--建立工程
因为QT建立工程清晰整洁,便于作为样板工程原型.采用QT 5.8.0 64位版本建立工程. 1.建立工程 打开VS2015 新建->新建项目->QT GUI Application -&g ...
- Mysql数据库-DAY2
查找 Select 字段(全部查找为*)from 表 增加 Insert into 字段(全部增加为表) values(需要增加的内容,用'','隔开') 删除 Delete from 表 where ...