Показать сообщение отдельно

  #11  
Старый 18.05.2010, 16:40
roxblnfk
Познающий
Регистрация: 07.02.2010
Сообщений: 70
С нами: 8557551

Репутация: 56
По умолчанию

недавно как раз писал функцию для очистки изображения от малых площадей.

щас подстёр лишнее, должно работать (не тестил)

PHP код:
$ImgName='...';

$im ImageCreateFromJpeg($ImgName);
$W=imagesx($im);
$H=imagesy($im);
$IMAGE=array();
$WHITE=array();
for(
$x=0;$x<$W;$x++){
    for(
$y=0;$y<$H;$y++){
        
$rgb ImageColorAt($im$x$y);
        
$r = ($rgb >> 16) & 0xFF;
        
$g = ($rgb >> 8) & 0xFF;
        
$b $rgb 0xFF;
        
$int1=63;
        
$int2=195;
        if(
$r<$int1 && $g<$int1 && $b<$int1$IMAGE[$x][$y]=2;
        if(
$r<$int2 && $g<$int2 && $b<$int2$IMAGE[$x][$y]=1;
        else 
$IMAGE[$x][$y]=0;
        
$WHITE[$x][$y]=false;
    }
}
function 
get_volume_pedratXD(&$IMAGE, &$WHITE$x$y$arrOk=array(1,2), $lim=200$towhite=true){
    
$MA=array($x=>array($y=>true));//micro array
    
$S=1;
    
$arrow=array(array(0=>1,1=>0),array(0=>-1,1=>0),array(0=>0,1=>1),array(0=>0,1=>-1));
    do{
        
$add=0;
        foreach(
$MA as $X=>$z){
            foreach(
$z as $Y=>$V){
                if(
$lim<$S) return array($S,$MA);
                if(
$V!==false){
                    foreach(
$arrow as $arrrr){
                        
$ax=$X+$arrrr[0];
                        
$ay=$Y+$arrrr[1];
                        if(!isset(
$MA[$ax][$ay]) && isset($IMAGE[$ax][$ay]))if($WHITE[$ax][$ay]!==true){
                            if(
$towhite)$WHITE[$ax][$ay]=true;
                            if(
in_array($IMAGE[$ax][$ay],$arrOk,true)){
                                
$MA[$ax][$ay]=true;
                                
$add++;
                                
$S++;
                            }else 
$MA[$ax][$ay]=false;
                        }
                    }
                }
            }
        }
    }while(
$add>0);
    return array(
$S,$MA);
}
function 
kill_perperellipepidi(&$IMAGE$WHITE$arrOk=array(1,2), $lim=200$Min=1$Max=15$Salit=0){
    
$arrow=array(array(1,0),array(-1,0),array(0,1),array(0,-1));
    foreach(
$IMAGE as $x=>$z){
        foreach(
$z as $y=>$Z){
            if(
$WHITE[$x][$y]!==true && in_array($Z,$arrOk,true)){
                
$SS=get_volume_pedratXD($IMAGE,$WHITE,$x,$y,$arrOk,$lim);
                
$S=$SS[0];
                
$Arr=$SS[1];
                
//echo '<br>Scan SSS: ['.$x.','.$y.'] = '.$S;
                
if($S<=$Max && $S>=$Min){
                    foreach(
$Arr as $X=>$v){
                        foreach(
$v as $Y=>$V){
                            if(
$V==true$IMAGE[$X][$Y]=$Salit;
                        }
                    }
                }
                
//вот тут пиши функцию для преобразования массива 
                //в строку, какую тебе угодно... например $RETURN[]=$Arr; return $RETURN; (и функция вернёт массивы $Arr на все пятна в отдельном массиве)
                
                //$S передаёт площадь пятен
                //$Arr ===== $Arr[$x][$y]=$Value ($Value должно быть true, если он false, то пиксель был просканен, но он не относится к пятну)
                // параметр этой функции $Salit - каким index'ом залить пятно, если его площадь от $Min до $Max включительно (если не надо, то назнач $Max=-1)
                // $Lim для тех кто шарит, сам же ставь равным площади всей картинки
                // $WHITE - массив предела сканирования, не парься, если задача простая
            
}
        }
    }
}
//просчитываем массив картинки $IMAGE:
kill_perperellipepidi($IMAGE,$WHITE,array(1,2),$W+$H,1,-1,0); 
раскуривай коменты
 
Ответить с цитированием