Обработка изображений в SciLab (преобразование изображения в сепию)

#image-processing #scilab

#обработка изображений #scilab

Вопрос:

Я делаю свою домашнюю работу, и у меня возникла проблема. Моя задача — написать функцию в SciLab, которая преобразует обычное изображение в сепию. Я должен использовать алгоритм, который умножает красный цвет на альфа и синий цвет на бета, где альфа> 1 и бета < 1 и альфа бета = 2.

Это мой код. По какой-то причине эти 2 строки не работают должным образом:

 //img2(i,j,2) = img(i,j);
//img2(i,j,3) = uint8(double(img(i,j))*beta);

function out = Ex2(im,alpha)
[h w d] = size(im);
img2 = uint16(zeros(h,w,d));
img = rgb2gray(im);
beta = 2-alpha;
for i=1:h
    for j=1:w
        img2(i,j,1) = uint16(double(img(i,j))*alpha); //condition if > 255
        if img2(i,j,1) > 255 then
            img2(i,j,1) = 255;
        end
        //img2(i,j,2) = img(i,j);
        //img2(i,j,3) = uint8(double(img(i,j))*beta);
    end
end
out = img2;
endfunction
  

Комментарии:

1. приведите примеры альфа- и бета-версий. Кроме того, что с // ? это не комментарии matlab. Пожалуйста, опубликуйте реальную функцию matlab. Я предполагаю, что это может быть scilab?

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

3. Да, это SciLab, помеченный также как MatLab, потому что я думаю, что эти 2 программы очень похожи, примером вызова этой функции является Ex2 (myimage, 1.2);

4. Я удалил тег MATLAB. Однако в MATLAB это работает как есть. если я запущу imshow(Ex2(imread('peppers.png'),1.3)) , появится красивое изображение в сепии. Единственное, что я изменил, это синтаксис MATLAB (например, enfucntion), и я добавил out = uint8(img2); в конце

5. По какой-то причине, когда я пытаюсь запустить эту функцию в SciLab, она просто выдает мне синий загрузочный круг, поэтому я должен заставить SciLab остановить вызов этой функции.

Ответ №1:

Есть более простой способ получить результат

 function sepia2(img)
    img = rgb2gray(img);
    img = uint16(img);
    [h w] = size(img);

    W = 30;

    for i=1:h
        for j=1:w
            if (img(i,j)   (2*W)) > 255 then
                out(i,j,1) = 255;
                else
                out(i,j,1) = (img(i,j)   (2*W));
            end
            if (img(i,j)   (W)) > 255 then
                out(i,j,2) = 255;
                else
                out(i,j,2) = (img(i,j)   (W));
            end
            out(i,j,3) = img(i,j);
        end
    end

    out = uint8(out);
    imshow(out);
endfunction

img = imread('lena3.jpg');
sepia1(img);