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
Matlab边缘扩展矢量化_Matlab_Image Processing_Vectorization - Fatal编程技术网

Matlab边缘扩展矢量化

Matlab边缘扩展矢量化,matlab,image-processing,vectorization,Matlab,Image Processing,Vectorization,我在我的一个项目中有以下matlab代码图像\u工作此时是一个逻辑图像,是边缘检测的结果。下面的循环将每个白点扩展为一个宽度为width的十字(因此稍后调用imfill()将找到更多闭合区域。四个if语句检查每个点是否在原始边界内 [edge_row, edge_col] = find(image_working); for width = 1:width_edge_widen for i = 1:length(edge_row) if (edge_row(i) + wi

我在我的一个项目中有以下matlab代码<代码>图像\u工作此时是一个逻辑图像,是边缘检测的结果。下面的循环将每个白点扩展为一个宽度为
width
的十字(因此稍后调用
imfill()
将找到更多闭合区域。四个if语句检查每个点是否在原始边界内

[edge_row, edge_col] = find(image_working);
for width = 1:width_edge_widen
    for i = 1:length(edge_row)
        if (edge_row(i) + width <= m)
            image_working(edge_row(i) + width, edge_col(i)) = 1;
        end
        if (edge_row(i) - width >= 1)
            image_working(edge_row(i) - width, edge_col(i)) = 1;
        end
        if (edge_col(i) + width <= n)
            image_working(edge_row(i), edge_col(i) + width) = 1;
        end
        if (edge_col(i) - width >= 1)
            image_working(edge_row(i), edge_col(i) - width) = 1;
        end
    end
end
[edge\u row,edge\u col]=查找(图像处理);
对于宽度=1:宽度\边缘\加宽
对于i=1:长度(边\行)
如果(边缘_行(i)+宽度=1)
图像处理(边缘行(i)-宽度,边缘列(i))=1;
终止
如果(边+柱(i)+宽度=1)
图像处理(边缘行(i),边缘列(i)-宽度)=1;
终止
终止
终止
我怀疑有一种很好的方法可以对其进行矢量化并避免顶层循环,但我不知道该如何进行。简单的索引(如
image\u-working(edge\u-row,edge\u-col)
)不起作用,因为这将给出一个矩形区域而不是单个点。线性索引(调用
inds=find(image\u-working)
)是不可取的,因为很难同时进行垂直和水平移动,尽管在我没有想到的索引上可能有一个向量化转换。有什么建议吗?

首先,一个“向量化”这里的解决方案通常不是最快的,这取决于二进制图像的稀疏程度。其次,这里有一些比代码更快的解决方案:

首先创建一个随机的二值图像

im0=rand(2000)>0.999; % this means sparsity (density) ~ 1e-3
解决方案1-用于循环(用于宽度为1的交叉,但您可以根据需要更改):

解决方案2-矢量化和一条线(对于宽度为1的十字):

解决方案3-矢量化逻辑索引(用于宽度为1的十字)

您将看到,对于稀疏图像,for循环将比其他方法更快

Solution 1: Elapsed time is 0.028668 seconds.
Solution 2: Elapsed time is 0.041758 seconds.
Solution 3: Elapsed time is 0.120594 seconds.
对于稀疏程度较低的图像,例如(~1%),您可以使用矢量化解决方案(解决方案2),因为For循环将很快变得效率较低,但我会在决定之前检查数据的性能


奖金编辑,为了好玩,我将解决方案2中的交叉过滤器矢量化为任意宽度,如下所示:

f=@(width) circshift(vander([1 zeros(1,2*width)]),[width -width]);
因此
im=conv2(single(im0),f(1),'same')>0;
相当于解决方案2中编写的内容,但现在您可以使用任何
f(width\u size)

首先,使用“矢量化”这里的解决方案通常不是最快的,这取决于二进制图像的稀疏程度。其次,这里有一些比代码更快的解决方案:

首先创建一个随机的二值图像

im0=rand(2000)>0.999; % this means sparsity (density) ~ 1e-3
解决方案1-用于循环(用于宽度为1的交叉,但您可以根据需要更改):

解决方案2-矢量化和一条线(对于宽度为1的十字):

解决方案3-矢量化逻辑索引(用于宽度为1的十字)

您将看到,对于稀疏图像,for循环将比其他方法更快

Solution 1: Elapsed time is 0.028668 seconds.
Solution 2: Elapsed time is 0.041758 seconds.
Solution 3: Elapsed time is 0.120594 seconds.
对于稀疏程度较低的图像,例如(~1%),您可以使用矢量化解决方案(解决方案2),因为For循环将很快变得效率较低,但我会在决定之前检查数据的性能


奖金编辑,为了好玩,我将解决方案2中的交叉过滤器矢量化为任意宽度,如下所示:

f=@(width) circshift(vander([1 zeros(1,2*width)]),[width -width]);

因此
im=conv2(single(im0),f(1),'same')>0;
相当于解决方案2中编写的内容,但现在您可以使用任何
f(width\u size)
你想要。

你只想传播二进制像素?涂抹整个图像怎么样,比如:imout=image\u working;for width=1:width\u edge\u加宽;imout=imout\image\u working(:,[one(1,width),1:end width])image\u working(:,[width+1:end,one(1,width)]);image\u working([one(1,width),1:end width],:)| image|u working([width+1:end,ones(1,width)],:);end。根据图像的稀疏性,这是很多操作,但它是矢量化的。您只想传播二进制像素?如何涂抹整个图像,例如:imout=image|working;对于width=1:width|edge|加宽;imout=imout|image|working(:,[ones(1,width),1:end-width])图像处理(:,[width+1:end,one(1,width)])图像处理([one(1,width),1:end-width],:)图像处理([width+1:end,one(1,width)],:);结束。根据图像的稀疏性,这是一个很大的运算,但它是矢量化的。回答很好,比较好。谢谢!我的图像是5%到20%之间的白色(基本上是一幅有一堆圆的图像的边缘检测结果),所以你的矢量化解决方案看起来是最好的。测试所有结果(在528 x 710图像上)我的旧方法:3.766秒,解决方案1(更好的循环):0.607秒,解决方案2(矢量化):0.014秒。这是一个非常明显的区别!另一件事表明,该方法现在我可以使用任意形状来扩展图像——而不仅仅是一个十字。这可能对我所做的很有用。你完全正确,查看
fspecial
,查找matlab拥有的一些传统过滤器,或者搜索不太传统的binary mask shapes(例如,这个:)回答不错,对比也很好。谢谢!我的图像是5%到20%的白色(基本上是一幅有一堆圆的图像的边缘检测结果),所以你的矢量化解决方案看起来是最好的。测试它们的结果(在528 x 710图像上)我的旧方法:3.766秒,解决方案1(更好的循环):0.607秒,解决方案2(矢量化):0.014秒。这是一个非常明显的区别!另一件事表明,该方法现在我可以使用任意形状来扩展图像——而不仅仅是一个十字。这可能对我所做的很有用。你完全正确,查看
fspecial
,查找matlab拥有的一些传统过滤器,或者搜索不太传统的b伊纳里马