通过python有两种方式读取图像的像素数据:

创建分析图像的节点(比如,MinColor, CurveTool),执行,然后读取其结果的knob数值

sample方法可以直接抽样节点的像素。

使用CurveTool

创建CurveTool节点,执行后删除,并显示其分析结果:

noise = nuke.createNode('Noise')

noise['zoffset'].setExpression( 'frame*100 ' )

ct = nuke.createNode('CurveTool')

nuke.execute( ct, nuke.frame(), nuke.frame() )

dat = ct['intensitydata'].value()

nuke.delete(ct)

nuke.message( 'average luminance is %s' % dat )

使用sample方法

创建Noise节点,在x=500,y=600抽样红色通道,并输出:

noise = nuke.createNode('Noise')

print noise.sample('red', 500, 600)

下面代码结果一样:

print nuke.sample(noise, 'red', 500, 600)

例子

getMinMax

此工具可以抽取通道中的最大最小值。最近nuke的python api中没有现成的方法,一般利用MinColor的功能来实现。因此工作流中创建一

些临时节点,在当前帧上执行(为我们计算),然后删除。

刚开始,先创建一个测试方案:创建Ramp节点,将Grade节点挂到上面。确保Grade的black clamp knob禁止,然后可以用任意值来测试lift和gain knob。

创建MinColor节点,挂到Grade节点,MinColor的channels knob设置成默认rgba就行,调整其他knob。当目标knob被设置为0时,在当前

帧执行。输入节点的rgba层的delta knob保存了最小值。delta knob的值和你在Grade节点的lift knob的值很接近,但为负的。

想获取最大值,那么反转图像先,使用MinColor节点再走一边上面的流程。

反转图像意味着像素值从1到1-x,需要给delta knob加上1才能获得原始图像的最大值(方法很多)

现在知道怎么获取最大最小值。删除MinColor,反转节点,写一段脚本来干此事。

先从DAG图中抓取Grade1节点,然后添加MinColor节点,其target knob通过python设置为0:

srcNode = nuke.toNode('Grade1')

nuke.nodes.MinColor( target=0 )

其toNode()可以直接获取DAG中的节点。nuke.nodes可以替代nuke.createNode()方法。不同之处在于createNode()和从菜单创建是一样

的。这意味着:

将选择的焦点切换到新节点

尝试链接新节点

自动给新节点定位

挂起当前视图缓冲区

打开默认panel控制面板

nuke.nodes就不是手工操作了,创建节点后,啥也不改变。我们要创建临时节点,后面还要删除,这样用户的节点图就不会因为临时节点

改变。麻烦就是需要手工链接新节点:

srcNode = nuke.toNode('Grade1')

nuke.nodes.MinColor( target=0, inputs=[srcNode])

inputs参数接收一个列表,因为会有多输入。这样,可以一次将其全部链接。

现在需要赋一个参数来定义不需要分析的通道,同时我们不想限制到rgba上。将新节点赋值给变量,随后可以在代码中使用:

srcNode = nuke.toNode('Grade1')

channel = 'rgba.red'

MinColor = nuke.nodes.Mincolor( channels=channel, target=0, inputs=[srcNode])

上面的代码仅分析red通道。

现在创建新MinColor,并反转图像,确保链接对应的输入,并在对应的通道上工作(或许想删除前面的临时节点):

srcNode = nuke.toNode('Grade1')

channel = 'rgba.red'

MinColor = nuke.nodes.MinColor( channels = channel, target=0, inputs=[srcNode] )

Inv = nuke.nodes.Invert( channels = channel, inputs=[srcNode])

MaxColor = nuke.nodes.MinColor( channels = channel, target=0, inputs[Inv] )

结果如下:

现在,节点树已有,执行MinColor节点来获取我们所需。nuke.execute()来办事:

curFrame = nuke.frame()

nuke.execute( MinColor, curFrame, curFrame)

可以看到,需要给节点提供起始帧作为参数,可以用FrameRanges对象替代。在pixeldelta knob中可以找到最小颜色。记得取反才是正确值。

minV = -MinColor['pixeldelta'].value()

现在第二个MinColor干一样的事情,连接到Invert节点(我们存在了MaxColor里面),记得给结果加上1来取得真正的最大值:

nuke.execute(MaxColor, curFrame, curFrame)

maxV = MaxColor['pixeldelta'].value() + 1

现在是清理时间,让我们删除这些节点:

for n in ( MinColor, MaxColor, Inv ):

