Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.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
Python 自适应灰度膨胀的实现_Python_Image Processing_Image Morphology_Mathematical Morphology_Dilation - Fatal编程技术网

Python 自适应灰度膨胀的实现

Python 自适应灰度膨胀的实现,python,image-processing,image-morphology,mathematical-morphology,dilation,Python,Image Processing,Image Morphology,Mathematical Morphology,Dilation,给定一个值范围从0到n的2D数组,我想用它包含的值来扩展每个像素,在扩展过程中,较高的值应该覆盖较低的值 也就是说,半径内的任何像素等于一个像素的值,如果其值较小,则会继承该值。例如,如果输入为[01020],则输出为[1222] 这是如何实现的?您的口头描述正是如何实现算法:对于每个像素,让我们调用其值r,检查其邻域,邻域的大小由r给出。在此邻域内,如果所有像素的值较低,则将其设置为r。您确实需要写入一个独立的输出映像,在不中断逻辑的情况下无法修改输入 当然,这是通过一组嵌套循环实现的:第一个

给定一个值范围从0到n的2D数组,我想用它包含的值来扩展每个像素,在扩展过程中,较高的值应该覆盖较低的值


也就是说,半径内的任何像素等于一个像素的值,如果其值较小,则会继承该值。例如,如果输入为[01020],则输出为[1222]


这是如何实现的?

您的口头描述正是如何实现算法:对于每个像素,让我们调用其值r,检查其邻域,邻域的大小由r给出。在此邻域内,如果所有像素的值较低,则将其设置为r。您确实需要写入一个独立的输出映像,在不中断逻辑的情况下无法修改输入

当然,这是通过一组嵌套循环实现的:第一个循环覆盖图像中的每个像素,在这个循环中,循环覆盖邻域中的每个像素

Python的循环速度很慢,所以用Python编写时效率不高。你可以试着用它来加速。如果足够重要的话,用C语言或C++语言编写。 如果n很小,则与使用阈值分解的明显实现相比,此操作可能会加快一点

其思想是在图像中的灰度值r上循环。在每次迭代中,放大二值图像img==r,对于值为r的像素为真,对于大小为r的SE的其他像素为假。接下来,通过在放大图像上取元素最大值来合成最终输出图像。请注意,您可以在循环中逐步累积此最终结果,取上一个结果和新膨胀的最大值


这个实现需要做更多的工作,但是由于您使用的是全映像操作,因此可以最小化Python循环的数量,从而有望加快代码的速度

“按价值扩张”是什么意思?你的意思是希望该像素处的结构元素具有由像素值给定的半径吗?半径内的任何像素等于像素值,如果其值较小,则继承该值。因此[0 1 0 2 0]->[1 2 2 2]扩展和侵蚀python在python中太慢了,我正在考虑优化算法的方法,或者以某种方式使用numpy或具有类似函数的库opencv@Octavio:此操作没有标准实现。如果n很小,可以使用分解定理来加快运算速度。让我把这一点添加到我的答案中。我用numpy分解矩阵,然后按给定的数量扩展每个层,有点像一个拓扑图,然后重新组合所有层,对更大的值进行优先级排序。它很快就解决了numpy和opencv的问题。唯一的缺点是,我必须为每一层设置一个阈值,否则如果梯度非常平滑,就会有太多的层。但这没关系,因为50-70层仍然比一个节点接一个节点快。