2016-07-31 2 views
2

мне нужно сделать следующее для изображения в MATLAB:Обрезка изображения в MATLAB

  1. Загрузите изображения.
  2. вычислить FFT (быстрое преобразование Фурье) изображения.
  3. Компоненты частоты сдвига в центр.
  4. обрезайте изображение, как показано ниже (если разрешение изображения равно 1000x1000, необходимая часть изображения выглядит следующим образом: 100,100,800,800, что является меньшим изображением. (Идея применения фильтра для удаления высоких частот).
  5. .
  6. обратный сдвиг преобразования
  7. обратное Фурье

Мой код выглядит следующим образом:....

I = imread('2.jpg'); %loading 

ID = im2double(I); 
FID = fft2(ID); %FFT 
F = fftshift(FID); %shifting 

F = imcrop(F,[100, 100, 800, 800]); 

FID = ifftshift(F); %inverse of shifting 
IFID = ifft2(FID); %inverse of FFT 

I8 = im2uint8(IFID); 

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

Ошибка:

Error using imcrop>checkCData (line 410) Invalid input image.

Error in imcrop>parseInputs (line 256) checkCData(a);

Error in imcrop (line 93) [x,y,a,cm,spatial_rect,h_image,placement_cancelled] = parseInputs(varargin{:});

Любой Помогите ? .. также есть и другая функция для обрезки?

+1

Обратите внимание, что кадрирование изображения в частотной области будет также уменьшить размер изображение во временной области.Если вы просто хотите «удалить» компоненты высокой частоты, но сохраните одинаковый размер изображения, тогда вы можете отключить эти пиксели, а не просто удалять их. – SleuthEye

+0

Это была моя старая идея, но я не смог ее применить, не могли бы вы мне помочь? –

ответ

1

Обрезка вещественнозначную разложение изображения (либо величины и фазы, или действительной и мнимой части) позволило бы избежать заявленную погрешность от imcrop.

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

Чтобы сохранить размер изображения, вы можете вместо этого обнулить эти частотные бункеры (за исключением использования более сложной конструкции фильтра). Вы можете достичь этого, умножив данные частотной области на матрицу, действующую в качестве маски на частотную составляющую, которую вы хотите сохранить.

код для достижения этой цели будет выглядеть так:

% create a mask to zero-out high frequency components 
H = zeros(size(I)); 
halfwidth = 400; 
xmin = size(H,2)/2+1 - halfwidth; 
xmax = size(H,2)/2+1 + halfwidth; 
ymin = size(H,1)/2+1 - halfwidth; 
ymax = size(H,1)/2+1 + halfwidth; 
H(xmin:xmax, ymin:ymax, :) = 1; 

% apply mask 
F = F.*H; 

Который даст вам следующий общий код:

I = imread('2.jpg'); %loading 

ID = im2double(I); 
FID = fft2(ID); %FFT 
F = fftshift(FID); %shifting 

% create a mask to zero-out high frequency components 
H = zeros(size(I)); 
halfwidth = 400; 
xmin = size(H,2)/2+1 - halfwidth; 
xmax = size(H,2)/2+1 + halfwidth; 
ymin = size(H,1)/2+1 - halfwidth; 
ymax = size(H,1)/2+1 + halfwidth; 
H(xmin:xmax, ymin:ymax, :) = 1; 

% apply mask 
F = F.*H; 

FID = ifftshift(F); %inverse of shifting 
IFID = real(ifft2(FID)); %inverse of FFT 

I8 = im2uint8(IFID); 
+0

Что вы имели в виду под: H (100: 800, 100: 800) = 1? , также, изображение представляло собой сочетание форм с различным цветом для каждого, нарисованное на белом фоне .. после применения вашего кода изображение станет синим! это то, что должно быть? –

+0

Индекс '100: 800' присваивает кусочку' H'. Я только что добавил третье измерение для цветов. – SleuthEye

+0

Черное изображение !!! , вы попробовали? –

1

Проблема действительно в комплексных значениях в тензоре F. Доказательством является то, что замена imcrop(F,[100, 100, 800, 800]) на imcrop(abs(F),[100, 100, 800, 800]).

Предлагаемое мне предложение состоит в разложении сигнала F по величине и фазе и использовании imcrop на этих двух изображениях, после чего следует реконструкция. Что касается понимания «imcrop», это должно дать тот же результат.

Код будет выглядеть потом как:

I = imread('PersonalPhoto.JPG'); %loading 

ID = im2double(I); 
FID = fft2(ID); %FFT 
F = fftshift(FID); %shifting 

Fabs = imcrop(abs(F),[100, 100, 800, 800]); 
Fang = imcrop(angle(F),[100, 100, 800, 800]); 

F = Fabs.*exp(1j.*Fang); 

FID = ifftshift(F); %inverse of shifting 
IFID = ifft2(FID); %inverse of FFT 

I8 = im2uint8(IFID); 
+0

Thaaaanx, не могли бы вы exp. это: F = Fabs. * exp (1j. * Fang); –

+0

Что происходит, существует стандартное представление комплексного числа в виде комбинации его величины Fabs и его угла Fang. А именно, комплексное число может быть записано как «z = a + b * j = Magn * exp (Angle * j)'. Точки требуются в Matlab, потому что операции выполняются по элементам, а не по векторам. –

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