Для циклов в Matlab итерация только 128 раз - PullRequest
1 голос
/ 03 мая 2019

Я пытаюсь закодировать фильтр обнаружения лапласовых краев в MATLAB.

У меня есть 4 вложенных цикла.Первые два перебирают каждый пиксель изображения, а последние два перебирают матрицу 9x9 вокруг этого пикселя.Для каждой итерации код умножает каждую ячейку матрицы на соответствующий ей пиксель и добавляет к сумме для матрицы.

Проблема в том, что первые два цикла for повторяются только 128 раз, как показано на верхнем изображении здесь.

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

for x = 1: imgWidth
    for y = 1: imgHeight 
        sum = 0;
        for maskX = (-1 * n):(n)
            for maskY = (-1*n): (n)
                if ((x + maskX) >= 1 && (x + maskX) <= imgWidth && (y + maskY) >= 1 && (y + maskY) <= imgHeight) 
                    sum = sum + int16(IMG(x + maskX,y + maskY)) * int16(mask(maskX + n + 1,maskY + n + 1)) ;
                end
            end
        end
        finalValue = (sum - minSum)/mult;
        rFinal(x,y) = finalValue;
    end
end

Результатом должны быть края основного изображения.Если края нет, пиксель должен иметь значение 127, но если он есть, одна сторона края будет очень темной, содержащей меньшее значение пикселя, а другая сторона края должна быть яркой и содержать более высокуюзначение пикселя.Это относится к первому блоку размером 128x128 пикселей, однако для остальной части изображения результат является неожиданным.Независимо от того, какой размер изображения я ввожу, результат будет правильным только для этого небольшого блока 128x128.

Кто-нибудь знает, почему это происходит?Может ли быть проблема переполнения памяти с MATLAB?Когда я запускаю программу, на моем компьютере используется менее 50% процессора, поэтому я сомневаюсь, что это проблема.Я также сомневаюсь, что с кодом что-то не так, поскольку я просмотрел его и несколько раз протестировал, но, если вы найдете что-то, не стесняйтесь указывать на это!Спасибо!

1 Ответ

0 голосов
/ 03 мая 2019

Чтобы отфильтровать ваше изображение IMG с помощью линейного фильтра, заданного mask, используйте conv2:

conv2(IMG,mask,'same');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...