Heim >php教程 >php手册 >PHP 判断是否低俗图片==是否@色@情@图@片

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

PHP中文网
PHP中文网Original
2016-06-06 19:58:139217Durchsuche

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

方式一:

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

if(validatorImage("d:/b.jpg"))<br />
	echo &#39;是个低俗图片<br />&#39;;<br />
else<br />
	echo &#39;不是低俗图片<br />&#39;;<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[&#39;cb&#39;]&&$ycbcr[&#39;cb&#39;]<=117)&&(140<=$ycbcr[&#39;cr&#39;]&&$ycbcr[&#39;cr&#39;]< 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 = &#39;ImageCreateFrom&#39;.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(&#39;y&#39;=>$y,&#39;cb&#39;=>$cb,&#39;cr&#39;=>$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[&#39;image_handle&#39;],$image[&#39;width&#39;],$image[&#39;height&#39;]);
		if($rate > 0.3){
			echo "$file_name 貌似是一张低俗图片.肤色比例:$rate/n";
		}else {
			echo "$file_name 貌似不是一张低俗图片.肤色比例:$rate/n";
		}
	}else {
		echo "$file_name can&#39;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(&#39;image_handle&#39;=>$image_handle,&#39;width&#39;=>$width,&#39;height&#39;=>$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扩展。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn