PHP 判断是否低俗图片==是否@色@情@图@片

方式一:

原理:通过 RGB色彩模型 转成 YCbCr色彩模型 在 YCbCr色彩模型 判断低俗色的占比

if(validatorImage("d:/b.jpg"))<br />
	echo '是个低俗图片<br />';<br />
else<br />
	echo '不是低俗图片<br />';<br />
function validatorImage($fileName){<br />
	$image = getImage($fileName);<br />
	$width = ImagesX($image);<br />
	$height = ImagesY($image);<br />
	$ycb = 0;<br />
	for($y=0;$y<$height;$y++){<br />
		for($x=0;$x<$width;$x++){<br />
			$rgb = ImageColorAt($image,$x,$y);<br />
			$r = ($rgb >> 16) & 0xFF;<br />
			$g = ($rgb >> 8) & 0xFF;<br />
			$b = $rgb & 0xFF;<br />
			$ycbcr = rgb2ycbcr($r,$g,$b);<br />
			if((86<=$ycbcr['cb']&&$ycbcr['cb']<=117)&&(140<=$ycbcr['cr']&&$ycbcr['cr']< 168)){<br />
				$ycb++;<br />
			}<br />
		}<br />
	}<br />
	imagedestroy($image);</p>
<p>	if($ycb>(floatval($width)*floatval($height)*0.3))<br />
		return true;<br />
	else<br />
		return false;<br />
}</p>
<p>function getImage($fileName){<br />
	$info = getImageSize($fileName);<br />
	$ext = null;<br />
	switch ($info[2]) {<br />
		case 1 :<br />
			$ext = "gif";<br />
			break;<br />
		case 2 :<br />
			$ext = "jpeg";<br />
			break;<br />
		case 3 :<br />
			$ext = "png";<br />
			break;<br />
	}<br />
	$function = 'ImageCreateFrom'.ucfirst($ext);<br />
	$resource = $function($fileName);<br />
	return $resource;<br />
}<br />
// RGB 转 YCbCr色彩<br />
function rgb2ycbcr($r,$g,$b){<br />
	$r = floatval($r);<br />
	$g = floatval($g);<br />
	$b = floatval($b);</p>
<p>	$y = 0.299*$r + 0.587*$g + 0.114*$b;<br />
	$cb = (1 / 1.772) * ($b - $y) + 128;<br />
	$cr = (1 / 1.402) * ($r - $y) + 128;</p>
<p>	return array('y'=>$y,'cb'=>$cb,'cr'=>$cr);<br />
}<br />
登录后复制

说明:

上面是通过 RGB色彩模型 转成 YCbCr色彩模型 在 YCbCr色彩模型 判断低俗色的占比,如果商用还要加上肌肤色的过滤及对低俗部位的判断,依据比例对图片进行分类。

YCbCr 相关知识,可以参考http://zh.wikipedia.org/wiki/YCbCr

RGB 转成 YCbCr 公式可以参考http://blog.csdn.net/zyl910/archive/2006/05/29/759535.aspx

方式二:

原理就是检测皮肤颜色在图片中的比例。经过测试,漏掉的很少,不过误报很高。

<?php
/**
 * PHP检查低俗图片
 * 作者:书中蠹鱼
 */
if($argc == 2){
	$file_name = $argv[1];
	if(is_file($file_name)){
		//文件存在
		$image = openImageFile($file_name);
		$rate = testSkin($image['image_handle'],$image['width'],$image['height']);
		if($rate > 0.3){
			echo "$file_name 貌似是一张低俗图片.肤色比例:$rate/n";
		}else {
			echo "$file_name 貌似不是一张低俗图片.肤色比例:$rate/n";
		}
	}else {
		echo "$file_name can't be find!/n";
	}
}else{
	echo "Usage: testskin.php FileName/n";
}
function openImageFile($file_name){
	list($width, $height, $type, $attr) = getimagesize($file_name);
	switch ($type){
		case 2:
			$image_handle = imagecreatefromjpeg($file_name);
			break;
	}
	return array('image_handle'=>$image_handle,'width'=>$width,'height'=>$height);
}
function testSkin($image_handle,$width,$height){
	$skin_pix = 0;
	for($w=0;$w<$width;$w++){
		for ($h=0;$h<$height;$h++){
			//验证图片
			$rgb = imagecolorat($image_handle,$w,$h);
			$r = ($rgb >> 16) & 0xFF;
			$g = ($rgb >> 8) & 0xFF;
			$b = $rgb & 0xFF;
			$Y=0.299*$r+0.587*$g+0.114*$b;
			$Cb=0.564*($b-$Y)+128;
			$Cr=0.713*($r-$Y)+128;
			if($Cb >= 86 && $Cb <= 117 && $Cr >= 140 && $Cr <= 168){
				$skin_pix ++;
			}
		}
	}
	$skin_rate =  $skin_pix/($width*$height);
	return $skin_rate;
}
?>
登录后复制

需要GD库的支持。在php.ini里面打开gd扩展。

08-19 01:56