2024 年 PHP 日本大会

Imagick::sigmoidalContrastImage

(PECL imagick 2, PECL imagick 3)

Imagick::sigmoidalContrastImage调整图像对比度

描述

public Imagick::sigmoidalContrastImage(
    bool $sharpen,
    float $alpha,
    float $beta,
    int $channel = Imagick::CHANNEL_DEFAULT
): bool

使用非线性 S 型对比度算法调整图像的对比度。使用 S 型传递函数来增加图像对比度,而不会饱和高光或阴影。对比度表示增加对比度的程度(0 表示无;3 为典型值;20 为极限值);中点表示中间色调在结果图像中的位置(0 为白色;50 为中间灰;100 为黑色)。将 sharpen 设置为 true 以增加图像对比度,否则对比度会降低。

另见 » ImageMagick v6 示例 - 图像变换 — S 型非线性对比度

参数

sharpen

如果为 true,则增加对比度;如果为 false,则降低对比度。

alpha

要应用的对比度量。1 表示非常小,5 表示相当大的量,20 表示极端值。

beta

渐变的中点位置。此值应在 0 到 1 之间 - 乘以 ImageMagick 的量子值。

channel

将应用对比度的颜色通道。

返回值

成功时返回 true

错误/异常

发生错误时抛出 ImagickException。

示例

示例 #1 使用 Imagick::sigmoidalContrastImage() 创建适合将两张图像平滑地混合在一起的渐变图像,混合由 $contrast 和 $midpoint 定义

<?php

function generateBlendImage($width, $height, $contrast = 10, $midpoint = 0.5) {
$imagick = new Imagick();
$imagick->newPseudoImage($width, $height, 'gradient:black-white');
$quanta = $imagick->getQuantumRange();
$imagick->sigmoidalContrastImage(true, $contrast, $midpoint * $quanta["quantumRangeLong"]);

return
$imagick;
}

?>

添加注释

用户贡献的注释 2 条注释

acameron at theatomgroup dot com
10 年前
此函数的文档根本没有用或没有帮助。“锐化”、“对比度”和“中点”不是参数的名称,参数被称为“alpha”和“beta”。

ImageMagick 手册条目

对于感兴趣的人,“S 型非线性对比度控制”的修正公式是……
( 1/(1+exp(β*(α-u))) - 1/(1+exp(β)) ) / ( 1/(1+exp(β*(α-1))) - 1/(1+exp(β*α)) )
其中 α 是阈值,β 是要应用的对比度因子。
该公式实际上是一个非常简单的指数曲线,上述公式的大部分内容旨在确保 0 保持为零,而 1 保持为一。也就是说,该图始终经过点 0,0 和 1,1。并且变化的最大梯度在给定的阈值处。

来源:https://imagemagick.org.cn/Usage/color_mods/#sigmoidal

在 Imagick 扩展源代码中,函数调用为

status = MagickSigmoidalContrastImageChannel(intern->magick_wand, channel, sharpen, alpha, beta);

来源:https://github.com/mkoppanen/imagick/

参考回二进制 API 调用给出

foreign import ccall "MagickSigmoidalContrastImageChannel" magickSigmoidalContrastImageChannel
:: Ptr MagickWand
-> ChannelType -- ^ 标识要调整哪个通道:`redChannel`、`greenChannel`
-> MagickBooleanType -- ^ 增加或减少图像对比度
-> CDouble -- ^ 对比度的强度,数字越大,“阈值”特性越明显
-> CDouble -- ^ 函数的中点作为颜色值 0 到 `quantumRange`
-> IO MagickBooleanType

来源:http://hackage.haskell.org/package/imagemagick-0.0.2/docs/src/Graphics-ImageMagick-MagickWand-FFI-WandImage.html

因此,参数显然应该解释为

锐化:0/1(增加/减少对比度)
Alpha:对比度强度(通常为 3-20)
Beta:对比度中点(通常为 50)
SkepticaLee
9 年前
Thyssen 给出的 S 型对比度公式缺少一项。它应该是

( 1/(1+exp(β*(α-u))) - 1/(1+exp(β*α)) ) / ( 1/(1+exp(β*(α-1))) - 1/(1+exp(β*α)) )

其中第二项缺少一个 α。

请注意,α = 6 和 β = 0.46 的 S 型对比度大约等效于将图像自身的“屏幕”叠加组合在一起,然后是“正片叠底”叠加。
To Top