3

イメージがありますが、

3つの図.

私はこれをやりたかった:

3つの図

いくつかの操作を行った後、画像を再結合して最終結果を得ることができるはずです。私のコードはこれです:

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 three 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

私の問題は imrect 関数にあります。例を挙げてみます。サイズが [128x128] の画像全体を選択しても、crop_pos の出力は次のようになります。

[x,y,w,h] = [0.5, 0.5, 128, 128]

一方、実際にはそうあるべきです

[x, y, w, h] = [1, 1, 128, 128];

また、幅と高さが浮動小数点で指定されることもあります。これはなぜですか?MATLAB は画像を行列として扱い、そうすることでそれらを個別のコンポーネントに変換すると思います。したがって、すべての値は整数でなければなりません。

どうすればこの問題を解決できますか?

4

2 に答える 2

2

私にとっては、ほとんどの場合、書くだけで十分です

crop_area = round(wait(h))

それ以外の

crop_area = wait(h)

私が気づいたように、次のimrect場合に奇妙な動作をします。

  • 画像がズームインまたはズームアウトされるため、物理的な画面ピクセルが画像ピクセルと 1 対 1 で一致しません (ズーム レベル ~= 100%)
  • 長方形に制約がmakeConstrainToRectFcnあり、制限に移動/サイズ変更されました

しかし、これらは私の個人的な観察です。この場合、プラットフォーム関連の問題さえあるかもしれませんが、私にはわかりません。

最初の問題imshow(Image, 'InitialMagnification',100);は、画像が画面よりも小さい場合に解決される場合があります。imscrollpanelそれ以外の場合は、 andが必要ですimoverviewpanel

于 2013-07-31T08:11:04.373 に答える
0

この違いの理由は、imrect や imcrop などで使用される rect の記述が、ピクセルの中心ではなく、ピクセルの境界を参照しているためです。imcrop のドキュメントに記載されているとおり:

rect は空間座標で指定されるため、rect の幅要素と高さ要素は常に出力イメージのサイズと正確に対応するとは限りません。たとえば、デフォルトの空間座標系を使用して、rect が [20 20 40 30] であるとします。指定された長方形の左上隅はピクセル (20,20) の中心であり、右下隅はピクセル (50,60) の中心です。結果の出力イメージは 30 x 40 ではなく 31 x 41 になります。これは、入力イメージ内の完全または部分的に囲まれたすべてのピクセルが出力イメージに含まれるためです。

解決策は、次のような関数を使用して、rect ベクトルを行インデックスと列インデックスに変換することです。

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 specifies 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);
于 2015-03-06T18:21:02.677 に答える