Python 通过 .cube LUT 文件对图像加滤镜
Python 通过 .cube LUT 文件对图像加滤镜
一个好用的python给图片加滤镜的代码:
https://github.com/CKboss/PyApplyLUT
这个是对C++代码的封装, 并用上了openmp来并行处理, 速度很快, 4k图片加滤镜在本地测试也只要不到0.2秒.
需要编译一下. 依赖pybind11和eigen. 好在这两个库都是只包含头文件就能用的那种. 到官网下好源码(pybind11 2.7.1, eigen 3.4), 在CMakeLists中指明pybind11和eigen的路径, 编译一下即可.
得到.so文件后, 需要把它放到python能找到的地方. 这里就直接把路径写死了.
用法如下:
1 import cv2
2 import numpy as np
3 from pathlib2 import Path
4
5 import sys
6 # the path of .so where python can find it
7 sys.path.append("Q:/WorkSpace/bfood/lut-master/build/Debug")
8 from python.PyApplyLUT import PyApplyLUT
9 from python.lut_tools import cube_to_npy
10
11 INPUT_IMG = Path(r".\test\1.jpg")
12 LUT_FILE = Path(r".\test\1.cube")
13
14 # normlizer the input picture to 0~1
15 img = cv2.imread(INPUT_IMG.as_posix())
16 img = img / 255
17
18 # apply lut
19
20 # method 1 load lut from a .cube file
21 alut = PyApplyLUT(lut_file=LUT_FILE)
22 new_img = alut.apply_lut(img)
23 # recover to 0~255
24 new_img = new_img * 255
25 cv2.imwrite("./test/new_img_1.jpg",new_img)
26
27 # method 2 load lut from the np array
28 cubenpy = cube_to_npy(LUT_FILE)
29 alut = PyApplyLUT(lut_dim=32, lut_cube=cubenpy)
30 new_img = alut.apply_lut(img)
31 # recover to 0~255
32 new_img = new_img * 255
33 cv2.imwrite("./test/new_img_2.jpg",new_img)
效果图:
----->
有两种用法:
1. 使用.cube文件
滤镜(.cube)文件格式如下: 里面的值是0~1之间的
# Created by Adobe Lightroom plugin Export LUT (1.17.0)
LUT_3D_SIZE 32
DOMAIN_MIN 0.0 0.0 0.0
DOMAIN_MAX 1.0 1.0 1.0
0.000000 0.000000 0.000000
0.047791 0.000000 0.000000
0.080140 0.000000 0.000000
0.118013 0.000000 0.000000
0.169955 0.000000 0.000000
...
输入的图片也要归一化到0~1之间, 最后输出的时候要重新放大到0~255
2. 使用一个numpy的数组格试的滤镜文件
格式是3,32,32,32这样的数组, .cube转换到npy的代码如下:
def load_lut_file_to_input_cube(cube_path,dim=None):
with open(cube_path,'r') as f:
lines = f.readlines()
for i in range(len(lines)):
lines[i] = lines[i].strip()
if dim is None:
if 'LUT_3D_SIZE' in lines[i]:
dim = int(lines[i].split(' ')[-1])
lines = lines[-dim*dim*dim:]
cube = np.zeros((3,dim,dim,dim),dtype=np.float32)
for i in range(0,dim):
for j in range(0,dim):
for k in range(0,dim):
n = i * dim*dim + j * dim + k
line = lines[n].split(' ')
x = line
try:
cube[0,i,j,k] = float(x[0]) # r
cube[1,i,j,k] = float(x[1]) # g
cube[2,i,j,k] = float(x[2]) # b
except Exception:
print(lines[n])
cube = np.array(cube,dtype=np.float32)
return cube
Python 通过 .cube LUT 文件对图像加滤镜的更多相关文章
- 纯Python给ulaw wav文件加头
最近在处理wav相关文件,碰见一工具产生的ualw文件不带header,顺手用python给wav格式文件加头处理,让普通播放器也能播放. (原文:http://www.cnblogs.com/ryh ...
- python实现图像加载与保存,窗口创建与销毁,图片常用属性,ROI,通道的分离与合并,对比度和亮度
目录: (一)图像加载与保存 (二)图像显示窗口创建与销毁 (三)图片的常用属性的获取 (四)生成指定大小的矩形区域(ROI) (五)图片颜色通道的分离与合并 (六)两张图片相加,改变对比度和亮度 ( ...
- python中的pth文件作用
python中有一个.pth文件,该文件的用法是: 首先xxx.pth文件里面会书写一些路径,一行一个. 将xxx.pth文件放在特定位置,则可以让python在加载模块时,读取xxx.pth中指定的 ...
- 第三章:Python基础の函数和文件操作实战
本課主題 Set 集合和操作实战 函数介紹和操作实战 参数的深入介绍和操作实战 format 函数操作实战 lambda 表达式介绍 文件操作函数介紹和操作实战 本周作业 Set 集合和操作实战 Se ...
- 跟我一起学opencv 第一课之图像加载,修改,保存
使用opencv前记得引入库和头文件: #include<opencv2\opencv.hpp> 1.加载图像(cv::imread)(OPENCV 支持 JPG,PNG,TIFF等常见格 ...
- python第六篇文件处理类型
阅读目录 一 文件操作 二 打开文件的模式 三 操作文件的方法 四 文件内光标移动 五 文件的修改 文件处理 ...
- 【笔记】Python基础三:文件
一,文件操作 (一),文件处理流程 1,打开文件,获得文件句柄(open函数提供)并赋值 2,通过句柄对文件进行操作 3,关闭句柄 f = open('陈粒',encoding='utf-8')#op ...
- python字符编码和文件处理
一.了解字符编码的知识储备 1.文本编辑器存取文件的原理(nodepad++,python,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都是存放于内存中的,断 ...
- python 读写、创建 文件的方法(必看)
python 读写.创建 文件的方法(必看) 更新时间:2016年09月12日 10:26:41 投稿:jingxian 我要评论下面小编就为大家带来一篇python 读写.创建 文件的方法(必看). ...
随机推荐
- uwp 之资源的访问
访问image资源 ----------------------------------------------------------------------------- BitmapImage ...
- The Programmer's Oath程序员的誓言----鲍勃.马丁大叔(Bob Martin)
In order to defend and preserve the honor of the profession of computer programmers, I Promise that, ...
- cmd进入pycharm所创建的虚拟环境
进入cmd命令,进入虚拟环境所在文件夹.(pycharm每创建一个新项目就会创建一个虚拟环境,位于项目下venv下Script) E:\virtualenv\crawl1\Scripts>act ...
- mzy git学习,git协同开发忽略文档配置以及一些杂点(九)
回忆一个电脑多账户问题 之前也说了,如果使用ssh登陆的话,一个电脑就只能登陆一个账号了,不像通过凭据可以切换(但是其实也可以每次去生成新的公钥和私钥,只要你不嫌麻烦) 再次补充: ssh-keyge ...
- 初识cookie
package day01.cookies; import java.io.IOException; import java.net.URLDecoder; import java.net.URLEn ...
- 三大操作系统对比使用之·Ubuntu16.04
时间:2018-11-13 整理:byzqy 本篇是一篇个人对 Ubuntu 16.04(桌面版)使用方法.技巧以及应用推荐的文章,以便查询和分享! 打开终端: Ctrl+Alt+T,即可打开&quo ...
- 三大操作系统对比使用之·MacOSX
时间:2018-11-13 整理:byzqy 本篇是一篇个人对Mac系统使用习惯和应用推荐的分享,在此记录,以便后续使用查询! 打开终端: command+空格,调出"聚焦搜索(Spotli ...
- 手撕LRU缓存
面试官:来了,老弟,LRU缓存实现一下? 我:直接LinkedHashMap就好了. 面试官:不要用现有的实现,自己实现一个. 我:..... 面试官:回去等消息吧.... 大家好,我是程序员学长,今 ...
- Spring AOP框架 AspectJ
1 AspectJ简介 v AspectJ是一个基于Java语言的AOP框架 v Spring2.0以后新增了对AspectJ切点表达式支持 v @AspectJ 是AspectJ1.5新增功能 ...
- python 给多个变量赋值
# assign values directly a = b = 'hello' a, b = 1, 2 print(b, type(b)) assert a == 1 and b == 2 # as ...