Matlab, AppDesigner-Преобразование изображения в хороший тип и использование его в функции «imread» - PullRequest
0 голосов
/ 28 января 2019

Я использую AppDesigner inMATLAB, чтобы показывать фотографии с измененным RGB.Но есть проблема с характером фотографии.

  1. Когда я включаю свою собственную функцию «changeRGB», наконец, «choosenImage» имеет 20 байтов, класс «char» и размер (1x10).ОК!

  2. Нет проблем при использовании «функции OpenButtonValueChanged».ОК!

  3. Проблема с «функцией UploadButtonPressed».OK!

О ПРОБЛЕМЕ: Когда я нажимаю кнопку с обратным вызовом «function UploadButtonPressed», я получаю сообщение об ошибке: «Ошибка использования imread> parse_inputs (строка 502) Имя файла или аргумент URLдолжен быть символьным вектором или строковым скаляром. "

" Ошибка в imread (строка 342) [source, fmt_s, extraArgs, was_cached_fmt_used] = parse_inputs (cached_fmt, varargin {:}); "

ЗАЧЕМ?Потому что в «функции UploadButtonPressed» мой choosenImage имеет 1977624 байта, класс «uint8» и размер (681x968x3).Так что это слишком ошибка для "imread".

ЧТО Я ПОПЫТАЛ:

  • Когда в "функции OpenButtonValueChanged" я конвертирую фотографию, добавляя "char": (myimage = char (app.clickedImage));класс фотографии меняется с uint8 на char, но размер.
  • Когда я использую «num2cell», claas фотографии меняется на «ячейку», но размер и количество байтов одинаковы, поэтомубольшой.И я получаю сообщение об ошибке: «Ошибка при использовании imread> parse_inputs (строка 502). Имя файла или аргумент URL должны быть символьным вектором или строковым скаляром».

В своей собственной функции «changeRGB» я использовал"imread (изображение)", и здесь проблема с размером фотографии.Вы знаете, как получить правильный?

%my own properties in AppDesigner- to use them in different functions 
properties (Access = public)
    clickedImage;
    addR = 1;
    addG = 1;
    addB = 1;
end

%first function in AppDeesigner
function OpenButtonValueChanged(app, event)
        value = app.OpenButton.Value;
        [file, howManyFiles] = chooseImagesFromComputer; %myown function

        %I load 3 images which are showed as miniatures
        myFile1 = imread(file{1});
        imshow(myFile1, 'Parent', app.UIAxes1_1);
        myFile2 = imread(file{2});
        imshow(myFile2, 'Parent', app.UIAxes1_2);
        myFile3 = imread(file{3});
        imshow(myFile3, 'Parent', app.UIAxes1_3);


        %take values of changed RGB from the slider
        app.addR = app.SliderR.Value
        app.addG = app.SliderG.Value
        app.addB = app.SliderB.Value

        %work only on one image to change its colors. app.clickedImage, app.addR, app.addG, app.addB are properties at the beginning of the code
        app.clickedImage = file{1};
        app.clickedImage = changeRGB(app.clickedImage,app.addR,app.addG,app.addB); %changeRGB- my own function- here is the problem. I add it bottom
        imshow(app.clickedImage,'Parent',app.UIAxesMain);
    end

%second function in AppDesigner
%here is the button to upload color of the photo
function UploadButtonPushed(app, event)
        myimage = app.clickedImage;
        myimage = changeRGB(myimage,app.addR,app.addG,app.addB);
        imshow(myimage);
    end


%here is my own function in matlab, not in AppDesigner, which makes problem:
function [changedImage] = changeRGB(choosenImage, addR, addG, addB)
 whos
 loadedImage = imread(choosenImage);

 R = loadedImage(:,:,1); %extract one of the color channels
 G = loadedImage(:,:,2);
 B = loadedImage(:,:,3);
 RBG = cat(3,R,G,B);

 R_adj2 = R + addR;
 G_adj2 = G + addG;
 B_adj2 = B + addB;
 changedImage = cat(3,R_adj2,G_adj2,B_adj2);
end

1 Ответ

0 голосов
/ 28 января 2019

Сначала вы делаете ненужные операции в changeRGB

function [changedImage] = changeRGB(choosenImage, addR, addG, addB)
   loadedImage = imread(choosenImage);
   loadedImage = bsxfun(@sum, loadedImage, reshape([addR, addG, addB], [1 1 3]);
end

Затем эта функция возвращает массив (измененный образ), поэтому в UploadButtonPushed(app, event) при запуске myimage = app.clickedImage; вы передаете измененныймассив вместо пути к изображению, который вы здесь установили app.clickedImage = changeRGB(app.clickedImage,app.addR,app.addG,app.addB);

Таким образом, вы должны изменить дизайн ваших переменных, потому что app.clickedImage сохраняет либо путь к изображению, либо само изображение.Рассмотрите возможность использования двух разных переменных.

Хороший совет также заключается в использовании отладчика matlab , который действительно поможет найти источник проблем такого рода.

...