A5下载文章资讯

分类分类

图片灰度和二值化处理

2015-09-23 16:28作者:yezheng

 今天小编给大家分享一个图片灰度和二值化处理的方法的详细介绍,有需要的朋友一起来看看吧

1.代码如下:

<?php

function adaptiveThreshold($file){

if(!$ex = getimagesize($file)){

return false;

}

// 打开图片

switch($ex[2]){

case IMAGETYPE_JPEG:

case IMAGETYPE_JPEG2000:

if(!$im = imageCreateFromJpeg($file)){

return false;

}

break;

case IMAGETYPE_PNG:

$im = imageCreateFromPng($file);

break;

case IMAGETYPE_GIF:

$im = imageCreateFromGif($file);

break;

case IMAGETYPE_BMP:

$im = imageCreateFromBmp($file);

break;

default :

return false;

}

$gray = array_fill(0, $ex[1],

array_fill(0, $ex[0], 0)

);

// 转为灰阶图像

foreach($gray as $y => &$row){

foreach($row as $x => &$Y){

$rgb = imagecolorat($im, $x, $y);

// 根据颜色求亮度

$B = $rgb & 255;

$G = ($rgb >> 8) & 255;

$R = ($rgb >> 16) & 255;

$Y = ($R * 19595 + $G * 38469 + $B * 7472) >> 16;

}

}

unset($row, $Y);

// 自动求域值

$back = 127;

do{

$crux = $back;

$s = $b = $l = $I = 0;

foreach($gray as $row){

foreach($row as $Y){

if($Y < $crux){

$s += $Y;

$l++;

}else{

$b += $Y;

$I++;

}

}

}

$s = $l ? floor($s / $l) : 0;

$b = $I ? floor($b / $I) : 0;

$back = ($s + $b) >> 1;

}while($crux != $back);

// 二值化

$bin = $gray;

foreach($bin as &$row){

foreach($row as &$Y){

$Y = $Y < $crux ? 0 : 1;

}

}

return array(

$gray,

$bin,

);

}

if(empty($_GET["img"])){

exit("Please use $_SERVER[SCRIPT_NAME]?img=local/image/path");

}

if(!$im = adaptiveThreshold($_GET["img"])){

exit("error!");

}

$img = imagecreate(count($im[0][0]), count($im[0]) * 2);

$rgb = array(

imagecolorallocate($img, 0, 0, 0),

imagecolorallocate($img, 255, 255, 255),

);

$x = $y = 0;

$colors = array(

0 => $rgb[0],

255 => $rgb[1]

);

foreach($im[0] as $row){

do{

if(isset($colors[$row[$x]])){

$c = $colors[$row[$x]];

}else{

$c = $colors[$row[$x]] = imagecolorallocate($img, $row[$x], $row[$x], $row[$x]);

}

// imagesetpixel($img, $x, $y, $rgb[$row[$x] < 128 ? 0 : 1]);

imagesetpixel($img, $x, $y, $c);

}while(isset($row[++$x]));

$x = 0;

$y++;

}

foreach($im[1] as $row){

do{

imagesetpixel($img, $x, $y, $rgb[$row[$x]]);

}while(isset($row[++$x]));

$x = 0;

$y++;

}

header("Content-Type: image/gif");

imagegif($img);

 

展开全部

相关

说两句网友评论
    我要跟贴
    取消