PHPCon Poland 2024


(PECL imagick 2, PECL imagick 3)

Imagick::sigmoidalContrastImageРегулирует контраст изображения


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

Регулирует контраст изображения с помощью алгоритма нелинейного сигмоидального контраста. Увеличьте контраст изображения с помощью сигмоидальной передаточной функции без насыщения светлых участков или теней. Контрастность указывает, насколько увеличить контраст (0 - нет; 3 - типичный; 20 - усиление); Средняя точка указывает, где попадают средние тона в результирующем изображении (0 - белый; 50 - средний серый; 100 - чёрный). Установите резкость на true для увеличения контрастности изображения, в противном случае контрастность уменьшается.

Смотрите также » Примеры ImageMagick v6 - Преобразования изображений - Контраст сигмоидальной нелинейности.

Список параметров


Если true, контраст увеличивается, если false - уменьшается.


Количество применяемого контраста. 1 - очень мало, 5 - значительное, 20 - максимальная величина.


Где будет середина градиента. Это значение должно быть в диапазоне от 0 до 1 - вне зависимости от квантового значения ImageMagick.


К каким цветовым каналам будет применяться контраст.

Возвращаемые значения

Функция в случае успешной работы возвращает true.


Функция выбрасывает исключение ImagickException, если возникла ошибка.


Пример #1 Создание градиентного изображения, используя Imagick::sigmoidalContrastImage(), подходящую для плавного смешивания двух изображений вместе, со смешиванием, определяемого контрастом и средней точкой.


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"]);



add a note

User Contributed Notes 2 notes

acameron at theatomgroup dot com
10 years ago
The documentation for this function really isn't useful or helpful at all. "Sharpen", "Contrast" and "Midpoint" aren't the names of the params, which are referred to as "alpha" and "beta".

The Imagemagick manual entry:

For those interested, the corrected formula for the 'sigmoidal non-linearity contrast control' is...
( 1/(1+exp(β*(α-u))) - 1/(1+exp(β)) ) / ( 1/(1+exp(β*(α-1))) - 1/(1+exp(β*α)) )
Where α is the threshold level, and β the contrast factor to be applied.
The formula is actually very simple exponential curve, with the bulk of the above formula is designed to ensure that 0 remains zero and 1 remains one. That is, the graph always goes though the points 0,0 and 1,1. And the highest gradient of change is at the given threshold.


In the Imagick extension source, the function call is:

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


Referring back to the binary API call gives:

foreign import ccall "MagickSigmoidalContrastImageChannel" magickSigmoidalContrastImageChannel
:: Ptr MagickWand
-> ChannelType -- ^ identify which channel to level: `redChannel`, `greenChannel`
-> MagickBooleanType -- ^ increase or decrease image contrast
-> CDouble -- ^ strength of the contrast, the larger the number the more 'threshold-like' it becomes
-> CDouble -- ^ midpoint of the function as a color value 0 to `quantumRange`
-> IO MagickBooleanType


So the parameters should apparently be interpreted:

Sharpen: 0/1 (increase/decrease contrast)
Alpha: Strength of the contrast (typically 3-20)
Beta: Midpoint of the contrast (typically 50)
8 years ago
The formula for sigmoidal contrast given by Thyssen is missing a term. It should be:

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

where there was an α missing from the second term.

Note that a sigmoidal contrast with α = 6 and β = 0.46 is approximately equivalent to combining a "screen" overlay of the image on itself, followed by a "multiply" overlay.
To Top