2016-03-02 3 views
2

Так что мне нужно взять производную от изображения в x-направлении для этого назначения с целью получения какой-либо формы градиента. Моя мысль состоит в том, чтобы использовать команду diff() для каждой строки изображения, а затем применить фильтр Гаусса. Я не начал вторую часть, потому что первый из них причиняет мне неприятности. При попытке получить й производную у меня есть:Matlab: проблема с получением производного изображения?

origImage = imread('TightRope.png'); 

for h = 1:3 %%h represents color channel 
    for i = size(origImage,1) 
     newImage(i,:,h) = diff(origImage(i,:,h)); %%take derivative of row and translate to new row 
    end 
end 

Проблема где-то по пути я получаю ошибку 'присвоения индексируется измерение рассогласования..

Error in Untitled2 (line 14) 
    newImage(i,:,h) = diff(origImage(i,:,h)); 

Кто-нибудь есть какие-либо идеи о том, почему это могло случаться и если мой подход является правильным для получения градиента/гауссова производной?

ответ

2

Почему бы не использовать fspecial вместе с imfilter?

figure; 

I = imread('cameraman.tif'); 

subplot 131; imshow(I); title('original') 

h = fspecial('prewitt'); 
derivative = imfilter(I,h','replicate'); %' 

subplot 132; imshow(derivative); title('derivative') 

hsize = 5; 
sigma = 1; 

h = fspecial('gaussian', hsize, sigma) ; 
gaussian = imfilter(derivative,h','replicate'); %' 

subplot 133; imshow(gaussian); title('derivative + gaussian') 

Результат следующий:

enter image description here

+0

Должно быть упомянуто, что назначение диктует, что мне не разрешено, мне нужно сделать петлю фильтра и свертки. – cferrier1995

+0

Взгляните на «Преобразование Собела». Легко написать код для этого алгоритма. –

1

Данный вектор в N элемент, diff возвращает вектор с N-1 длины, так что причина, почему вы получаете несоответствие выравнивания, потому что вы пытаясь назначить вывод diff в неправильное количество слотов. Конкретно, предположим, что N - это общее количество столбцов, вы используете diff на векторе 1 X N, который таким образом возвращает вектор 1 x (N - 1), и вы пытаетесь назначить этот вывод как одну строку в выходное изображение, которое должно быть 1 x N. Недопустимый элемент вызывает несоответствие выравнивания. diff работает, беря пары элементов в векторе и вычитая их для создания новых элементов, поэтому причина, по которой в конечном выходе отсутствует один элемент.

Если вы хотите, чтобы ваш код работал, одним из способов является прокладка каждой строки изображения или вектора сигнала с дополнительным нулем (например) в качестве входного сигнала в diff. Что-то вроде этого может работать. Примите к сведению, что я буду преобразующий изображение в double, чтобы производная принимать отрицательные значения:

origImage = imread('...'); %// Place path to image here and read in 
origImage = im2double(origImage); %// Change - Convert to double precision 
newImage = zeros(size(origImage)); %// Change - Create blank new image and populate each row per channel manually 

for h = 1:3 %%h represents color channel 
    for ii = 1:size(origImage,1) %// Change - fixed for loop iteration 
     newImage(ii,:,h) = diff([0 origImage(ii,:,h)]); %// Change 
    end 
end 

Обратите внимание, что ваш for цикл был неправильным, так как это не переходило каждую строку ... просто последней строки.

Когда я использую onion.png изображение, которое часть обработки изображения инструментов:

enter image description here

... и когда я запускаю этот код, я получаю это изображение с помощью imshow(newImage,[]);:

enter image description here

Обратите внимание, что разностный фильтр применялся к каждому каналу индивидуально, и я менял интенсивности на канал так, чтобы наименьшее значение получало карту ped до 0, а наибольшее значение отображается на 1. Как вы можете интерпретировать этот образ, так это то, что в любых областях, которые имеют нечерный цвет, есть некоторые ненулевые различия, и, следовательно, в этих областях и в некоторых областях, где есть темный/черный цвет означает, что в этих областях нет активности.Обратите внимание, что мы применили горизонтальный фильтр, поэтому, если вы хотите сделать это по вертикали, вы просто повторите это поведение, но примените этот столбец, а не по строкам, как вы это делали выше.

1

Если ваша цель состоит в том, чтобы использовать diff для создания производной, а не для создания цикла, вы можете просто сказать diff, чтобы дать вам производную в направлении оси х (по размерности 2):

newImage = diff(double(origImage), 1, 2); 

1 предназначен для первой производной, а 2 - для производной по второму размеру. См. diff.

Как @rayryeng упоминает в своем ответе, важно отобразить изображение как double.