Номер профиля обеспечения iOS в Xcode

Очень жаль, что вы не можете использовать некоторые из встроенных методов из Image Processing Toolbox, чтобы помочь вам выполнить эту задачу. Однако мы все еще можем делать то, что вы просите, хотя это будет немного сложнее. Я все еще собираюсь использовать некоторые функции из IPT, чтобы помочь нам делать то, что вы просите. Кроме того, я собираюсь предположить, что ваше изображение имеет оттенки серого. Я оставлю это вам, если вы хотите сделать это для цветных изображений.


Создать гауссовую маску

Что вы можете сделать, это создать сетку 2D пространственных ко- ординат с использованием meshgrid , который имеет тот же размер, что и созданная вами маска фильтра Гаусса. Я собираюсь предположить, что N является странным, чтобы облегчить мою жизнь. Это позволит пространственным координатам быть симметричными по всей маске.

Если вы помните, 2D-гауссов можно определить как:

[/g7]

Коэффициент масштабирования перед экспонентой в первую очередь связан с обеспечением того, чтобы область под гауссовой составляла 1. Мы будем заниматься этой нормализацией по-другому, где мы генерируем коэффициенты Гаусса без коэффициента масштабирования, затем просто суммируйте все коэффициенты в маске и разделите каждый элемент на эту сумму, чтобы обеспечить единицу площади.

Предполагая, что вы хотите создать фильтр N x N и с заданным стандартным отклонением sigma, код будет выглядеть примерно так: h, представляющий ваш фильтр Гаусса.

%// Generate horizontal and vertical co-ordinates, where
%// the origin is in the middle
ind = -floor(N/2) : floor(N/2);
[X Y] = meshgrid(ind, ind);

%// Create Gaussian Mask
h = exp(-(X.^2 + Y.^2) / (2*sigma*sigma));

%// Normalize so that total area (sum of all weights) is 1
h = h / sum(h(:));

Если вы проверите это с помощью fspecial, для нечетных значений N вы см., что маски совпадают.


Отфильтровать изображение

Основы фильтрации изображения для каждого пикселя на вашем входном изображении, вы берете пиксельную окрестность, которая окружает это пиксель, который имеет тот же размер, что и ваша гауссовская маска. Вы выполняете поэтапное умножение с этой областью пикселей с гауссовой маской и суммируете все элементы вместе. Полученная сумма - это то, что выходной пиксель будет в соответствующем пространственном местоположении на выходном изображении. Я собираюсь использовать im2col , который займет пиксельные окрестности и превратит их в столбцы. im2col возьмет каждый из этих столбцов и создаст матрицу, в которой каждый столбец представляет собой один пиксельный район.

Что мы можем сделать дальше, это взять гауссовскую маску и преобразовать ее в вектор столбца. Затем мы возьмем этот вектор-столбец и реплицируем это на столько столбцов, сколько у нас получим из результата im2col, чтобы создать ... назовем это гауссовой матрицей для отсутствия лучшего термина. С помощью этой гауссовской матрицы мы будем производить умножение по элементам с этой матрицей и с выходом im2col. Как только мы это сделаем, мы можем суммировать все строки для каждого столбца. Лучший способ сделать это поэтапное умножение - через bsxfun , и я покажу вам, как его использовать в ближайшее время.

Результатом этого будет ваше отфильтрованное изображение, но это будет один вектор. Вам нужно будет переставить этот вектор обратно в матричную форму с помощью col2im , чтобы получить отфильтрованное изображение. Однако небольшая проблема с этим подходом заключается в том, что он не фильтрует пиксели, где пространственная маска выходит за пределы размеров изображения. Таким образом, на самом деле вам нужно заполнить границу вашего изображения нулями, чтобы мы могли правильно выполнить наш фильтр. Мы можем сделать это с помощью padarray .

Поэтому наш код будет выглядеть примерно так: переходим к вашим переменным, которые вы определили выше:

N = 5; %// Define size of Gaussian mask
sigma = 2; %// Define sigma here

%// Generate Gaussian mask
ind = -floor(N/2) : floor(N/2);
[X Y] = meshgrid(ind, ind);
h = exp(-(X.^2 + Y.^2) / (2*sigma*sigma));
h = h / sum(h(:));

%// Convert filter into a column vector
h = h(:);

%// Filter our image
I = imread(image);
I = im2double(I);
I_pad = padarray(I, [floor(N/2) floor(N/2)]);
C = im2col(I_pad, [N N], 'sliding');
C_filter = sum(bsxfun(@times, C, h), 1);
out = col2im(C_filter, [N N], size(I_pad), 'sliding');

out содержит отфильтрованное изображение после применения гауссовской фильтрующей маски к вашему входному изображению I. Например, допустим, N = 9, sigma = 4. Давайте также использовать cameraman.tif, который является изображением, которое является частью пути системы MATLAB. Используя приведенные выше параметры, а также изображение, это входное и выходное изображение, которое мы получаем:

enter image description here [/g8]

enter image description here [/g9]

13
задан wcochran 23 June 2014 в 03:06
поделиться