欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

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

程序员文章站 2024-02-15 11:52:59
...
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扩展。