Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

18.05.2010, 16:40
|
|
Познающий
Регистрация: 07.02.2010
Сообщений: 70
Провел на форуме: 217996
Репутация:
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);
раскуривай коменты
|
|
|

18.05.2010, 17:20
|
|
Познающий
Регистрация: 07.02.2010
Сообщений: 70
Провел на форуме: 217996
Репутация:
56
|
|
кстати, чтобы понять, что функция нашла нужные пиксели, то можно перекрасить их на картинке и посмотреть картинку
(добавить)
PHP код:
kill_perperellipepidi($IMAGE,$WHITE,array(1,2),$W+$H,1,$W+$H,1);
$black=imagecolorallocate($im,0,0,0);
$red=imagecolorallocate($im,255,0,0);
$green=imagecolorallocate($im,0,255,0);
$white=imagecolorallocate($im,255,255,255);
for($x=0;$x<$W;$x++){
for($y=0;$y<$H;$y++){
if($IMAGE[$x][$y]===0)imagesetpixel($im,$x,$y,$white);
if($IMAGE[$x][$y]===1)imagesetpixel($im,$x,$y,$red);
}
}
imagegif($im,'result.gif');
должно работать, с виду в коде багов нет
===============
Ну что, автор, помог или нет?
Последний раз редактировалось roxblnfk; 18.05.2010 в 20:20..
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|