我有一个带有项目的图像,我正试图找到它的优势。 我已经应用了边缘检测算法,并且使用regionprops成功找到了图像周围的迹线。我也有跟踪形状内的像素。我想要做的是用黑色背景替换所有其他像素。 A是RGB图像,Aseg是分割图像
A1=rgb2gray(A)
pixels=regionprops(logical(Aseg),'PixelList');
我知道如何在原始图像上绘制我需要的像素
imshow(A1);hold on
plot(pixels.PixelList(:,1),pixels.PixelList(:,2))
但我想绘制我想要保留原始值的像素,并用黑色背景替换所有其他像素,我找不到办法。 有人有什么建议吗? 谢谢。
答案 0 :(得分:2)
如果您只想保持形状的像素并将其他所有内容设置为黑色,只需创建新空白图像,然后将原始图像中的位置复制到新图像,把一切都当作黑色。这基本上将所有其他位置设置为黑色,同时保持所需区域完整。
您可以通过sub2ind
来生成线性索引,以直接访问您的图片并将这些值复制到新图片中。
因此,尝试这样的事情:
Anew = zeros(size(A1), class(A1));
ind = sub2ind(size(A1), pixels.PixelList(:,2), pixels.PixelList(:,1));
Anew(ind) = A1(ind);
Anew
包含背景像素设置为黑色的新图像。 PixelList
是一种结构,其中第一列是x
或列坐标,第二列是y
或行坐标。对于sub2ind
,您必须首先指定行,然后是之后的列,这就是我们首先索引第二列,然后是第一列的索引的原因。
或者,您可以通过创建logical
的{{3}}矩阵使用逻辑索引来实现相同的功能,然后使用此矩阵直接索引到图像并设置正确的位置:
Anew = zeros(size(A1), class(A1));
ind = logical(sparse(pixels.PixelList(:,2), pixels.PixelList(:,1), 1, size(A1,1), size(A1,2)));
Anew(ind) = A1(ind);
请注意,行和列的排序与使用sub2ind
相同。