Подготовка массива изображений и его просмотр

В качестве примера возьмем изображение из файла swphoto.eps пакета Wavelet Explorer. Следующий пример резервирует место под массив изображения data, считывает указанный файл, преобразует его в матрицу 8-битовых чисел и дает контроль размера массива:

Needs["Wavelets'Wavelets'"]

data = Reverse[Partition[ToExpression /@

О 50 100 150 200 250

Рис. 18.73. Двумерная диаграмма декомпозиции изображения

(Stringjoin[Join[{"16лл"}, #]]& /@

Partition[Characters[Stringjoin @@ Drop[Drop[

ReadList[ToFileName[{"Wavelets", "Data"}, "swphoto.eps"], String],22], -3]], 2]), 250]]; Dimensions[data] {277, 250}

Таким образом, мы создали обычный массив полутонового изображения. Для обработки изображений удобно иметь массив, число элементов которого по строкам и столбцам должно быть степенью 2. Следующие команды создают такой массив и вычисляют его размеры:

(data = Transpose[Join[Table[#[[1]], {3}], #, Table[#[[-1]], {3}]]&[Transpose[Drop[data, 21]]]];

0 5 1015202530

0 5 10152 0 2 530

0 5 1015202530

Рис. 18.75. Содержимое трех квадратов с деталями изображения первых трех уровней декомпозиции изображения

Dimensions[data] )

{256, 256}

Теперь можно построить исходное изображение (рис. 18.72):

0102030405060

О 102030405060

О 102030405060

Рис. 18.76. Содержимое еше трех квадратов со следующими тремя уровнями декомпозиции изображения

ListDensityPlot[data, Mesh -> False]

Вейвлет-декомпозиция изображения

Для вейвлет-декомпозиции изображения пока возьмем вейвлет-фильтр с малой асимметрией порядка 4 и начальным индексом, измененным с 0 до -3:

(s4 = LeastAsymmetricFilter[4]; s4 = MapAt[-3&, s4, {2}])

{ {-0.0757 657,-0.02 96355, 0.4 97 619, 0.80373 9,

0.297858,-0.0992195,-0.012604,0.0322231},—3}

Теперь выполним прямое вейвлет-преобразование массива и оценим его структуру:

О 50 100 150 200 250

Рис. 18.77. Грубая часть изображения

Детализирующая часть изображения

Рис. 18.78. Детализирующая часть изображения

wtdata = WaveletTransform[data, s4, 3, Boundarycondition -> Fixed]; Dimensions /@ wtdata

[1]

Построим двумерную диаграмму (рис. 18.73) коэффициентов декомпозиции изображения:

0 50 100 150 200 250

Рис. 18.79. Результат реставрации изображения

PlotCoefficients2D[wtdata]

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

Можно попытаться усреднить часть изображения — рис. 18.74:

ListDensityPlot[wtdata[[1]], Mesh -> False]

Усредненное изображение гораздо ближе к исходному, чем представленное на рис. 18.73. И, тем не менее, отождествлять его с исходным нельзя.

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

О 50 100 150 200 250

Рис. 18.80. Двумерная диаграмма декомпозиции изображения при пакетном вейвлет-преобразовании

Сравнение вейвлет- и пакетного вейвлет-преобразований

Рис. 18.81. Сравнение вейвлет- и пакетного вейвлет-преобразований

Show[GraphicsArray[ListDensityPlot[#, Mesh -> False, DisplayFunction -> Identity]& /@wtdata[[2]]]]

Далее просмотрим следующие три уровня — рис. 18.76:

Show[GraphicsArray[ListDensityPlot[#, Mesh -> False, DisplayFunction -> Identity]& /@wtdata[[3]]]]

Теперь можно рассмотреть процесс грубой реконструкции изображения в соответствии с соотношением

/,(/) = Д +

J=j«

где J — уровень реконструкции и f — аппроксимирующая функция (phi). Эта итерационная процедура (см. главу 2) обеспечивается обратным вейвлет-прсобразо-ванием. С учетом сдвига начального отсчета J мы можем построить реконструированное изображение для уровней от «тонкого» уровня J - 8 до «грубого» уровня J = 5 (рис. 18.77):

tempi = InverseWaveletTransform[wtdata-MapAt[#-#&, wtdata, {1}], s4, Boundarycondition -> Fixed]; ListDensityPlot[tempi, Mesh -> False]

Аналогично мы можем организовать построение детализирующего изображения с теми же уровнями (рис. 18.78):

InverseWaveletTransform[wtdata-MapAt[#-#&, wtdata, {2}], s4, Boundarycondition -> Fixed]/ListDensityPlot[%, Mesh -> False]

  • [1] 32,32} ,{3,32,32},{3, 64, 64 },{3, 12 8,128
 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ ОРИГИНАЛ   След >