gpt4 book ai didi

matlab - 围绕具有相同值的垂直像素组绘制矩形

转载 作者:行者123 更新时间:2023-12-02 06:48:01 24 4
gpt4 key购买 nike

考虑以下由 3 个不同区域/值组成的 7x5 矩阵的可视化:

bL = toeplitz( [zeros(1,5) -2*ones(1,2)], [0 -ones(1,4)] ); 
hF = figure(); hA = axes(hF);
imagesc(hA,bL); axis(hA,'image'); set(hA,'XTick',[],'YTick',[]);
N = 4; cmap = parula(N); colormap(cmap(1:end-1,:));

Unselected

现在假设我在每列中“选择”0 个或更多像素,这样:

  • 所选像素只能在绿色区域中选择。
  • 选定的像素始终是连续的。
  • 通过分配一个常量新值来执行选择,该值与 3 个初始区域不同。

几个选择示例(使用值1):

%Example 1:
cSF = toeplitz([ones(1,1) zeros(1,4) -2*ones(1,2)],[1 -ones(1,4)]);
%Example 2:
oSF = toeplitz( [zeros(1,5) -2*ones(1,2)], [0 -ones(1,4)] );
oSF(end-2:end,find(any(oSF==-2,1),1,'last')+1:end) = 1;
%Example 3:
iSF = toeplitz([ones(1,3) zeros(1,2) -2*ones(1,2)],[1 -ones(1,4)]);
% Plot:
hF = figure();
hP(1) = subplot(1,3,1); imagesc(cSF);
hP(2) = subplot(1,3,2); imagesc(oSF);
hP(3) = subplot(1,3,3); imagesc(iSF);
axis(hP,'image'); set(hP,'XTick',[],'YTick',[]);

Possible selections

我的目标是绘制一组矩形,其中包含属于同一列的“选定”(黄色)像素。对于上面的示例,结果应如下所示(分别):

Desired result

在我看来,为了使代码通用,它应该接受:(1)应该在其中绘制imagesc的轴句柄; (2) 一个data数组; (3) 在 data 数组中找到的值,代表“选择的”像素;以及可选的封闭像素的颜色。

我找到了一些使用 patchrectangle 执行此操作的方法(请参阅 own answer ),但我想知道是否可以通过更少的函数调用或以其他我没有想到的方式。

最佳答案

使用 patch 的无循环解决方案:

这是一个无需循环即可为 patch 生成坐标的解决方案:

function column_highlight(hA, data, selectionVal)

assert(nargin >= 2);
if (nargin < 3) || isempty(selectionVal)
selectionVal = 1;
end

nCol = size(data, 2);
data = diff([false(1, nCol); (data == selectionVal); false(1, nCol)]);
[r, c] = find(data);
r = reshape(r-0.5, 2, []);
c = c(1:2:end);
X = [c-0.5 c+0.5 c+0.5 c-0.5].';
Y = r([1 1 2 2], :);
patch(hA, 'XData', X, 'YData', Y, 'FaceColor', 'none');

end


使用 regionprops 的解决方案:

如果您有 Image Processing Toolbox ,您可以通过标记每个屏蔽列部分并使用 regionprops 获取 'BoundingBox' 形状度量来解决此问题:

function column_highlight(hA, data, selectionVal)

assert(nargin >= 2);
if (nargin < 3) || isempty(selectionVal)
selectionVal = 1;
end

labelMat = bsxfun(@times, (data == selectionVal), 1:size(data, 2));
coords = regionprops(labelMat, 'BoundingBox');
coords = vertcat(coords.BoundingBox);
coords(:, 3:4) = coords(:, 1:2)+coords(:, 3:4);
X = coords(:, [1 3 3 1]).';
Y = coords(:, [4 4 2 2]).';
patch(hA, 'XData', X, 'YData', Y, 'FaceColor', 'none');

end

关于matlab - 围绕具有相同值的垂直像素组绘制矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45965920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com