Ошибка свертки в MATLAB

#matlab #image-processing #2d #convolution

#matlab #обработка изображений #2d #свертка

Вопрос:

Я понятия не имею, почему я не получаю идентичного изображения ‘ada.jpg ‘ когда я запускаю приведенный ниже код:

 clear;
I = rgb2gray(imread('ada.jpg'));
figure(1)
imshow(I)
M = int8([0 0 0 ; 0 1 0 ; 0 0 0]);
C = convn(M, I);
figure(2)
imshow(C)
  

Здесь два изображения:
входное изображение — рисунок (1)
и
выходное изображение — рисунок (2)

Ответ №1:

Проблема в том, что ваши входные данные изображения I имеют значения между 0 и 255 и имеют тип uint8 данных. После свертки выводом является a double и все еще имеет значения между 0 и 255 .

По умолчанию imshow , когда входные данные имеют тип double , необходимо масштабировать цветовые оси таким образом, чтобы 0 они были черными и 1 белыми. Ваше изображение отображается почти полностью белым, поскольку большинство ваших значений >1 .

Чтобы исправить это (поскольку вам нужны ограничения 0 to 255 ), вы можете указать диапазон значений для использования в качестве второго ввода в imshow

 imshow(C, [0 255])
  

Или вы можете просто предоставить пустой массив в качестве второго ввода, чтобы цвета автоматически масштабировались до экстремумов входного изображения

 imshow(C, [])
  

В качестве дополнительного примечания вы можете использовать conv2 вместо convn , поскольку вы просто выполняете 2D-свертку. conv2 требуется, чтобы все входные данные были числами с плавающей запятой, поэтому мы сначала преобразуем M и I в double .

 C = conv2(double(I), double(M), 'same');
  

В качестве альтернативы, вы могли бы использовать imfilter , если у вас есть набор инструментов для обработки изображений (как предложил @rayryeng), и вам не нужно беспокоиться о приведении M и I double

 C = imfilter(I, M);
  

Комментарии:

1. Это сработало, спасибо! Но мне интересно, почему функция conv не использует тип данных uint8 вместо double? Или есть специальная функция для этой цели?

2. @Burak conv2 принимает только double данные или single вводит данные. Это упоминается в документации. Вот почему Suever преобразует данные в double . Если у вас есть набор инструментов для обработки изображений, вы можете использовать imfilter который принимает почти все типы входных данных.

3. @rayryeng Я знаю, прочитайте меню справки для функции conv. Я спросил, почему? Есть ли какая-то особая причина?

4. @Burak Это потому conv2 , что обычно используется преобразование Фурье ядра и изображения и выполняется поэлементное умножение с последующим обратным 2D-преобразованием Фурье. Для выполнения этих операций необходимо, чтобы два были числами с плавающей запятой. imfilter это функция более высокого уровня, которая выполняет эти преобразования за вас.

5. @Suever Спасибо!