2013-12-19 6 views
1

Я очень новый программист (это мое второе упражнение), и меня попросили сменить изображение (из Галактики) на синусоидальный сдвиг. Я пытался написать программу, чтобы сделать это следующим образом:Обработка изображений в matlab

Моя программа:

GalaxyImage = imread('hs-2013-06-a-web.jpg'); 
image(GalaxyImage) 
GalaxyImage=double(GalaxyImage)/255; 
image(Sess2GalaxyIm(GalaxyImage)); 

Моя функция:

function [GalaxySlanted] = Sess2GalaxyIm(GalaxyImage) 
    A = 20; 
    k = 3; 
    Y = size(GalaxyImage, 1); 
    X = size(GalaxyImage, 2); 
    max_shift = ceil(A*2); 
    GalaxySlanted = zeros(Y, X+max_shift, 3); 
    for y=1:Y 
     local_shift = ceil(A*sind(k*y)); 
     local_x = 1:X; 
     local_x = local_x + local_shift; 
     GalaxySlanted(y, local_x, :)=GalaxyImage(y, :, :); 
    end 
end 

В тот момент, когда я запускаю его, кажется, просто смещать мой образ на постоянную сумму, и я не понимаю, почему.

+1

Можете ли вы указать, что делает синусоидальный сдвиг и почему ваш код не работает? – Acorbe

+0

@Acorbe Это сдвиг оси x синусоидальной волной, создающий искаженное изображение (прямые в y становятся синусоидальными волнами в y). После запуска моего кода изображение кажется неизменным, кроме него все смещено вправо, а черный прямоугольник теперь слева. – user3120143

ответ

0

Там это возможная проблема с тем, как вы определяете local_x. Вы начинаете, добавляя некоторое дополнение на изображение, чтобы компенсировать тот факт, что выход х может быть до «А» пикселей сдвинуты на обе стороны:

max_shift = ceil(A*2); 
GalaxySlanted = zeros(Y, X+max_shift, 3); 

Однако, в цикле, вы игнорируете это и только начало off с local_x как 1: X - так что если результат от sind отрицательный, вы будете пытаться индексировать отрицательные числа в GalaxySlanted и получить результирующую ошибку. Изменение этой строки до local_x = (1:X)+A; должно работать (с модификацией сдвига oMiD).

Еще одно примечание - на самом деле есть функция im2double, которая будет обрабатывать преобразование изображений и масштабирование за один раз.

+0

А, да, большое спасибо, это исправлено сейчас. – user3120143

4

сдвиг вашего изображения является постоянным, поскольку в local_shift = ceil(A*sind(k*Y)); вы использовали постоянные значения A, K и Y. может быть эта модификация делает ваш код правильный :(у вместо Y)

local_shift = ceil(A*sind(k*y)); 
+0

Спасибо, это кажется очень логичным изменением, я вложил его, но он ничего не изменил. – user3120143

Смежные вопросы