我有一张图片
我想做的就是这个。
做了一些操作后,我应该可以重新组合图像以获得最终结果。我的代码就是这个
clc;
clear all;
close all;
tic
I = imread('ChanVese.jpg');
I = imresize(I,[128 128]);
Img=I;
I = double(I(:,:,1));
figure();
imshow(Img);
%//As there are 3 figures
crop_pos = zeros(3,4);
new_image = zeros(size(I));
c = cell(1,3);
for i=1:3
%//Sub-divide the image
h = imrect(gca);
%//To make the rect function bounded within the image size
addNewPositionCallback(h,@(p) title(mat2str(p,3)));
fcn = makeConstrainToRectFcn('imrect',get(gca,'XLim'),get(gca,'YLim'));
setPositionConstraintFcn(h,fcn);
crop_area = wait(h)
crop_pos(i,:) = (crop_area);
%//cropped is the new cropped image on which we will do our operation
cropped = (imcrop(Img, crop_area));
c{i} = cropped;
%//Do operation on the image
%***************************
%code to be written
%***************************
%//Insert the part-image back into the image
new_image(crop_pos(i,2):crop_pos(i,4),crop_pos(i,1):crop_pos(i,3)) = c{i};
end
imagesc(new_image,[0 255]),colormap(gray);axis on
toc
我的问题在于正确的功能:我将尝试举例说明。即使我选择了尺寸为[128x128]的整个图像, 我得到crop_pos的输出为
[x,y,w,h] = [0.5,0.5,128,128]
然而,它实际应该是
[x,y,w,h] = [1,1,128,128];
有时宽度和高度也以浮点形式给出。为什么会这样?我相信matlab将图像处理为矩阵,并将其转换为离散组件。所以所有值都应该是整数。
我该如何解决这个问题?
答案 0 :(得分:2)
在大多数情况下,对我来说,我写得足够
crop_area = round(wait(h))
而不是
crop_area = wait(h)
正如我所注意到的,imrect
在以下情况下表现得很奇怪:
makeConstrainToRectFcn
的约束,然后被移动/调整大小到限制但这些是我个人的观察。在这种情况下,我甚至不知道平台相关的问题。
修改强>
如果图像小于屏幕,则可以使用imshow(Image, 'InitialMagnification',100);
解决 1 st 问题。否则,您需要imscrollpanel
和imoverviewpanel
。
答案 1 :(得分:0)
区别的原因是imrect,imcrop等使用的rect描述不是指像素中心,而是指像素边界。正如imcrop的文档中所述:
因为rect是根据空间坐标指定的,所以宽度和 rect的height元素并不总是与大小完全对应 输出图像。例如,假设rect是[20 20 40 30],使用 默认的空间坐标系。的左上角 指定的矩形是像素的中心(20,20)和 右下角是像素的中心(50,60)。所结果的 输出图像是31×41,而不是30×40,因为输出图像 包括输入图像中完全或所有像素 部分封闭
您的解决方案是将矩形向量转换为行和列索引,例如使用
等函数function [x,y] = rect2ind(rect)
%RECT2IND convert rect vector to matrix index vectors
% [x,y] = rect2ind(rect) converts a rect = [left top width height] vector
% to index vectors x and y (column and row indices, respectively), taking
% into account that rect spedifies the location and size with respect to
% the edge of pixels.
%
% See also IMRECT, IMCROP
left = rect(1);
top = rect(2);
width = rect(3);
height = rect(4);
x = round( left + 0.5 ):round( left + width - 0.5 );
y = round( top + 0.5 ):round( top + height - 0.5 );