📜  PHP |想象一下 randomThresholdImage()函数(1)

📅  最后修改于: 2023-12-03 14:45:20.830000             🧑  作者: Mango

PHP | 想象一下 randomThresholdImage() 函数

介绍

在图像处理中,二值化(二值图像)是指将灰度图像方式转化为二值图像的过程。通常情况下,我们会设置一个阈值,如果某个像素值大于此阈值,那么此像素就被赋值为亮色(一般是白色);反之,如果像素值小于此阈值,那么此像素就被赋值为暗色(一般是黑色)。这个过程就称为二值化,其中阈值的设定是非常重要的。而我们今天要介绍的 randomThresholdImage() 函数则是用来随机设定阈值的,具体实现方法会在下文中详细介绍。

函数原型
function randomThresholdImage ( string $filename , float $threshold = 0.5 ) : bool
函数参数

| 参数名 | 类型 | 描述 | | --- | --- | --- | | $filename | string | 要进行二值化处理的源文件路径 | | $threshold | float | 阈值。这个参数是一个介于0和1之间的小数,代表着随机生成一个阈值的比例。如果设置为0.5,则根据随机设定的阈值使得像素值小于阈值的变为黑色,大于等于阈值的变为白色。 |

函数返回值

| 返回值 | 类型 | 描述 | | --- | --- | --- | | true | bool | 如果二值化处理成功,返回true。 | | false | bool | 如果二值化处理失败,返回false。 |

函数实现方法
/**
 * 随机二值化处理函数
 * @param string $filename 要进行二值化处理的源文件路径
 * @param float $threshold 阈值,介于0和1之间的小数,代表着随机生成一个阈值的比例
 * @return bool
 */
function randomThresholdImage ( string $filename , float $threshold = 0.5 ) : bool {

    // 读入源文件
    $img = imagecreatefromstring ( file_get_contents ( $filename ) );

    // 获取源文件像素总数
    $totalPixels = imagesx ( $img ) * imagesy ( $img );

    // 根据阈值比例计算出此次生成的阈值
    $currentThreshold = rand ( 0 , 100 ) / 100 * $threshold;

    // 遍历所有像素点,根据当前阈值进行二值化处理
    for ( $i = 0 ; $i < imagesx ( $img ) ; ++ $i ) {
        for ( $j = 0 ; $j < imagesy ( $img ) ; ++ $j ) {

            // 获取当前像素的颜色信息
            $rgbColor = imagecolorat ( $img , $i , $j );
            $r = ( $rgbColor >> 16 ) & 0xFF;
            $g = ( $rgbColor >> 8 ) & 0xFF;
            $b = $rgbColor & 0xFF;

            // 将当前像素根据阈值进行二值化处理
            $grayLevel = ( $r + $g + $b ) / 3 / 255;
            if ( $grayLevel < $currentThreshold ) {
                imagesetpixel ( $img , $i , $j , imagecolorallocate ( $img , 0 , 0 , 0 ) );
            } else {
                imagesetpixel ( $img , $i , $j , imagecolorallocate ( $img , 255 , 255 , 255 ) );
            }
        }
    }

    // 将处理后的图像保存至文件
    $result = imagepng ( $img , 'output.png' );
    imagedestroy ( $img );

    // 返回执行结果
    return $result;
}
示例演示
// 随机生成一个阈值进行二值化处理
randomThresholdImage ( 'test.jpg' , 0.5 );

上面的示例代码中,我们将会调用 randomThresholdImage() 函数来对名为 test.jpg 的源文件进行处理,并且随机生成一个比例为0.5的阈值进行二值化操作。程序将会自动生成一个新的文件 output.png,里面存放着二值化处理后的图像。如果返回值为 true 则代表程序执行成功,否则执行失败。