Я хочу контролировать прозрачность патчей с помощью ползунка, который пишется на изображении в другом наборе фигур в Matlab? - PullRequest
0 голосов
/ 29 августа 2011

У меня есть фигура с ползунком, а затем я хочу иметь внешнюю фигуру, которая отображается на изображении.Я хочу иметь возможность использовать ползунок, чтобы изменить патчи прозрачности, которые я рисую на изображении.

В настоящее время это работает, но при каждом перемещении ползунка создается новое изображение.Я бы хотел, чтобы патч обновлялся на текущем изображении вместо открытия нового окна.

Мне было трудно понять это.Я думаю, что мне нужно определить рисунок изображения и маркеры за пределами обратного вызова ползунка, но я не могу понять это.У меня есть некоторые из моего кода ниже.

Я обновил свой код, чтобы включить ваши предложения.Однако я получаю эту ошибку

??? Error using ==> set
Invalid property found.
Object Name :  root
Property Name :  'FaceAlpha'.

Error in ==> readraw4>slider_callback at 539
        set(hpatch, 'FaceAlpha',alpha)

Я не уверен, как это исправить или что идет не так.Все остальное, похоже, работает.

hFig = figure('menubar','none');
hAx = axes('Parent',hFig);

hSlider = uicontrol('Parent',hFig, 'Style','slider', ...
    'Value',0.5, 'Min',0, 'Max',1, 'SliderStep',[1 10]./100, ...
    'Units','pixels', 'Position',[10 10 200 20], ...
    'Callback',@slider_callback);
hTxt = uicontrol('Parent',hFig, 'Style','text', 'String','0.5', ...
    'Units','pixels', 'Position',[290 28 30 15]);

imshow(im,'DisplayRange', [0.05 0.4], 'Parent',hAx)

hpatch = [];

for i =1:200

    if spectImage(i) == 1
        %disp('hi');
        hpatch(i) = patch([x2(i+18) x2(i+19) x2(i+2) x2(i+1)],[y2(i+18) y2(i+19) y2(i+2) y2(i+1)],[0 0 0 0],'Parent',hAx, 'FaceColor','r', 'EdgeColor','none', 'FaceAlpha',0.5)
        else
            hpatch(i) = patch([x2(i+17) x2(i+18) x2(i+1) x2(i)],[y2(i+17) y2(i+18) y2(i+1) y2(i)],[0 0 0 0],'Parent',hAx, 'FaceColor','r', 'EdgeColor','none', 'FaceAlpha',0.5);
    end
end


function slider_callback(hObj,eventdata)
    %# get new alpha value
    alpha = get(hObj,'Value');

    %# update patches transparency and label
    set(hTxt, 'String',num2str(alpha,'%.02f'))
    set(hpatch, 'FaceAlpha',alpha)
end

1 Ответ

1 голос
/ 30 августа 2011

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

Вот рабочий пример. Я использую вложенную функцию для обмена данными, но вы можете явно передать необходимые дескрипторы, если вы предпочитаете:

function patchAlphaSliderGUI()
    %# read image, and create patches locations
    img = imread('coins.png');
    BW = imfill(im2bw(img),'holes');
    B = bwboundaries(BW,8);

    %# setup GUI
    hFig = figure('menubar','none');
    hAx = axes('Parent',hFig);
    hSlider = uicontrol('Parent',hFig, 'Style','slider', ...
        'Value',0.5, 'Min',0, 'Max',1, 'SliderStep',[1 10]./100, ...
        'Units','pixels', 'Position',[150 5 300 20], ...
        'Callback',@slider_callback);
    hTxt = uicontrol('Parent',hFig, 'Style','text', 'String','0.5', ...
        'Units','pixels', 'Position',[290 28 30 15]);

    %# draw image and patches
    imshow(img, 'Parent',hAx)
    hPatch = zeros(numel(B),1);
    for i=1:numel(B)
        hPatch(i) = patch('XData',B{i}(:,2), 'YData',B{i}(:,1), ...
            'Parent',hAx, 'FaceColor','r', 'EdgeColor','none', 'FaceAlpha',0.5);
    end

    function slider_callback(hObj,eventdata)
        %# get new alpha value
        alpha = get(hObj,'Value');

        %# update patches transparency and label
        set(hTxt, 'String',num2str(alpha,'%.02f'))
        set(hPatch, 'FaceAlpha',alpha)
    end
end

screenshot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...