用php确定什么是陆地什么是水 请考虑下面的图像:

用php确定什么是陆地什么是水 请考虑下面的图像:,php,laravel,Php,Laravel,这是一个350x350像素的png图像 我编写了以下laravel 5.7代码来确定什么是水,什么不是水: <?php use Illuminate\Database\Seeder; use App\Modules\Locations\Services\CreateMapService; use ChristianEssl\LandmapGeneration\Struct\Color; use App\Modules\Locations\Models\Location; class

这是一个350x350像素的png图像

我编写了以下laravel 5.7代码来确定什么是水,什么不是水:

<?php

use Illuminate\Database\Seeder;

use App\Modules\Locations\Services\CreateMapService;
use ChristianEssl\LandmapGeneration\Struct\Color;
use App\Modules\Locations\Models\Location;

class SurfaceLocations extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $water = new Color(66, 129, 178);
        $land  = new Color(23, 132, 72);

        $createImage = new CreateMapService($land, $water, 350, 350, 'random_map');
        $createImage->generateMap('surface');

        $contents      = Storage::disk('maps')->get('surface.png');
        $imageResource = imagecreatefromstring($contents);

        $waterR = 112;
        $waterG = 219;
        $waterB = 255;

        for ($x = 0; $x <= 349; $x++) {
            for($y = 0; $y <= 349; $y++) {

                $rgb = imagecolorat($imageResource, $x, $y);

                $r = ($rgb >> 16) & 0xFF;
                $g = ($rgb >> 8) & 0xFF;
                $b = $rgb & 0xFF;

                if ($r === $waterR && $g === $waterG && $b === $waterB) {
                    Location::create([
                        'x' => $x,
                        'y' => $y,
                        'is_water' => true
                    ]);
                } else {
                    Location::create([
                        'x' => $x,
                        'y' => $y,
                        'is_water' => false
                    ]);
                }
            }
        }
    }
}

这只是一个想法,但在一个学校项目中,我使用了一种连接算法来检查像素的邻接性,它们可以通过谷歌上的快速谷歌搜索获得,并且可以在多种语言上实现,所以也许你可以寻找一种适合你需要的方法,并根据你的需要调整它,比如在像素和相邻像素检查上“是水”

这与一个标志相结合,以确定yoy是否放置了一个端口,应该可以解决这个问题

还需要指出的是,(兰特(01100)>=50)将与(兰特(0,2)>=1)(我认为)相同,有50%的几率成为一个港口…也许你可以调整它以适应你的港口人口


希望我能帮上忙:D

这只是一个想法,但在学校的一个项目中,我使用了一种连接性算法来检查像素的邻接性,它们可以通过谷歌上的快速谷歌搜索获得,并且可以在多种语言上实现,所以也许你可以寻找一种适合你的,并根据你的需要调整它,直到“是水”关于像素和相邻像素的检查

这与一个标志相结合,以确定yoy是否放置了一个端口,应该可以解决这个问题

还需要指出的是,(兰特(01100)>=50)将与(兰特(0,2)>=1)(我认为)相同,有50%的几率成为一个港口…也许你可以调整它以适应你的港口人口


希望我能帮上忙:D

你的建议有什么问题吗?当你说“它旁边的那个”时,你的确切意思是什么?一个正方形像素有4个或8个邻域,这取决于你是否要计算对角线。@IMSoP正如你所看到的
imagecolorat
取x,y,所以我认为,理论上,它应该是右、左、上、下。但是既然你提到了这一点,我也可以把对角线也包括进去。@AlexandreCassagne我问这个问题的原因是因为我想知道是否有更好的方法可以优化你的代码。不要比较R、G和B,一起比较RGB你的建议有什么不对?当你说“它旁边的那个”时,你确切的意思是什么?一个正方形像素有4个或8个邻域,这取决于你是否要计算对角线。@IMSoP正如你所看到的
imagecolorat
取x,y,所以我认为,理论上,它应该是右、左、上、下。但是既然你提到了这一点,我也可以把对角线也包括进去。@AlexandreCassagne我问这个问题的原因是因为我想知道是否有更好的方法可以优化你的代码。不要比较R、G和B,一起比较RGB。请您在回答中添加一个检查像素邻接度的算法示例代码。请您在回答中添加一个检查像素邻接度的算法示例代码?