nuke.delete(n)

完成代码如下:

srcNode = nuke.toNode(' Grade1')

channel = 'rgba.red'

MinColor = nuke.nodes.MinColor( channels=channel, target=0, inputs=[srcNode] )

Inv = nuke.nodes.Invert( channels = channel, inputs= [srcNode])

MaxColor = nuke.nodes.MinColor( channels =channel, target=0, inputs=[Inv] )

curFrame = nuke.frame()

nuke.execute( MinColor, curFrame, curFrame)

minV = -MinColor['pixeldelta'].value()

nuke.execute( MaxColor, curFrame, curFrame)

maxV = MaxColor['pixeldelta'].value + 1

for n in ( MinColor, MaxColor, Inv):

nuke.delete(n)

将代码封装成函数,参数为node和channel,默认分析深度通道:

import nuke

def getMinMax( srcNode, channel='depth.Z' ):

'''

Return the min and max values of a given node's image as a tuple

args:

srcNode - node to analyse

channels - channels to analyse. This can either be a channel or layer name

'''

MinColor = nuke.nodes.MinColor( channels=channel, target=0, inputs=[srcNode] )

Inv = nuke.nodes.Invert( channels=channel, inputs=[srcNode])

MaxColor = nuke.nodes.MinColor( channels=channel, target=0, inputs=[Inv] )

curFrame = nuke.frame()

nuke.execute( MinColor, curFrame, curFrame )

minV = -MinColor['pixeldelta'].value()

nuke.execute( MaxColor, curFrame, curFrame )

maxV = MaxColor['pixeldelta'].value() + 1

for n in ( MinColor, MaxColor, Inv ):

nuke.delete( n )

return minV, maxV

将次模块放到插件路径下,用black 和white点创建Grade节点,并设置为深度通道的最大最小值,其会自动归一化:

minV, maxV = getMinMax(nuke.selectedNode())

grade =nuke.createNode('Grade')

grade['blackpoint'].setValue(minV)

grade['whitepoint'].setValue(maxV)

更加简洁的做法:

nuke.createNode('Grade', 'channels depth.Z blackpoint %s whitepoint %s' % examples.getMinMax(nuke.selectedNode()))

使用Sample

下面是一个LUT的例子:

import nuke

def getLUT( size=1024 ):

'''

Get the current viewer process node and generate a simple lut from it

args:

size - size of resulting lut (default=1024)

'''

vpNode = nuke.ViewerProcess.node()

vp = eval( 'nuke.nodes.%s()' % vpNode.Class() )

_copyKnobsFromScriptToScript( vpNode, vp )

ramp = nuke.nodes.Ramp()

ramp['p0'].setValue( (0, 0) )

ramp['p1'].setValue( (size, 0) )

vp.setInput(0, ramp )

saturation = nuke.nodes.Saturation( saturation = 0 )

saturation.setInput(0, vp )

lut = [ saturation.sample("rgba.red", i+.5, 0.5) for i in xrange( 0, size )]

nuke.delete( saturation )

nuke.delete( ramp )

nuke.delete( vp )

return lut

def createLutNode( lut ):

'''

Create a ColorLookup node to hold lut. The values are normalised.

args:

lut - list of floating point numbers

'''

lutNode = nuke.createNode( 'ColorLookup' )

lutKnob = lutNode['lut']

for i, y in enumerate( lut ):

x = float(i) / len(lut)

lutKnob.setValueAt( y, x )

def _copyKnobsFromScriptToScript( srcNode, trgNode):

'''

Copy knobs between nodes.

This function can also be found in the default menu.py

args:

srcNode - node to copy values from

trgNode - node to copy values to

'''

srcKnobs = srcNode.knobs()

trgKnobs = trgNode.knobs()

excludedKnobs = ["name", "xpos", "ypos"]

intersection = dict([ (item, srcKnobs[ item ]) for item in srcKnobs.keys() if item not in excludedKnobs and trgKnobs.has_key( item ) ])

for k in intersection.keys():

trgNode[ k ].fromScript( srcNode[ k ].toScript() )

