在Python中使用magick中的+levelcolors和Wand

2024-09-27 09:25:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我要用魔杖把图像的一些部分剪下来。图像的背景是透明的。但是在我删掉部分之前,我首先要对源图像进行一些调整(而不是实际更改源文件)。在

我想做的调整是:

  1. 把黑点改成灰色,把白点改成白色
  2. 将所有颜色值缩放到新的灰色和白色范围
  3. 将透明背景替换为100%黑色
  4. 将图像转换为灰度

我可以通过ImageMagick使用一个简单的命令获得所需的结果:

convert input.png +clone +level-colors gray,white -background black -alpha remove -colorspace Gray output.png

但是我怎么用魔杖呢?似乎没有办法从魔杖应用+level颜色操作。我想,这个问题的答案:Is there a -level function in wand-py也不适用于我的问题。因为magick图像API似乎没有level colors方法。在

效果示例:

输入: Before 输出: After


Tags: 图像png颜色level灰度背景colors源文件
3条回答

fmw42指定了在Wand中使用多项式函数在A way to perform the +level ImageMagick operation in Wand?中实现+级操作的方法。在

我已经应用了fmw42的解决方案来创建一个执行+level colors操作的函数。在

from wand.image import Image

#wand_imageToColorize should be an instance of wand.image.Image.
#i_listRgbRangeLowerLimits = [iRedLowerLimit, iGreenLowerLimit, iBlueLowerLimit]
#i_listRgbRangeUpperLimits = [iRedUpperLimit, iGreenUpperLimit, iBlueUpperLimit]
def Colorize(wand_imageToColorize,
             i_listRgbRangeLowerLimits, i_listRgbRangeUpperLimits):
    #input assurance
    for iIndex in range(0, 3):
        if i_listRgbRangeLowerLimits[iIndex] > \
            i_listRgbRangeUpperLimits[iIndex]:
            iTemp = i_listRgbRangeLowerLimits[iIndex]
            i_listRgbRangeLowerLimits[iIndex] = i_listRgbRangeUpperLimits[iIndex]
            i_listRgbRangeUpperLimits[iIndex] = iTemp

        if i_listRgbRangeLowerLimits[iIndex] < 0:
            i_listRgbRangeLowerLimits[iIndex] = 0

        if i_listRgbRangeUpperLimits[iIndex] > 255:
            i_listRgbRangeUpperLimits[iIndex] = 255

    #perform colorization
    str_tupleChannelNames = ('red', 'green', 'blue')

    for iColorComponentIndex in range(0, 3):
        strChannelName = str_tupleChannelNames[iColorComponentIndex]

        fB = float(i_listRgbRangeLowerLimits[iColorComponentIndex]) / 255.0
        fA = float(i_listRgbRangeUpperLimits[iColorComponentIndex]) / 255.0 - fB

        wand_imageToColorize.function('polynomial', [fA, fB], strChannelName)

-level-colors行为可以由wand.image.Image.level方法应用,但需要为每个颜色通道执行。提供的两种颜色用作参考黑白点。在

例如。。。在

from wand.image import Image
from wand.color import Color
from wand.compat import nested

with Image(filename='rose:') as rose:
    # -level-colors red,green
    with nested(Color('red'),
                Color('green')) as (black_point,
                                    white_point):
        # Red channel
        rose.level(black_point.red,
                   white_point.red,
                   1.0,
                   'red')
        # Green channel
        rose.level(black_point.green,
                   white_point.green,
                   1.0,
                   'green')
        # Blue channel
        rose.level(black_point.blue,
                   white_point.blue,
                   1.0,
                   'blue')
    rose.save(filename='output.png')

-level-colors

对于+level-colors,只需反转黑白点。在

^{pr2}$

由于输出图像无论如何都是灰色的,所以您不需要+level-colors,您可以这样做:

convert movies.png -channel RGB -colorspace gray +level 50,100% -background black -alpha remove output.png

另一个选择可能是使用-fx运算符。如果你想象你的像素亮度在0(黑色)和1(白色)之间变化,那么如果你将所有亮度除以2,它们将在00.5之间变化。如果添加0.5,它们将在0.5(中灰色)和{}(白色)之间变化-这就是您想要的:

^{pr2}$

相关问题 更多 >

    热门问题