Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中GD在图像孤岛检测中的应用_Php_Image Processing_Gd - Fatal编程技术网

PHP中GD在图像孤岛检测中的应用

PHP中GD在图像孤岛检测中的应用,php,image-processing,gd,Php,Image Processing,Gd,我正在开发一个PHP图像处理库,它可以处理游戏中的渲染图像,并在PHP Web主机上进行处理。为了处理图像,我需要找到色调在x数量0或360范围内的红色孤岛,并在其中获得一个点,不一定是中心,但最好是靠近中心。大约有100个这样的岛屿,大小不一。它们是梯形或接近梯形的。由于图像是PNG,并且未进行抗锯齿压缩,因此边缘对于像素来说是清晰的,但某些区域可能比其他区域暗 目前,我尝试的是在GD中使用imagecolorat,并在转换后测试HSV值,然后在其周围尝试点,直到达到非红色像素,但该过程似乎需

我正在开发一个PHP图像处理库,它可以处理游戏中的渲染图像,并在PHP Web主机上进行处理。为了处理图像,我需要找到色调在x数量0或360范围内的红色孤岛,并在其中获得一个点,不一定是中心,但最好是靠近中心。大约有100个这样的岛屿,大小不一。它们是梯形或接近梯形的。由于图像是PNG,并且未进行抗锯齿压缩,因此边缘对于像素来说是清晰的,但某些区域可能比其他区域暗

目前,我尝试的是在GD中使用imagecolorat,并在转换后测试HSV值,然后在其周围尝试点,直到达到非红色像素,但该过程似乎需要一些时间才能完成,并且如果我正在处理大型图像,由于5秒的限制,似乎会遇到PHP超时。是否有一种更有效的方法来检测上述岛屿,并获得一个不一定在中心的点,但最好是在附近

我也尝试过,在那里我知道梯形的大小,假设没有一个在一定的距离内,跳过这个距离来节省时间

我不需要代码,只需要一个指向正确方向的指针

我当前的代码:

function RGBToHSL($RGB) {
    $r = 0xFF & ($RGB >> 0x10);
    $g = 0xFF & ($RGB >> 0x8);
//剪断 }


我从来没有真正使用过gd,但我只是简单地看了一下,我明白了

带有IMG_FILTER_EDGEDETECT标志的图像过滤器

似乎在那之后,你可以用一个简单的循环识别所有的对象如果对象有一个最小的大小,你可以让循环使用这个条带大小,并且仍然保证你会遇到每个对象。只需寻找一个带有边缘颜色的像素,当你找到一个时,递归地探索带有边缘颜色的相邻像素。例如,如果保证对象至少有7个像素高,则在高亮显示边缘后,只需在第0、7、14、21行中的像素上循环即可

一旦你通过使用周围的边缘提取了组件,我想你可以很容易地识别出它的形状、颜色和中心

您可能需要对图像进行阈值化,如果边缘无法被可靠地检测到,GD可以这样做

另一个认真考虑的选项是不使用PHP,而是用PHP的Exchange函数执行外部程序。这打开了使用各种图书馆的可能性,比如opencv和用于这些东西的程序。它还可以让你用类似c的语言编写代码……你会惊奇地发现,在一个包含数百万整数的代表像素颜色的c数组上循环的速度有多快。但是,我觉得这对你来说不是一个可行的选择


您可能要研究的另一个问题是访问php阵列或一组像素。函数调用开销很大,与$pixels[$i]等本机php数组访问相比,调用ImageColor数百万次确实增加了开销。我对图像格式一无所知,但也许你可以保存为位图,然后将其加载到字符串中,然后只使用字符串偏移量。我敢打赌,如果位图具有合适的数组(如二进制表示),这将是可行的。

在网站上进行一点搜索,关于如何使用PHP和GD查找类似颜色的区域,有一个很好的QA。@hakre通过在我设置的特定范围内检查HSV,我已经可以检测到类似的颜色。我想知道是否有比我扫描图像的方法更有效的方法。我还没有找到比这更有效的方法。那么,我强烈建议你展示你目前掌握的代码,否则很难给出有用的指导。@hakre我现在在家里忙着几件事,你能给我一个小时左右的时间吗?因为我的评论,你根本不需要着急。随时可以改进您的问题。在不太可能的情况下,它被关闭,在这里发表评论,并要求重新打开。好好照顾你的家吧。我不知道imagefilter是否真的能用。我在图像中有很多颜色,比如洋红和黄色,所以尝试只获取红色通道是不可行的,边缘检测会丢失颜色。我仍然可以尝试使用C++,但是我需要切换平台。为什么边缘检测会失去颜色?因为它寻找所有的边缘,所以它不能得到正确的边缘,然后我会再次遇到相同的颜色过滤问题。
$image=imagecreatefrompng($filename);
$redislands=[];
for($xpos=0; $xpos<=imagesx($image); $xpos++){
    for($ypos=0; $ypos<=imagesy($image); $ypos++){
        if (RGBToHSL(imagecolorat(xpos, ypos)->saturation<=20||RGBToHSL(imagecolorat(xpos, ypos)->saturation>=350){
            $redislands[]=[xpos, ypos]
            }
        }
    }