Использование imfreehand в вашей программе

Например, я запускаю свою программу следующим образом, читая какое-то изображение:

I=input('image name: ','s');
img=double(imread(I));

Я планирую работать только с некоторой частью этого изображения. Итак, я заметил, что мне может понадобиться h=imfreehand для этой цели.

Таким образом, я вставил h=imfreehand под двумя строками выше. Что у меня получилось, так это белый экран. Итак, как я могу получить изображение и выбрать нужный регион? Другое дело, как я могу заставить свою программу работать только с тем регионом, который я выбрал?

Спасибо.

ОБНОВЛЕНИЕ

Я сделал следующее в части моего кода:

figure, imshow(img);
h = imfreehand;
position = wait(h);

% post processing
se=strel('disk',3);
erosion=imerode(h,se);
result_image=imsubtract(h,erosion);.

Но я получил следующую ошибку:

Error using imerode
Expected input number 1, IM, to be one of these types:

numeric, logical

Instead its type was imfreehand.

Error in morphop>CheckInputImage (line 335)
validateattributes(A, {'numeric' 'logical'}, {'real' 'nonsparse'}, ...

Error in morphop>ParseInputs (line 166)
A = CheckInputImage(A, func_name);

Error in morphop (line 14)
[A,se,pre_pad,...

Error in imerode (line 123)
B = morphop(A,se,'erode',mfilename,varargin{:});

Error in program (line 155)
erosion=imerode(h,se);

Это связано с erosion? Что можно сделать в этом случае?

`


person Simplicity    schedule 01.08.2013    source источник


Ответы (3)


Следуя совету в документации matlab, попробуйте следующее:

I=input('image name: ','s');
img=imread(I);
figure, imshow(img);
h = imfreehand;
position = wait(h); 

Изменить:

Документация предлагает в качестве альтернативы

figure, imshow(img);
h = imfreehand(gca);
person Buck Thorn    schedule 01.08.2013
comment
Спасибо за ваш ответ. Попробовав ваше решение, я получил следующую ошибку: Error using var (line 59) First argument must be single or double. Error in std (line 32) y = sqrt(var(varargin{:})); Error in @(x)std(x(:)) Error in nlfilter (line 61) b = mkconstarray(class(feval(fun,aa(1+rows,1+cols),params{:})), 0, size(a)); Error in program (line 38) standard_deviation_matrix=nlfilter(img,[5 5],fun_standard_deviation); - person Simplicity; 01.08.2013
comment
Когда я применяю свой остальной код, он применяет операции к региону, который я выбрал по умолчанию, или я должен указать программе, с чем работать? Спасибо - person Simplicity; 01.08.2013
comment
Вы применяете операции над дескриптором h к объекту, созданному imfreehand. Я бы проверил методы, которые вы можете использовать с объектом от руки, сгенерированным imfreehand, перечисленные в документации. Вы управляете объектом, используя его дескриптор h, например, вы можете создать маску с помощью BW = createMask(h) - person Buck Thorn; 01.08.2013

Попробуйте передать дескриптор сюжета imfreehand()

I=input('image name: ','s');
img=double(imread(I));

figure;
ih=image(img);
h=imfreehand(ih)

Извините, у меня нет набора инструментов для обработки изображений, чтобы проверить это.

person mor22    schedule 01.08.2013
comment
Почти точный клон, обыгранный на 19 сек! - person Buck Thorn; 01.08.2013
comment
Стараюсь не. Делай... или не делай. - person Buck Thorn; 01.08.2013
comment
@mor22. Спасибо за ваш ответ. Я получил эту ошибку, когда попробовал ваше решение: Error using imfreehand>imfreehandAPI (line 156) HPARENT must be able to have an hggroup object as a child. Error in imfreehand (line 83) [h_group,draw_api] = imfreehandAPI(varargin{:}); Error in program (line 8) h=imfreehand(ih); - person Simplicity; 01.08.2013
comment
Извините, я не могу проверить это, потому что у меня нет набора инструментов для обработки. оформить заказ mathworks.co.uk/help/matlab/ref/hggroup.html - person mor22; 01.08.2013

Похоже, преобразование вашего изображения (возможно, uint8) в double вызывает проблему.

Я бы либо сделал:

  • используйте исходную кодировку изображения (например, img_uint8 = imread('coins.png') кодируется целыми числами). Проблема в том, что вы, вероятно, не сможете использовать imfreehand, так как ему нужно читать числа с двойной или одинарной точностью.
  • преобразовать изображение с помощью img_double = double(imread('coins.png')), чтобы imfreehand работало. Однако преобразование вызывает проблему с отображением, которую можно обойти с помощью imshow(img_double,[]), аналога imshow(img_double, [min(min(img_double)), max(max(img_double))]). Это заставляет imshow правильно использовать весь диапазон данных (255 против 255.0).

Поэтому лучший вариант - второй.

Чтобы использовать imfreehand, @Try Hard дал хороший код h = imfreehand или h = imfreehand(gca)

person marsei    schedule 01.08.2013