Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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
Image 约束矩形ROI的阻力(Matlab)_Image_Matlab_Image Processing - Fatal编程技术网

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
函数应用于矩形。

对不起,我已修复了我的答案,现在代码也应正确处理这些情况。