Как применить функцию для каждой из различных записей из разных матриц в качестве индекса?

Я пишу функцию в Matlab, которая имитирует встроенную функцию imwarp (применяя геометрическое преобразование) без использования каких-либо циклов. Я нахожусь на последнем этапе, когда мне нужно вызвать свою функцию для билинейной интерполяции для каждого индекса в окончательном 2D-изображении.

У меня здесь 3 массива, «точки» имеют гомогенизированные векторы (x, y, 1), для которых я интерполирую, а «row» и «cols» имеют координаты x и y соответственно для результирующего изображения, в которое будет помещено интерполированное значение интенсивности.

finalImage (rows(1,:),cols(1,:))=bilinear(pts(:,:),im);

Пожалуйста, исправьте мой синтаксис, чтобы все было правильно. заранее спасибо.


person Adeel Ahmad    schedule 14.11.2016    source источник
comment
Билинейное преобразование - это метод преобразования аналогового представления в цифровое (преобразование Лапласа в z-преобразование). Я предполагаю, что вы хотите использовать interp2   -  person jodag    schedule 14.11.2016
comment
Я бы оценил пример этого в соответствии с моим контекстом.   -  person Adeel Ahmad    schedule 14.11.2016
comment
здесь используется билинейная интерполяция для заполнения дырок в преобразованном изображении.   -  person Adeel Ahmad    schedule 14.11.2016


Ответы (1)


Ниже приводится простая реализация применения аффинного преобразования к изображению. Некоторые матрицы могут быть перевернуты, потому что я сделал это по памяти. Я не знаю точно, как вы форматируете свой массив pts, поэтому считаю, что рабочий пример - лучшее, что я могу сделать. Функция interp2 применяет билинейную интерполяцию, функция bilinear выполняет билинейное преобразование, которое описывает аналоговые фильтры как цифровые фильтры. Это не то, что вам нужно.

P.S. Вы должны обязательно использовать обратное преобразование при применении деформации изображения (то есть определить точку, которую вы хотите выбрать во входном изображении для каждой точки в выходном изображении). Если вы выполните прямое преобразование (то есть определите точку в выходном изображении, которой сопоставляется каждая точка во входном изображении), вы получите серьезные эффекты сглаживания и, возможно, дыры в выходном изображении.

Надеюсь это поможет. Дайте мне знать, если у вас возникнут вопросы.

img = double(imread('rice.png'))/255;

theta = 30; % rotate 30 degrees
R  = [cosd(theta) -sind(theta) 0; ...
      sind(theta)  cosd(theta) 0; ...
      0          0          1];

sx = 15; % skew by 15 degrees in x
Skx = [1 tand(sx) 0; ...
       0 1  0; ...
       0 0  1];

% Translate by 1/2 size of image
tx = -size(img, 2)/2;
ty = -size(img, 1)/2;
T = [1 0 tx; ...
     0 1 ty; ...
     0 0 1];

% Scale image down by 1/2
sx = 0.5;
sy = 0.5;
S = [sx 0  0; ...
     0  sy 0; ...
     0  0  1];

% translate, scale, rotate, skew, then translate back
A = inv(T)*Skx*R*S*T;

% create meshgrid points
[x, y] = meshgrid(1:size(img,2), 1:size(img,1));

% reshape so we can apply matrix op
V = [reshape(x, 1, []); reshape(y, 1, []); ones(1, numel(x))];

Vq = inv(A)*V;

% probably not necessary for these transformations but project back to the z=1 plane
Vq(1,:) = Vq(1,:) ./ V(3,:);
Vq(2,:) = Vq(2,:) ./ V(3,:);

% reshape back into a meshgrid
xq = reshape(Vq(1,:), size(img));
yq = reshape(Vq(2,:), size(img));

% use interp2 to perform bilinear interpolation
imgnew = interp2(x, y, img, xq, yq);

% show the resulting image
imshow(imgnew);
person jodag    schedule 14.11.2016
comment
ошибка: Чтобы ИЗМЕНИТЬ ИЗОБРАЖЕНИЕ, количество элементов не должно изменяться. на: xq = reshape (Vq (1, :), size (img)); - person Adeel Ahmad; 14.11.2016
comment
Я сделал это специально для изображения в градациях серого. Если у вас цветное изображение, это не сработает. Если вы используете «ris.png» (встроенный в MATLAB), то это должно сработать (т.е. если вы скопируете и вставите этот код в MATLAB, вы должны получить результат). Если вы делаете 3-канальные изображения, вы можете разделить изображение на 3 изображения (красный, зеленый, синий) и работать с каждым из них независимо. - person jodag; 14.11.2016