Нелинейная фильтрация с помощью интерполяционных таблиц
выполняет 2 на 2 или нелинейная операция фильтрации района 3 на 3 на бинарном изображении J
= bwlookup(BW
,lut
)BW
. Обработка по соседству определяет целочисленное значение индекса, используемое для доступа к значениям в интерполяционной таблице lut
. Выбранный lut
значение становится пикселем в выходном изображении J
на целевой позиции.
Создайте вектор lut
так, что операция фильтрации помещает 1
в целевом пиксельном местоположении в вход изображении только тогда, когда для всех четырех пикселей в окрестности BW 2 на 2 задано значение 1
.
lutfun = @(x)(sum(x(:))==4); lut = makelut(lutfun,2)
lut = 16×1
0
0
0
0
0
0
0
0
0
0
⋮
Загрузка бинарного изображения.
BW1 = imread('text.png');
Выполните обработку соседства 2 на 2 с 16-элементным вектором lut
.
BW2 = bwlookup(BW1,lut);
Показать масштабируемые изображения до и после.
figure; h1 = subplot(1,2,1); imshow(BW1), axis off; title('Original Image') h2 = subplot(1,2,2); imshow(BW2); axis off; title('Eroded Image') % 16X zoom to see effects of erosion on text set(h1,'Ylim',[1 64],'Xlim',[1 64]); set(h2,'Ylim',[1 64],'Xlim',[1 64]);
BW
- Бинарное изображениеБинарное изображение, которое будет преобразовано операцией нелинейной фильтрации окрестностей, заданной в виде 2-D логической матрицы или 2-D числовой матрицы. Для числового входа любые ненулевые пиксели рассматриваются как 1
(true
).
Типы данных: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
lut
- Интерполяционная таблица значений выходных пикселей Интерполяционная таблица выхода значений пикселей в виде вектора с 16 или 512 элементами. Размер lut
определяет, какая из двух операций по соседству выполняется. Вы можете использовать makelut
функция для создания интерполяционной таблицы.
Если lut
содержит 16 элемента данных, тогда матрица окрестностей 2 на 2.
Если lut
содержит 512 элемента данных, тогда матрица окрестностей 3 на 3.
Типы данных: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
J
- Выходное изображениеПервый шаг в каждой итерации операции фильтрации, выполненной bwlookup
включает в себя вычисление index
в векторные lut
на основе двоичного пиксельного шаблона соседней матрицы на изображении BW
. Значение в lut
доступ получен в index
, lut(index)
, вставляется в выходное изображение J
в целевом пиксельном местоположении. Это приводит к J
изображений являющийся совпадающим типом данных, что и векторный
lut
.
Поскольку в целевых пикселях существует соответствие 1 к 1, изображение J
совпадает с размером изображения BW
. Если целевое положение пикселя находится на краю изображения BW
и если какая-либо часть матрицы соседства 2 на 2 или 3 на 3 простирается за пределы ребра изображения, то эти неизображения положения заполняются 0 в порядок для выполнения операции фильтрации.
Следующие рисунки показывают отображение из двоичных 0 и 1 шаблонов в соседних матрицах в его двоичное представление. Добавление 1 к двоичному представлению приводит к index
который используется для доступа к lut
.
Для кварталов 2 на 2, length(lut)
16. В каждом районе четыре пикселя и два возможных состояния для каждого пикселя, поэтому общее количество сочетаний составляет 24 = 16.
Для иллюстрации в этом примере показано, как пиксельный шаблон в матрице 2 на 2 определяет, какая запись в lut
помещается в местоположение целевого пикселя.
Создайте случайные 16-элементные lut
вектор, содержащий uint8
данные.
scurr = rng; % save current random number generator seed state rng('default') % always generate same set of random numbers lut = uint8( round( 255*rand(16,1) ) ) % generate lut rng(scurr); % restore
lut = 208 231 32 233 161 25 71 139 244 246 40 248 244 124 204 36
Создайте изображение 2 на 2 и предположим для этого примера, что целевое местоположение пикселя является местоположением BW(1,1)
.
BW = [1 0; 0 1]
BW = 1 0 0 1
Со ссылкой на цветное кодирование, представленное выше, двоичное представление для этого района 2 на 2 может быть вычислено, как показано на фрагменте кода ниже. Логический объект 1 в BW(1,1)
соответствует синему на рисунке, который преобразуется в наименее значимый бит (LSB) в положении 0 в 4-битном двоичном представлении (, 20= 1). Логический объект 1 в BW(2,2)
красный, который преобразуется в Самый Значащий Бит (MSB) в положении 3 в 4-битном двоичном представлении (23= 8) .
% BW(1,1): blue square; sets bit position 0 on right % BW(2,2): red square; sets bit position 3 on left binNot = '1 0 0 1'; % binary representation of 2x2 neighborhood matrix X = bin2dec( binNot ); % convert from binary to decimal index = X + 1 % add 1 to compute index value for uint8 vector lut A11 = lut(index) % value at A(1,1)
index = 10 A11 = 246
Вышеописанное вычисление предсказывает, что выходное изображение A должно содержать значение 246 в целевой позиции A(1,1)
.
A = bwlookup(BW,lut) % perform filtering
A = 246 32 161 231
A(1,1)
фактически равен 246.
Для кварталов 3х3, length(lut)
равен 512. В каждом районе девять пикселей и два возможных состояния для каждого пикселя, поэтому общее количество сочетаний составляет 29 = 512.
Процесс вычисления двоичного представления обработки окрестностей 3 на 3 аналогичен процессу для окрестностей 2 на 2.
Указания и ограничения по применению:
bwlookup
поддерживает генерацию Кода С (требует MATLAB® Coder™). Обратите внимание, что если вы выбираете родовую MATLAB Host Computer
целевая платформа, bwlookup
генерирует код, который использует предварительно скомпилированную совместную библиотеку для конкретной платформы. Использование общей библиотеки сохраняет оптимизацию эффективности, но ограничивает целевые платформы, для которых может быть сгенерирован код. Дополнительные сведения см. в разделе Генерация кода с использованием общей библиотеки.
При генерации кода задайте вход изображение класса logical
.
Указания и ограничения по применению:
При генерации кода задайте вход изображение класса logical
.
Эта функция полностью поддерживает массивы GPU. Для получения дополнительной информации смотрите Обработка изображений на графическом процессоре.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.