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

本文介绍了一种使用YCbCr色彩模型判断图片是否包含低俗内容的方法,通过转换色彩模型并计算特定色域占比来实现图片分类。
if(validatorImage("d:/b.jpg"))  
    echo '是个低俗图片<br />';  
else  
    echo '不是低俗图片<br />';  
function validatorImage($fileName){  
    $image = getImage($fileName);  
    $width = ImagesX($image);  
    $height = ImagesY($image);  
    $ycb = 0;  
    for($y=0;$y<$height;$y++){  
        for($x=0;$x<$width;$x++){  
            $rgb = ImageColorAt($image,$x,$y);  
            $r = ($rgb >> 16) & 0xFF;  
            $g = ($rgb >> 8) & 0xFF;  
            $b = $rgb & 0xFF;  
            $ycbcr = rgb2ycbcr($r,$g,$b);  
            if((86<=$ycbcr['cb']&&$ycbcr['cb']<=117)&&(140<=$ycbcr['cr']&&$ycbcr['cr']< 168)){  
                $ycb++;  
            }  
        }  
    }  
    imagedestroy($image);  
      
    if($ycb>(floatval($width)*floatval($height)*0.3))  
        return true;  
    else  
        return false;  
}  
  
function getImage($fileName){  
    $info = getImageSize($fileName);  
    $ext = null;  
    switch ($info[2]) {  
        case 1 :  
            $ext = "gif";  
            break;  
        case 2 :  
            $ext = "jpeg";  
            break;  
        case 3 :  
            $ext = "png";  
            break;  
    }  
    $function = 'ImageCreateFrom'.ucfirst($ext);  
    $resource = $function($fileName);  
    return $resource;  
}  
// RGB 转 YCbCr色彩   
function rgb2ycbcr($r,$g,$b){  
    $r = floatval($r);  
    $g = floatval($g);  
    $b = floatval($b);  
      
    $y = 0.299*$r + 0.587*$g + 0.114*$b;  
    $cb = (1 / 1.772) * ($b - $y) + 128;  
    $cr = (1 / 1.402) * ($r - $y) + 128;  
      
    return array('y'=>$y,'cb'=>$cb,'cr'=>$cr);  
}  

说明:

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

 

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

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

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值