#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 Спасибо!