2010-05-12 2 views
1

Я хочу метод сдвига изображения без использования встроенных функций (методов) MATLAB. Как я могу это сделать?Как отрегулировать изображение в MATLAB без использования встроенных функций?

+2

Ну, даже добавление и умножение являются встроенными функциями MATLAB, поэтому я утверждаю, что ваша цель невозможна. Возможно, вы должны быть готовы немного поднять эту цель. – 2010-05-12 13:31:41

+1

Возможно, вы имеете в виду без использования инструментария для манипулирования изображениями? – Geoff

ответ

-1

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

1

Давайте генерировать матрицу образца:

image=reshape(1:25,[5 5]) 
image = 

    1  6 11 16 21 
    2  7 12 17 22 
    3  8 13 18 23 
    4  9 14 19 24 
    5 10 15 20 25 

стричь без использования встроенной функции от Matlab, просто сделать переназначение пикселей:

for i=1:size(image,1)-1 
    image(i+1,:)=image(i+1,[end-i+1:end 1:end-i]); 
end 

image = 

    1  6 11 16 21 
    22  2  7 12 17 
    18 23  3  8 13 
    14 19 24  4  9 
    10 15 20 25  5 

сдвигающего это по-другому, и порезы вертикально, должно быть прямым расширением этого.

6

Я предполагаю, что «без использования встроенных функций» означает «не использовать Image Processing Toolbox».

Используя только основные функции MATLAB, обрезку изображений можно выполнить с помощью shear matrix и функции interp2. Матрица сдвига может использоваться для вычисления нового набора сдвиговых координат для пикселей изображения, и затем можно использовать interp2 для интерполяции значений изображения в этих новых координатах. Ниже приведен пример нанесените сдвиг х-направление, чтобы образец картинку:

img = imread('cameraman.tif'); % Read a sample grayscale image 
img = double(img);    % Convert the image to type double 
[nRows, nCols] = size(img);  % Get the image size 
[x, y] = meshgrid(1:nRows, 1:nCols); % Create coordinate values for the pixels 
coords = [x(:).'; y(:).'];   % Collect the coordinates into one matrix 
shearMatrix = [1 0.2; 0 1];   % Create a shear matrix 
newCoords = shearMatrix*coords;  % Apply the shear to the coordinates 
newImage = interp2(img, ...    % Interpolate the image values 
        newCoords(1, :), ... % at the new x coordinates 
        newCoords(2, :), ... % and the new y coordinates 
        'linear', ...   % using linear interpolation 
        0);     % and 0 for pixels outside the image 
newImage = reshape(newImage, nRows, nCols); % Reshape the image data 
newImage = uint8(newImage);     % Convert the image to type uint8 

И следующий рисунок показывает сдвиг применяется к изображению с помощью приведенной выше коды:

enter image description here

Вы можете отрегулировать направление (x или y) и величину сдвига, изменяя недиагональные члены сдвиговой матрицы. Вы также можете изменить, какой край изображения (верхний, нижний, левый или правый) удерживается фиксированным, когда сдвиг выполняется первым переворачиванием изображения в заданном направлении, выполнением интерполяции, а затем переворачиванием изображения назад. Вы можете использовать функции flipud и fliplr для изменения фиксированной кромки для ножей направления x и y. Вот некоторые примеры различных ножниц:.

enter image description here

1

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

I = imread('cameraman.tif'); 
I = imresize(I,[255,255]); 
delta = 20; % rotation angle 
rot_I = imrotate(I,-delta); 
figure; imshow(rot_I); 
% 1. calculate the shearing metrix 
delta = delta/180*pi; 
x_shear_matrix = [ 1 -tan(delta/2); 
        0 1]; 
y_shear_matrix = [1 0; 
       sin(delta) 1]; 

whole_matrix = [cos(delta) -sin(delta); 
       sin(delta)  cos(delta)]; 
      disp(whole_matrix); 
    seperated_matrix = x_shear_matrix*y_shear_matrix*x_shear_matrix; 
    disp(seperated_matrix); 
% 2. shear in the x-direction 
sheared_img = shear_x(I,delta); 
figure; imshow(sheared_img); 
% 3. Shear in the y-direction 
    new_sheared_img = shear_y(sheared_img,delta); 
figure; imshow(new_sheared_img); 
% 4. shear in the x-direction 
    final = shear_x(new_sheared_img,delta); 
    figure; imshow(final,'final'); 

сдвиговые операции по й-направлению и у-направления заключаются в следующем:.

function new_sheared_img = shear_x(I,delta); 

[row,col] = size(I); 
center_x = floor(col/2); 
center_y = floor(row/2); 
top_right_x = col-center_x-tan(delta/2)*(1-center_y); 
bottom_left_x = 1-center_x-tan(delta/2)*(row-center_y); 
new_width =ceil(top_right_x-bottom_left_x+1); 
center_x_new = floor(new_width/2); 
center_y_new = center_y; 
new_sheared_img = zeros(row,new_width); 
for i= 1:row 
    pos_y = (i-center_y); 
    pos_y_img = pos_y+center_y; 
    pos_y_img = floor(pos_y_img+0.5); 
    for j=1:col 
     pos_x = (j-center_x)-tan(delta/2)*pos_y; 
     pos_x_img = pos_x-bottom_left_x+1; 
     pos_x_img = floor(pos_x_img+0.5); 
     new_sheared_img(pos_y_img,pos_x_img) = I(i,j); 
    end 
end 

function new_sheared_img = shear_y(sheared_img,delta); 

[row,col] = size(sheared_img); 
center_x = floor(row/2); 
center_y = floor(col/2); 
top_left_corner = (1-center_x)*sin(delta)+(1-center_y); 
bottom_right_corner = (col-center_x)*sin(delta)+row-center_y; 
new_height = ceil(bottom_right_corner-top_left_corner+1); 
new_sheared_img = zeros(new_height,col); 
center_x_new = center_x; 
center_y_new = floor(new_height/2); 
for i=1:col 
    pos_x = i-center_x; 
    pos_x_img = pos_x+center_x_new; 
    pos_x_img = floor(pos_x_img+0.5); 
    for j=1:row 
     pos_y = pos_x*sin(delta)+j-center_y; 
     pos_y_img = pos_y-top_left_corner+1; 
     pos_y_img = floor(pos_y_img+0.5); 
     new_sheared_img(pos_y_img,pos_x_img) = sheared_img(j,i); 
    end 
end 
Смежные вопросы