Допустим, я создал изображение зебры, и в определенном месте в пикселях я бы хотел, чтобы линии «вибрировали» туда-сюда на определенных частотах в последовательности изображений времени t
, предпочтительно с субпиксельным сдвигом. Обведенная область - это самая значительная область, которую я намеревался имитировать.
Изображение зебры можно получить с помощью следующего кода:
m=75;
n=75;
stripe_px=1;
single_pattern=[ones(m,stripe_px),zeros(n,stripe_px)];
zebra=repmat(single_pattern,[1 ceil(n/stripe_px*2)]);
zebra=zebra(:,1:n);
А интересующая область для усиления значимого местоположения, как показано на рисунке ниже (как обведенная область на изображении зебры выше):
Эту форму можно легко воспроизвести, используя код формулы:
X=repmat(1:m,[n 1]);
Y=repmat((1:n)',[1 m]);
Shape=0.04*( ((((X/m)-0.75).^2).*X) - ((((Y/n)-0.75).^2).*Y) );
Теперь, основываясь на этой форме, как мне «вибрировать / деформировать» в горизонтальном направлении (только) области представляет интерес с определенной частотой для последовательности изображений. Визуально это выглядит примерно так:
Я смотрел на imwarp
( ссылка ), но я не уверен, что он может сдвигать локальные пиксели, где обычно это было предназначено для преобразования всего изображения, кроме того, я не уверен, как правильно использовать его в моем случае. Простой псевдокод для изображения того, чего я пытаюсь достичь:
omega=3;
T=30;
Fs=20;
dt=1/Fs;
for t=0:dt:T
vibrate_im=(zebra + Shape) * sin(omega*t);
end
Есть идеи, как это сделать? Спасибо, что нашли время, читая это, ценим любую помощь!