Image 约束矩形ROI的阻力(Matlab)
我有一个简单的程序,用另一幅图像中的相应区域替换一幅图像中的选定区域。我尝试使用Image 约束矩形ROI的阻力(Matlab),image,matlab,image-processing,Image,Matlab,Image Processing,我有一个简单的程序,用另一幅图像中的相应区域替换一幅图像中的选定区域。我尝试使用imrect()和makeConstrainToRectFcn来选择一个不能超出图像边界的矩形ROI 但是,当我运行代码时,最初可以绘制ROI以包括图像帧之外的区域。这会导致错误:索引超过矩阵维度 有没有办法从一开始就不能在图像外部绘制矩形?或者,是否可以确保操作不会执行,除非矩形约束在轴限制内 如有任何建议,将不胜感激 我的代码: % Sample images: X=imread('office_1.jpg');
imrect()
和makeConstrainToRectFcn
来选择一个不能超出图像边界的矩形ROI
但是,当我运行代码时,最初可以绘制ROI以包括图像帧之外的区域。这会导致错误:索引超过矩阵维度
有没有办法从一开始就不能在图像外部绘制矩形?或者,是否可以确保操作不会执行,除非矩形约束在轴限制内
如有任何建议,将不胜感激
我的代码:
% 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)
这应该可以做到:
% 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
该脚本已经在Matlab2017a下进行了测试,并按预期工作。如您所见,主要区别在于处理大小约束的方式:在您的例子中,在命中
wait
之前未正确应用大小约束,因此返回无效的矩形。此外,为了避免错误的偏移,已将round
函数应用于矩形。对不起,我已修复了我的答案,现在代码也应正确处理这些情况。