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 文件对图像加滤镜的更多相关文章

  1. 纯Python给ulaw wav文件加头

    最近在处理wav相关文件,碰见一工具产生的ualw文件不带header,顺手用python给wav格式文件加头处理,让普通播放器也能播放. (原文:http://www.cnblogs.com/ryh ...

  2. python实现图像加载与保存,窗口创建与销毁,图片常用属性,ROI,通道的分离与合并,对比度和亮度

    目录: (一)图像加载与保存 (二)图像显示窗口创建与销毁 (三)图片的常用属性的获取 (四)生成指定大小的矩形区域(ROI) (五)图片颜色通道的分离与合并 (六)两张图片相加,改变对比度和亮度 ( ...

  3. python中的pth文件作用

    python中有一个.pth文件,该文件的用法是: 首先xxx.pth文件里面会书写一些路径,一行一个. 将xxx.pth文件放在特定位置,则可以让python在加载模块时,读取xxx.pth中指定的 ...

  4. 第三章:Python基础の函数和文件操作实战

    本課主題 Set 集合和操作实战 函数介紹和操作实战 参数的深入介绍和操作实战 format 函数操作实战 lambda 表达式介绍 文件操作函数介紹和操作实战 本周作业 Set 集合和操作实战 Se ...

  5. 跟我一起学opencv 第一课之图像加载,修改,保存

    使用opencv前记得引入库和头文件: #include<opencv2\opencv.hpp> 1.加载图像(cv::imread)(OPENCV 支持 JPG,PNG,TIFF等常见格 ...

  6. python第六篇文件处理类型

    阅读目录 一 文件操作 二 打开文件的模式 三 操作文件的方法 四 文件内光标移动 五 文件的修改   文件处理                                             ...

  7. 【笔记】Python基础三:文件

    一,文件操作 (一),文件处理流程 1,打开文件,获得文件句柄(open函数提供)并赋值 2,通过句柄对文件进行操作 3,关闭句柄 f = open('陈粒',encoding='utf-8')#op ...

  8. python字符编码和文件处理

    一.了解字符编码的知识储备 1.文本编辑器存取文件的原理(nodepad++,python,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都是存放于内存中的,断 ...

  9. python 读写、创建 文件的方法(必看)

    python 读写.创建 文件的方法(必看) 更新时间:2016年09月12日 10:26:41 投稿:jingxian 我要评论下面小编就为大家带来一篇python 读写.创建 文件的方法(必看). ...

随机推荐

  1. java操作excel 工具类

    java操作excel 可参考https://blog.csdn.net/xunwei0303/article/details/53213130 直接上代码: 一.java生成excel文件: pac ...

  2. redis subscribe/publish(发布订阅)

    redis的发布端 package dubbo.wangbiao.project.pubsub; import org.apache.commons.pool2.impl.GenericObjectP ...

  3. Kubernetes集群部署笔记

    本作品由Galen Suen采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可.由原作者转载自个人站点. 概述 本文用于整理基于Debian操作系统使用kubeadm工具部署Kub ...

  4. IMO 2021 第 1 题拓展问题的两个极值的编程求解

    IMO 2021 第 1 题拓展问题的两个极值的编程求解 本篇是 IMO 2021 第一题题解及相关拓展问题分析 的续篇. 拓展问题三: (I). 求 n 的最小值,使得 n, n + 1, ..., ...

  5. 老司机带你体验SYS库多种新玩法

    导读 如何更加愉快地利用sys库做一些监控? 快来,跟上老司机,体验sys库的多种新玩法~ MySQL5.7的新特性中,非常突出的特性之一就是sys库,不仅可以通过sys库完成MySQL信息的收集,还 ...

  6. 痞子衡嵌入式:MCUXpresso Config Tools初体验(Pins, Clocks, Peripherals)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso Config Tools三大件(Pins, Clocks, Peripherals). 不知道大家有没有这样的感受 ...

  7. Java 学习:对象和类

    对象和类 从认识的角度考虑是先有对象后有类.对象,是具体的事物.类,是抽象的,是对对象的抽象. 从代码运行角度考虑是先有类后又对象.类是对象的模板. 对象:对象是类的一个实例,有状态和行为. 类:类是 ...

  8. IO和零拷贝

    I/O介绍 I/O主要为:网络IO(本质是socket文件读取).磁盘IO 每次IO,都要经由两个阶段: 第一步:将数据从文件先加载至内核内存空间(缓冲区),等待数据准备完成,时间较长 第二步:将数据 ...

  9. noip模拟37

    \(\color{white}{\mathbb{燕子来时青尚在,木荫遥看杏花菲,名之以:杏红}}\) 考场发现 \(t2\) 基本上是原题,\(t3\) 的套路见过,\(t4\) 像是并查集之类的算法 ...

  10. 方法重载(Override)

    什么是方法的重写(override 或 overwrite)? 子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作. 应用: 重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参 ...