在python中调整颜色曲线,类似于GIMP

在python中调整颜色曲线,类似于GIMP,python,image-processing,computer-vision,bezier,Python,Image Processing,Computer Vision,Bezier,我正在尝试实现一些python代码来从图像数据集中分离一些特定的颜色。我已将Cr层与YCbCr颜色空间(1-dim np阵列)分离,现在我尝试在GIMP中应用类似的曲线过滤器: 我做了一些关于这个主题的研究,发现这里使用的是贝塞尔曲线。我试图探索曲线输出设置,但我无法理解它。我想要这个曲线所应用的效果,在以后的阶段中应用阈值。有没有一个简单的方法可以做到这一点?(我是这一领域的初学者)你想要的是: pdb.gimp_drawable_curves_spline(layer,HISTOGRAM_

我正在尝试实现一些python代码来从图像数据集中分离一些特定的颜色。我已将Cr层与YCbCr颜色空间(1-dim np阵列)分离,现在我尝试在GIMP中应用类似的曲线过滤器:


我做了一些关于这个主题的研究,发现这里使用的是贝塞尔曲线。我试图探索曲线输出设置,但我无法理解它。我想要这个曲线所应用的效果,在以后的阶段中应用阈值。有没有一个简单的方法可以做到这一点?(我是这一领域的初学者)

你想要的是:

pdb.gimp_drawable_curves_spline(layer,HISTOGRAM_VALUE,8,[0, 0, 0.37477797513321481, 0.12890625, 0.62344582593250431, 0.8828125, 1, 1])
戏法 您可以让Gimp确定值:

使用GUI并在示例上应用曲线工具:

在上图中,请注意顶部的“预设”选择器。每次应用过滤器时,Gimp都会保存曲线,您可以使用选择器检索曲线。默认情况下,曲线是匿名的(仅带有时间戳),但您也可以为其命名(单击
+
按钮)

这些值保存在Gimp配置文件中的文件中。在Gimp 2.10中,这个文件是
${Gimp profile}/filters/GimpCurvesConfig.settings
。如果您编辑它(您的编辑器可能需要支持长行),您将看到:

# settings

(GimpCurvesConfig "2019-11-08 21:57:15"
    (time 1573246635)
    (linear no)
    (channel value)
    (curve
        (curve-type smooth)
        (points 8 0 0 0.37477797513321481 0.12890625 0.62344582593250431 0.8828125 1 1)
        (point-types 4 smooth smooth smooth smooth)

    [...snip...]
感兴趣的行是以
(点…
)开头的行。您只需转换:

(points 8 0 0 0.37477797513321481 0.12890625 0.62344582593250431 0.8828125 1 1)
进入:

很难再容易了

注:


术语“贝塞尔曲线”在这里是相当偶然的。这只是软件平滑曲线的一种方法,但您只设置了定位点。重要的是,您可以定义通道自身的函数:
newChannelValue=f(oldChannelvalue)
并定义
f()

非常感谢您的回复。我只想澄清一下这条线
pdb.gimp_drawable_curves_spline(layer,HISTOGRAM_VALUE,8,[0,0,0.3747779751332481,0.12890625,0.62344582593250431,0.8828125,1,1])
我如何使用它,或者类似于python中的东西?这是对gimp API的python调用,以实现与手动曲线编辑等效的功能。当然,您必须将其插入Gimp插件或Gimp批处理脚本中,我假设您知道如何操作。有与其他图形库相同的解决方案。请看答案中的更多提示。对不起,我对GIMP插件或这类东西不太了解。你能给我一些关键字,让我可以用谷歌搜索吗?谷歌“Gimp python插件”。有关批处理脚本示例,请参见。谢谢。所以我所理解的是,这一切都发生在gimp内部。实际上,我正试图在我的jupyter笔记本中应用该曲线,因为我需要在对象检测项目中进行编辑。我们不能直接在jupyter中使用它而不需要gimp吗?(只是从中获取所需的值)。我不知道做你提到的事情是否会让我最终得到jupyter的输出,以便进一步处理。我说的对吗?你是在问“如何在标准Python中实现这样的曲线”,还是在问如何使用Python与Gimp对话?“如何在标准Python中实现这样的曲线”在这种情况下,主要的重要部分是实现曲线缩放本身,因此,为了了解您要问的初学者的级别:您是否已经编写了缩放代码,并且您只是在寻找仍然缺少的实际函数f(x)=y(在[0,1]中获取输入,在[0,1]中生成输出),但您已经使用诸如
defy(x):x
之类的普通函数对其进行了测试,或者你还没有开始写代码吗?我知道用python编写代码请注意,从技术上讲,你所问的根本不是图像处理,只是数字映射,所以如果你已经基于与图像处理相关的假设进行了搜索,您可能错过了许多其他有用的SO答案和google/duckduckgo/etc结果。你所看到的函数有两个简单的钳制区域(例如,f(x)=0在某些x=b处),因此这是两个参数,其余的可以是将[0,1]映射到[0,1]的任何函数,因此如果你想让它成为贝塞尔,你还有两个自由度。
... 8,[0, 0, 0.37477797513321481, 0.12890625, 0.62344582593250431, 0.8828125, 1, 1]