正确理解不正确的matlab操作

时间:2013-07-31 07:53:38

标签: image matlab image-processing crop segment

我有一张图片

3 FIGURES

我想做的就是这个。

3 FIGURES

做了一些操作后,我应该可以重新组合图像以获得最终结果。我的代码就是这个

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将图像处理为矩阵,并将其转换为离散组件。所以所有值都应该是整数。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

在大多数情况下,对我来说,我写得足够

crop_area = round(wait(h))

而不是

crop_area = wait(h)

正如我所注意到的,imrect在以下情况下表现得很奇怪:

  • 图像放大或缩小,因此物理屏幕像素与图像像素一一对应(缩放级别〜= 100%)
  • 矩形具有makeConstrainToRectFcn的约束,然后被移动/调整大小到限制

但这些是我个人的观察。在这种情况下,我甚至不知道平台相关的问题。

修改

如果图像小于屏幕,则可以使用imshow(Image, 'InitialMagnification',100);解决

1 st 问题。否则,您需要imscrollpanelimoverviewpanel

答案 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 );