python读取图像数据流_【NUKE教程】Nuke Python 获取图像数据相关推荐

  1. python读取图像数据流_浅谈TensorFlow中读取图像数据的三种方式

    本文面对三种常常遇到的情况,总结三种读取数据的方式,分别用于处理单张图片.大量图片,和TFRecorder读取方式.并且还补充了功能相近的tf函数. 1.处理单张图片 我们训练完模型之后,常常要用图片 ...

  2. python读取tiff影像_科学网—利用python GDAL库读写geotiff格式的遥感影像方法 - 张伟的博文...

    (1)利用python GDAL库读写geotiff格式的遥感影像方法,具有很好的参考价值,不错! from osgeo import gdal import numpy as np def read ...

  3. python微信跳一跳_[小白教程] 用Python占领微信跳一跳排行榜

    文/帅朋 微信新版 6.6.1 加入了「跳一跳」这个游戏功能,并迅速在朋友圈之间火了起来.很多人为了能够跳到更高的分数而努力的奋斗着.那么今天我就来蹭一蹭「跳一跳」的热度,给大家提供一个方法让你快速的 ...

  4. python安卓app开发_[实例教程] 用python开发android应用

    Python是动态语言,比较简洁.Android不直接支持使用python开发应用,需要使用其它中间件或者库.PythonForAndroid提供了在android平台上对python语言的支持:CL ...

  5. python 检测图像圆弧_基于OpenCV和Python的图像圆弧检测

    尝试以下代码:它将检测所有圆.曲线和圆弧:int main() { //RANSAC //load edge image cv::Mat color = cv::imread("../cir ...

  6. python 读取excel图片_如何用Python读取Excel中图片?

    公众号: 早起Python 作者:刘早起 大家好,在使用Python进行办公自动化操作时,一定少不了与Excel表格的交互,我们通常是用pandas处理表格数据,但大多数情况下,都是读取表格中的数值进 ...

  7. 怎么用python读取excel图_如何用Python读取Excel中图片?

    公众号: 早起Python 作者:刘早起 大家好,在使用Python进行办公自动化操作时,一定少不了与Excel表格的交互,我们通常是用pandas处理表格数据,但大多数情况下,都是读取表格中的数值进 ...

  8. 图像处理基础 || (一) python 读取图像的常用方式

    python 读取图像的常用方式 图像的读取与保存是图像处理或计算机视觉领域中最基本的操作,python中有众多的库支持图像的读取.显示与存储,常用的库包括 matplotlib.skimage 和 ...

  9. python读取图像的几种方式

    python读取图像的几种方式 本文介绍几种基于python的图像读取方式: 基于PIL库的图像读取.保存和显示 基于opencv-python的图像读取.保存和显示 基于matplotlib的图像读 ...

最新文章

  1. DB-MySQL:MySQL 事务
  2. 下图为双总线结构机器的数据通路_图像采集卡常见的三种总线结构
  3. Java延迟加载建议
  4. 【iOS 开发】基本 UI 控件详解 (UIButton | UITextField | UITextView | UISwitch)
  5. linux双显卡配置_Linux系统怎么配置双显卡?
  6. sharding-sphere按月动态分表
  7. 55种数据可视化开源工具_8种出色的开源数据可视化工具
  8. html登陆l判断,html作业登陆界面
  9. 《JAVA 语言程序设计基础篇》chapter 5 方法
  10. C++ STL string字符串内容修改和替换
  11. 大漠为什么不支持win10_Win10系统注册使用大漠插件的方法与设置!常见错误0x8002801...
  12. ZFAKA-自动发卡收款平台全套搭建教程(含支付接口设置)
  13. Flash Player教育版是什么?和普通版有何区别?
  14. TI DSP TMS320C66x学习笔记之TI Imglib库相关函数(四)
  15. bc伐木机器人_1+X | 工业机器人操作编程平台(HB-CZBC-C10)
  16. 怎样使用ADO.NET连接数据库
  17. 蒙提霍尔问题及其推广
  18. 查看电脑内存个数、主频(工作频率)、容量、位宽等的方法总结
  19. 栅栏加密解密的分析和实现
  20. hqchartPy2指标选股 - KDJ选股

热门文章

  1. 【IDEA】IDEA使用有道翻译引擎—详细配置步骤
  2. 【SDG代码精读】More Control for Free! Image Synthesis with Semantic Diffusion Guidance【SDG】
  3. python获取梦幻西游鼠标偏移坐标
  4. Mac使用之 数码测色计
  5. OpenShift集群完善及创建应用CakePHP
  6. 通信及信号处理领域期刊影响因子、分区及期刊推荐
  7. 特征值和特征向量在现代控制理论的简单应用
  8. Fuzz:Fuzz测试方法介绍
  9. jdbc:oracle:thin:@192.168.3.98:1521:orcl(简单介绍)
  10. Opencv-python 视频跟踪