限制矩形ROI(Matlab)的拖拽

时间:2018-01-20 11:57:30

标签: image matlab image-processing

我有一个简单的程序,它将一个图像的选定区域替换为另一个图像中的相应区域。我正在尝试将imrect()makeConstrainToRectFcn结合使用,以选择无法超出图像边界的矩形ROI。

但是,当我运行代码时,最初可以绘制ROI以包括图像框外的区域。这会导致错误:Index exceeds matrix dimensions

有没有办法从一开始就无法在图像外部绘制矩形?或者,是否可以确保操作不会执行,除非矩形被限制在轴限制内?

任何建议都将不胜感激。

我的代码:

% Sample images:
X=imread('office_1.jpg');
Y=imread('office_5.jpg');

figure, imshow(X)
h = imrect;
api = iptgetapi(h);
fcn = makeConstrainToRectFcn('imrect',get(gca,'XLim'),...
   get(gca,'YLim'));
api.setPositionConstraintFcn(fcn);

wait(h);
rect = getPosition(h);
x1 =rect(1);
x2 = x1 + rect(3);
y1 =rect(2);
y2 = y1 + rect(4);

Z = X; % Initialize
Z(y1:y2, x1:x2, :) = Y(y1:y2, x1:x2, :);

imshow(Z)

1 个答案:

答案 0 :(得分:1)

这应该做的工作:

% Sample images:
X = imread('office_1.jpg');
Y = imread('office_5.jpg');

% Show image X:
figure, imshow(X);

% Define the ROI constraint:
h = imrect();
h.setPositionConstraintFcn(@(p) roi_constraint(p,size(X)));

% Wait for the ROI to be confirmed:
roi = round(wait(h));
x1 = roi(1);
x2 = x1 + roi(3);
y1 = roi(2);
y2 = y1 + roi(4);

% Create the final image Z and display it:
Z = X;
Z(y1:y2,x1:x2,:) = Y(y1:y2,x1:x2,:);
imshow(Z);

% Auxiliary function for ROI constraint:
function p_adj = roi_constraint(p,img_size)
    p_adj(1) = max([1 p(1)]);
    p_adj(2) = max([1 p(2)]);
    p_adj(3) = min([(img_size(2) - 1) p(3)]);
    p_adj(4) = min([(img_size(1) - 1) p(4)]);
end

该脚本已在Matlab 2017a下测试并按预期工作。正如您所看到的,主要区别在于处理大小约束的方式:在您的情况下,在wait被命中之前未正确应用它,从而返回无效矩形。此外,为了避免错误的偏移,round函数已应用于矩形。