📅  最后修改于: 2023-12-03 14:45:20.830000             🧑  作者: Mango
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
则代表程序执行成功,否则执行失败。