Данный вектор в 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
изображение, которое часть обработки изображения инструментов:
... и когда я запускаю этот код, я получаю это изображение с помощью imshow(newImage,[]);
:
Обратите внимание, что разностный фильтр применялся к каждому каналу индивидуально, и я менял интенсивности на канал так, чтобы наименьшее значение получало карту ped до 0, а наибольшее значение отображается на 1. Как вы можете интерпретировать этот образ, так это то, что в любых областях, которые имеют нечерный цвет, есть некоторые ненулевые различия, и, следовательно, в этих областях и в некоторых областях, где есть темный/черный цвет означает, что в этих областях нет активности.Обратите внимание, что мы применили горизонтальный фильтр, поэтому, если вы хотите сделать это по вертикали, вы просто повторите это поведение, но примените этот столбец, а не по строкам, как вы это делали выше.
Должно быть упомянуто, что назначение диктует, что мне не разрешено, мне нужно сделать петлю фильтра и свертки. – cferrier1995
Взгляните на «Преобразование Собела». Легко написать код для этого алгоритма. –