最近想把肉膚色的圖片找出來,於是就Google了一下,最後發現使用HSV值去做判斷是比較好的方法。於是就用php硬幹了一個做測試,使用(((0<=$h && $h <=1.10)||$h>5.18 )&& 0.1<=$s && $s <= 0.63 && 0.35<=$v && $v <=1)當條件,效果還可以接受,原始碼如下
$r=$r/255;
$g=$g/255;
$b=$b/255;
$max=max($r,$g,$b);
$min=min($r,$g,$b);
$v=$max;
if($max-$min==0){
return array(0,0,$v);
}
$s=($max-$min)/$max;
if($max==$r){
$h=(6+($g-$b)/($max-$min));
}elseif($max==$g){
$h=(2+($b-$r)/($max-$min));
}elseif($max==$b){
$h=(4+($r-$g)/($max-$min));
}
$h=(($h*60)%360)*(2*pi()/360);
return array($h,$s,$v);
}
$img=imagecreatefromjpeg("./1.jpg");
$img2=imagecreatetruecolor(ImageSX($img),ImageSY($img));
for($y=0;$y<ImageSY($img);$y++){
for($x=0;$x<ImageSX($img);$x++){
$rgb = imagecolorat($img, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8 ) & 0xFF;
$b = $rgb & 0xFF;
//print_r(rgb2hsv($r,$g,$b));
//die();
list($h,$s,$v)=rgb2hsv($r,$g,$b);
if(((0<=$h && $h <=1.10)||$h>5.18 )&& 0.1<=$s && $s <= 0.63 && 0.35<=$v && $v <=1){
//if(0<=$h && $h <=1.388 && 0.23<=$s && $s <= 0.63 && 0.25<=$v && $v <=1){
imagesetpixel( $img2 , $x , $y , $rgb);
//echo "==$x,$y==\n";
//var_dump($r, $g, $b);
//var_dump($h, $s, $v);
}else{
imagesetpixel( $img2 , $x , $y , 0);
}
}
//die();
}
imagepng($img2,"2.png",9,PNG_ALL_FILTERS);