Spec-Zone .ru
спецификации, руководства, описания, API
|
Содержание | Предыдущий | Следующий |
Java 2D™ API поддерживает три модели обработки изображений
Следующая таблица противопоставляет функции каждой из этих моделей обработки изображений.
|
Модель передачи
|
Непосредственная Буферная Модель Изображения Режима
|
Модель приема
|
---|---|---|---|
Главные Интерфейсы/Классы
|
|||
Доводы "за"
|
|||
Доводы "против"
|
Эта глава сосредотачивается на объектах и методах непосредственного режима модель обработки изображений. Классы непосредственного режима обработки изображений и интерфейсы Java, 2-D API обеспечивает методы для того, чтобы они имели дело с пикселем отображенные изображения, данные которых хранятся в памяти. Этот API поддерживает данные изображения доступа во множестве форматов хранения и управления данными изображения через несколько типов фильтрации операций.
Непосредственный режим API обработки изображений в Java 2D™ API может быть сгруппирован в шесть категорий: интерфейсы, классы данных изображения, отображают классы работы, демонстрационные классы модели, классы цветовой модели, и исключения.
Непосредственный режим модель обработки изображений поддерживает изображения фиксированного разрешения, сохраненные в памяти. Модель также поддерживает операции фильтрации на данных изображения. Много классов и интерфейсов используются в этой модели.
Как показано в рисунке 5-1, BufferedImage
обеспечивает общее управление изображением. A BufferedImage
может быть создан непосредственно в памяти и использоваться, чтобы содержать и управлять полученными данными изображения от файла или URL. A BufferedImage
может быть выведен на экран, используя любого Graphics2D
объект для экранного устройства, или представленный любому другому месту назначения, использующему соответствующий Graphics2D
контекст. A BufferedImage
объект содержит два других объекта: a Raster
и a ColorModel
.
Raster
class обеспечивает управление данными изображения. Это представляет прямоугольные координаты изображения, поддерживает данные изображения в памяти, и обеспечивает механизм для того, чтобы он создал многократные подызображения из единственного буфера данных изображения. Это также обеспечивает методы для того, чтобы они получили доступ к определенным пикселям в пределах изображения. Растровый объект содержит два других объекта, a DataBuffer
и a SampleModel
.
DataBuffer
class содержит пиксельные данные в памяти.
SampleModel
class интерпретирует данные в буфере и обеспечивает это как отдельные пиксели или прямоугольные диапазоны пикселей.
ColorModel
class обеспечивает цветную интерпретацию пиксельных данных, обеспеченных демонстрационной моделью изображения.
Пакет изображения обеспечивает дополнительные классы, которые определяют операции фильтрации на BufferedImage
и Raster
объекты. Каждая работа обработки изображений воплощается в class, который реализует BufferedImageOp
интерфейс, RasterOp
интерфейс, или оба интерфейса. Работа class определяет filter
методы, который выполняет фактическое манипулирование изображением.
Рисунок 5-2 иллюстрирует базовую модель для Java 2D™ обработка изображений API:
Поддерживаемые операции включают:
Отметьте, что, если Вы интересуетесь только отображением и управлением изображениями, Вы только должны понять BufferedImage
class и классы работы фильтрации. С другой стороны, если Вы запланируете записать фильтры или иначе непосредственно данные изображения доступа, то Вы должны будете понять классы, связанные с BufferedImage
.
Вот некоторые термины, использованные в течение следующих обсуждений:
Элементы данных: типы примитивов, используемые в качестве модулей хранения данных изображения. Элементы данных являются отдельными элементами a DataBuffer
массив. Расположение элементов в буфере данных независимо от интерпретации данных как пиксели изображением SampleModel
.
Выборки: отличные элементы пикселей изображения. A SampleModel
обеспечивает механизм для того, чтобы он преобразовал элементы в DataBuffer
к пикселям и их выборкам. Выборки пикселя могут представить основные значения в определенной цветовой модели. Например, пиксель в цветовой модели RGB состоит из трех выборок: красный, зеленый, и синий.
Компоненты: значения пикселей, независимых от цветной интерпретации. Различие между компонентом и выборкой полезно с IndexColorModel
, то, где пиксельные компоненты, индексирует в LookupTable
.
Полоса: набор всех выборок каждый вводит изображение, такое как все красные выборки или все зеленые выборки. Пиксельные данные могут быть сохранены многими способами, эти два, поддерживаемые в Java 2-D соединяемый API и чередованный пиксель. Соединенное хранение организует данные изображения полосами, и пиксель составляется из демонстрационных данных от той же самой позиции в каждой полосе. Пиксельное хранение с чередованием организует данные изображения пикселями с единственным массивом, содержащим все пиксели, и полосы, состоящие из набора выборок в том же самом, индексируют позицию в каждом пикселе.
Основные устройства: отличные элементы значения цвета в определенной цветовой модели; например модель RGB формирует значения цвета из основных устройств, красных, зеленых, и синий.
BufferedImage
class является основной class, поддерживающий непосредственный режим обработки изображений. Это управляет изображением в памяти, обеспечивая способы сохранить пиксельные данные, интерпретировать пиксельные данные, и представить пиксельные данные к a Graphics
или Graphics2D
контекст.
Создать a BufferedImage
, вызовите Component.createImage
метод; это возвращает a BufferedImage
у того, рисование которого характеристик соответствует таковые из компонента, используемого, чтобы создать это — создаваемое изображение непрозрачно, есть цвета переднего плана и цвета фона Component
, и невозможно скорректировать прозрачность изображения. Вы могли использовать этот метод, когда Вы хотите сделать двойной буферизованный рисунок для анимации в компоненте; обсуждение, "Тянущее во Внеэкранном Буфере” на странице 79, дает больше деталей.
public Graphics2D createDemoGraphics2D(Graphics g) { Graphics2D g2 = null; int width = getSize().width; int height = getSize().height; if (offImg == null || offImg.getWidth() != width || offImg.getHeight() != height) { offImg = (BufferedImage) createImage(width, height); } if (offImg != null) { g2 = offImg.createGraphics(); g2.setBackground(getBackground()); } // .. clear canvas .. g2.clearRect(0, 0, width, height); return g2; }
Можно также создать пробел BufferedImage
в памяти, используя один из нескольких методов конструктора обеспечил.
BufferedImage
class может использоваться, чтобы подготовиться, графические элементы вне экрана тогда копируют их в экран. Этот метод особенно полезен, когда графика сложна или неоднократно используется. Например, если Вы хотите вывести на экран сложную форму несколько раз, Вы могли бы потянуть ее однажды во внеэкранный буфер и затем скопировать ее в различные расположения в окне. При рисовании формы однажды и копируя ее, можно вывести на экран графику более быстро.
java.awt
пакет облегчает использование внеэкранных буферов, позволяя Вам потянуть к Image
возразите тому же самому способу, которым Вы тянете к окну. Весь Java 2D™ функции рендеринга API может привыкнуть при рисовании к внеэкранным изображениям.
Внеэкранные буферы часто используются для анимации. Например, Вы могли использовать внеэкранный буфер, чтобы потянуть объект однажды и затем переместить это в окне. Точно так же Вы могли использовать внеэкранный буфер, чтобы обеспечить обратную связь, поскольку пользователь перемещает графическое использование мыши. Вместо того, чтобы перерисовать графику в каждом расположении мыши, Вы могли потянуть графику однажды к внеэкранному буферу, и затем скопировать это в расположение мыши, поскольку пользователь перетаскивает мышь 1
Рисунок 5-3 демонстрирует, как программа может потянуть к внеэкранному изображению и затем скопировать то изображение в окно многократно. В прошлый раз, когда изображение копируется, оно преобразовывается. Отметьте, что преобразование изображения вместо того, чтобы перерисовать это с преобразованием могло бы привести к неудовлетворительным результатам.
Самый простой способ создать изображение, которое можно использовать в качестве внеэкранного буфера, состоит в том, чтобы использовать Component
.createImage
метод.
Создавая изображение, цветовое пространство которого, глубина, и пиксельное расположение точно соответствуют окно, в которое Вы тянете, изображение может эффективно блитироваться к графическому устройству. Это позволяет drawImage
сделать его задание быстро.
Можно также создать a BufferedImage
возразите непосредственно, чтобы использовать в качестве внеэкранного буфера. Это полезно, когда Вы нуждаетесь в управлении типом внеэкранного изображения или прозрачностью.
BufferedImage
поддерживает несколько предопределенных типов изображения:
TYPE_3BYTE_BGR
TYPE_4BYTE_ABGR
TYPE_4BYTE_ABGR_PRE
TYPE_BYTE_BINARY
TYPE_BYTE_GRAY
TYPE_BYTE_INDEXED
TYPE_CUSTOM
TYPE_INT_ARGB_PRE
TYPE_INT_ARGB
TYPE_INT_BGR
TYPE_INT_RGB
TYPE_USHORT_555_RGB
TYPE_USHORT_565_RGB
TYPE_INT_GRAY
A BufferedImage
объект может содержать альфа-канал. В рисунке 5-3 альфа-канал используется, чтобы отличить нарисованные и непокрашенные области, позволяя неправильную форму появиться по графике, которая была уже нарисована (в этом случае, теневой прямоугольник). В других случаях Вы могли бы использовать альфа-канал, чтобы смешать цвета нового изображения в тех в существующем изображении.
Отметьте: если Вы не нуждаетесь в альфа-данных изображения для прозрачности, как с изображениями неправильной формы, показанными в рисунке 5-2, следует избежать создавать внеэкранный буфер с альфой. Используя альфу, где это является ненужным, замедляет производительность рендеринга.
GraphicsConfiguration
обеспечивает методы удобства, которые автоматически создают буферизованные изображения в формате, совместимом с Вашей конфигурацией. Можно также запросить графическую конфигурацию, связанную с графическим устройством, о котором окно находится, чтобы получить информацию, Вы должны создать совместимое BufferedImage
объект.
Чтобы потянуть в буферизованном изображении, Вы вызываете BufferedImage.createGraphics
метод, который возвращает a Graphics2D
объект. С этим объектом можно вызвать весь из Graphics2D
методы, чтобы потянуть графические примитивы, поместите текст, и представить другие изображения в изображении. Этот метод рисунка поддерживает размывание и другие улучшения, обеспеченные 2-D пакетом обработки изображений. Следующий код иллюстрирует использование внеэкранной буферизации:
public void update(Graphics g){
Graphics2D g2 = (Graphics2D)g;
if(firstTime){
Dimension dim = getSize();
int w = dim.width;
int h = dim.height;
area = new Rectangle(dim);
bi = (BufferedImage)createImage(w, h); big = bi.createGraphics(); rect.setLocation(w/2-50, h/2-25); big.setStroke(new BasicStroke(8.0f)); firstTime = false; } // Clears the rectangle that was previously drawn. big.setColor(Color.white); big.clearRect(0, 0, area.width, area.height); // Draws and fills the newly positioned rectangle to the buffer. big.setPaint(strokePolka); big.draw(rect); big.setPaint(fillPolka); big.fill(rect); // Draws the buffered image to the screen. g2.drawImage(bi, 0, 0, this);
}
В дополнение к рисованию непосредственно в a BufferedImage
, можно непосредственно получить доступ и управлять пиксельными данными изображения несколькими способами. Они полезны, если Вы реализуете BufferedImageOp
фильтрация интерфейса, как описано в “Обработке изображений и Улучшении” на странице 84.
Можно использовать BufferedImage
.setRGB
методы, чтобы непосредственно установить значение пикселя или пиксельной матрицы к определенному значению RGB. Отметьте, что никакое размывание не выполняется, когда Вы изменяете пиксели непосредственно. Можно также управлять пиксельными данными, управляя a WritableRaster
объект связался с a BufferedImage
(см. “Управление и Управление Растрами” на странице 80).
Можно применить работу фильтрации к a BufferedImage
использование объекта, который реализует BufferedImageOp
интерфейс. Фильтрация и классы, которые обеспечивают этот интерфейс фильтрации, обсуждается в “Обработке изображений и Улучшении” на странице 84.
Чтобы представить буферизованное изображение в определенном контексте, вызовите один из drawImage
метод контекста Graphics
объект. Например, представляя в пределах a Component
.paint
метод, Вы вызываете drawImage
на графическом объекте, который передают к методу.
public void paint(Graphics g) { if (getSize().width <= 0 || getSize().height <= 0) return; Graphics2D g2 = (Graphics2D) g; if (offImg != null && isShowing()) { g2.drawImage(offImg, 0, 0, this); } }
A BufferedImage
возразите использует a Raster
управлять его прямоугольным массивом пиксельных данных. Raster
class определяет поля для системы координат изображения — width, height, и источник. A Raster
сам объект использует два объекта управлять пиксельными данными, a DataBuffer
и a SampleModel
. DataBuffer
объект, который хранит пиксельные данные для растра (как описано на странице 82), и SampleModel
обеспечивает интерпретацию пиксельных данных от DataBuffer
(как описано на странице 82).
В большинстве случаев Вы не должны создать a Raster
непосредственно, так как каждый предоставляется любым BufferedImage
то, что Вы создаете в памяти. Однако, один из BufferedImage
методы конструктора позволяют Вам создавать a Raster
передавая в a WritableRaster
.
Raster
class обеспечивает много статических методов фабрики для того, чтобы они создали Rasters
с DataBuffers
и SampleModels
Вы определяете. Можно использовать эти фабрики, реализовывая RasterOp
фильтрация классов.
Raster
class включает понятие родительских и дочерних растров. Это может улучшить эффективность хранения, разрешая Вам создать любое число буферизованных изображений от того же самого родителя. Родитель и его дочерние элементы, которые все отсылают к тому же самому буферу данных, и каждому дочернему элементу, имеют определенное смещение и ограничивают, чтобы идентифицировать его расположение изображения в буфере. Дочерний элемент идентифицирует его владение через его getParent
метод.
Чтобы создать подрастр, Вы используете Raster
.createSubRaster
метод. Когда Вы создаете подрастр, Вы идентифицируете область его родителя, которого она покрывает и его смещение от источника родителя.
Raster
class определяет много способов получить доступ к пикселям и пиксельным данным. Они полезны, когда Вы реализуете RasterOp
интерфейс, который обеспечивает фильтрацию на уровне растра и манипулирование данными изображения, или реализовывая любой метод, который должен выполнить низкоуровневое пиксельное манипулирование.
Raster.getPixel
методы, которым позволяют Вы получить отдельный пиксель, который возвращается как отдельные выборки в массиве. Raster
.getDataElements
методы возвращают указанное выполнение неинтерпретируемых данных изображения от DataBuffer
. Raster
.getSample
метод возвращает выборки отдельного пикселя. getSamples
метод возвращает полосу для определенной области изображения.
В дополнение к этим методам можно также получить доступ к буферу данных и демонстрационной модели через переменные экземпляра Raster
class. Эти объекты обеспечивают дополнительные способы получить доступ и интерпретировать Raster
’s пиксельные данные.
WritableRaster
подкласс обеспечивает методы для того, чтобы они установили пиксельные данные и выборки. Raster
связанный с a BufferedImage
фактически a WritableRaster
, таким образом обеспечивая полный доступ, чтобы управлять его пиксельными данными.
DataBuffer
принадлежность a Raster
представляет массив данных изображения. Когда Вы создаете a Raster
непосредственно или через BufferedImage
конструкторы, Вы определяете width и height в пикселях, наряду с a SampleModel
для данных изображения. Эта информация используется, чтобы создать a DataBuffer
из соответствующего типа данных и размера.
Есть три подкласса DataBuffer
, каждое представление различного типа элемента данных:
DataBufferByte
(представляет 8-разрядные значения),DataBufferInt
(представляет 32-разрядные значения),DataBufferShort
(представляет 16-разрядные значения),DataBufferUShort
(представляет значения короткого целого без знака),Как определено ранее, элементы являются дискретными элементами массива буфера данных, и компоненты или выборки являются дискретными значениями, которые вместе составляют пиксель. Могут быть различные отображения между определенным типом элемента в a DataBuffer
и определенный тип пикселя представляется a SampleModel
. Это - ответственность различного SampleModel
подклассы, чтобы реализовать то отображение и обеспечить способ получить определенные пиксели от определенного DataBuffer
.
DataBuffer
конструкторы обеспечивают способы создать буферы определенного размера и определенного числа банков.
В то время как можно получить доступ к данным изображения в a DataBuffer
непосредственно, это обычно легче и более удобно сделать так через методы Raster
и WritableRaster
классы.
Краткий обзор SampleModel
class определяет методы для того, чтобы извлечь выборки изображения, не зная, как базовые данные хранятся. class обеспечивает поля для того, чтобы они отследили height и width данных изображения в связанном DataBuffer
, и для того, чтобы описать число полос и тип данных того буфера. SampleModel
методы обеспечивают данные изображения как набор пикселей с каждым пикселем, состоящим из многих выборок или компонентов.
java.awt.image
пакет обеспечивает пять типов демонстрационных моделей:
ComponentSampleModel
— используемый, чтобы извлечь пиксели из изображений, которые хранят демонстрационные данные в отдельных элементах массива данных в одном банке a DataBuffer
.BandedSampleModel
— используемый, чтобы извлечь пиксели из изображений, которые хранят каждую выборку в разделять элементе данных с полосами, сохраненными в последовательности элементов данныхPixelInterleavedSampleModel
— используемый, чтобы извлечь пиксели из изображений, которые хранят каждую выборку в разделять элементе данных с пикселями, сохраненными в последовательности элементов данных.MultiPixelPackedSampleModel
— используемый, чтобы извлечь пиксели из единственных соединенных изображений, которые хранят многократные пиксели с одной выборкой в одном элементе данных.SinglePixelPackedSampleModel
— используемый, чтобы извлечь выборки из изображений, которые хранят демонстрационные данные для единственного пикселя в одном элементе массива данных в первом банке a DataBuffer
.Пиксельные данные, представленные SampleModel
май или, возможно, не коррелирует непосредственно к цветному представлению данных определенной цветовой модели, в зависимости от источника данных. Например, в данных фотографического изображения, выборки могут представить данные RGB. В данных изображения от медицинского устройства обработки изображений выборки могут представить различные типы данных, такие как плотность кости или температура.
Есть три категории методов для того, чтобы получить доступ к данным изображения. getPixel
методы возвращают целый пиксель как массив с одной записью для каждой выборки. getDataElement
методы обеспечивают доступ к сырым данным, неинтерпретируемые данные, хранившие в DataBuffer
. getSample
методы обеспечивают доступ к пиксельным компонентам для определенной полосы.
В дополнение к Raster
объект для того, чтобы управлять данными изображения, BufferedImage
class включает a ColorModel
для того, чтобы интерпретировать те данные как цветные пиксельные значения. Краткий обзор ColorModel
class определяет методы для того, чтобы превратить пиксельные данные изображения в значение цвета в его связанном ColorSpace
.
java.awt.image
пакет обеспечивает четыре типа цветовых моделей:
PackedColorModel
— Краткий обзор ColorModel
это представляет пиксельные значения, которым встроили компоненты цвета непосредственно в битах целочисленного пикселя. A DirectColorModel
подкласс PackedColorModel
.DirectColorModel
— a ColorModel
это представляет пиксельные значения, которым встроили компоненты цвета RGB непосредственно в битах пикселя непосредственно. DirectColorModel
модель подобна визуальному TrueColor X11.ComponentColorModel
— a ColorModel
это может обработать произвольное ColorSpace
и массив компонентов цвета, чтобы соответствовать ColorSpace
.IndexColorModel
— a ColorModel
это представляет пиксельные значения, которые являются индексами в фиксированную карту цветов в sRGB цветовом пространстве.ComponentColorModel
и PackedColorModel
новы в Java™ 2 выпуска программного обеспечения SDK.
Основанный на данных в DataBuffer
, SampleModel
обеспечивает ColorModel
с пикселем, который ColorModel
тогда интерпретирует как цвет.
Таблица поиска содержит данные для одного или более каналов или компонентов изображения; например, разделите массивы для R, Г, и B. java.awt.image
пакет определяет два типа таблиц поиска, которые расширяют краткий обзор LookupTable
class, тот, который содержит данные байта и тот, который содержит короткие данные (ByteLookupTable
и ShortLookupData
).
Пакет изображения обеспечивает пару интерфейсов, которые определяют операции на BufferedImage
и Raster
объекты: BufferedImageOp
и RasterOp
.
Классы, которые реализуют эти интерфейсы, включают AffineTransformOp
, BandCombineOp, ColorConvertOp, ConvolveOp
, LookupOp, RescaleOp
. Эти классы могут использоваться, чтобы геометрически преобразовать, размыть, увеличить резкость, улучшить контраст, порог, и цветные корректные изображения.
Рисунок 5-4 иллюстрирует граничное обнаружение и улучшение, работу, которая подчеркивает резкие изменения в интенсивности в пределах изображения. Граничное обнаружение обычно используется в медицинской обработке изображений и отображении приложений. Граничное обнаружение используется, чтобы увеличить контраст между смежными структурами в изображении, позволяя средство просмотра отличить большую деталь.
Следующий код иллюстрирует граничное обнаружение:
float[] elements = { 0.0f, -1.0f, 0.0f, -1.0f, 4.f, -1.0f, 0.0f, -1.0f, 0.0f}; ... BufferedImage bimg = new BufferedImage(bw,bh,BufferedImage.TYPE_INT_RGB); Kernel kernel = new Kernel(3, 3, elements); ConvolveOp cop = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null); cop.filter(bi,bimg);
Рисунок 5-5 демонстрирует манипулирование таблицей поиска. Работа поиска может использоваться, чтобы изменить отдельные компоненты пикселя.
Следующий код демонстрирует манипулирование Таблицы поиска:
byte reverse[] = new byte[256]; for (int j=0; j<200; j++){ reverse[j]=(byte)(256-j); } ByteLookupTable blut=new ByteLookupTable(0, reverse); LookupOp lop = new LookupOp(blut, null); lop.filter(bi,bimg);
Рисунок 5-6 иллюстрирует перемасштабирование. Перемасштабирование может увеличить или уменьшить интенсивность всех точек. Перемасштабирование может использоваться, чтобы увеличить динамический диапазон иначе нейтрального изображения, производя деталь в области, которая кажется нейтральной или плоской.
Следующий фрагмент кода иллюстрирует перемасштабирование:
Свертка является процессом, который лежит в основе большинства пространственных алгоритмов фильтрации. Свертка является процессом взвешивания или усреднения значения каждого пикселя в изображении со значениями соседних пикселей. Это позволяет каждому выходному пикселю влияться непосредственным окружением в пути, который может быть математически определен с ядром. Рисунок 5-7 иллюстрирует Свертку.
Следующий фрагмент кода иллюстрирует, как использовать один из классов обработки изображений, ConvolveOp
. В этом примере каждый пиксель в исходном изображении усредняется одинаково с восемью пикселями, которые окружают это.
float weight = 1.0f/9.0f;float[] elements = new float[9]; // create 2D array// fill the array with nine equal elements for (i = 0; i < 9; i++) { elements[i] = weight;}// use the array of elements as argument to create a Kernelprivate Kernel myKernel = new Kernel(3, 3, elements);public ConvolveOp simpleBlur = new ConvolveOp(myKernel); // sourceImage and destImage are instances of BufferedImagesimpleBlur.filter(sourceImage, destImage) // blur the image
Переменная simpleBlur содержит новый экземпляр ConvolveOp
это реализует работу размытости на a BufferedImage
или a Raster
. Предположите, что sourceImage и destImage являются двумя экземплярами BufferedImage
. Когда Вы вызываете filter
, базовый метод ConvolveOp
class, это устанавливает значение каждого пикселя в целевом изображении, составляя в среднем соответствующий пиксель в исходном изображении с восемью пикселями, которые окружают это.
Ядро свертки в этом примере могло быть представлено следующей матрицей с элементами, определенными к четырем значащим цифрам:
Когда изображение скручивается, значение каждого пикселя в целевом изображении вычисляется при использовании ядра как ряд весов, чтобы составить в среднем значение пикселя со значениями окружающих пикселей. Эта работа выполняется на каждом канале изображения.
Следующая формула показывает, как веса в ядре связываются с пикселями в исходном изображении, когда свертка выполняется. Каждое значение в ядре связывается к пространственной позиции в изображении.
Значение целевого пикселя является суммой продуктов весов в ядре, умноженном на значение соответствующего исходного пикселя. Для многих простых операций ядро является матрицей, которая является квадратной и симметричной, и сумма ее весов составляет в целом од 2
Ядро свертки в этом примере относительно просто. Это взвешивает каждый пиксель из исходного изображения одинаково. Выбирая ядро, которое взвешивает исходное изображение на более высоком или более низком уровне, программа может увеличить или уменьшить интенсивность целевого изображения. Kernel
объект, который устанавливается в ConvolveOp
конструктор, определяет тип фильтрации, которая выполняется. Устанавливая другие значения, можно выполнить другие типы сверток, включая размывание (такие как Гауссова размытость, радиальная размытость, и размытость изображения движущегося объекта), увеличение резкости, и операции сглаживания. Рисунок 5-8 иллюстрирует увеличение резкости, используя Свертку.
Следующий фрагмент кода иллюстрирует увеличение резкости со Сверткой:
float[] elements = { 0.0f, -1.0f, 0.0f, -1.0f, 5.f, -1.0f, 0.0f, -1.0f, 0.0f}; ... Kernel kernel = new Kernel(3,3,elements); ConvolveOp cop = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null); cop.filter(bi,bimg);
Содержание | Предыдущий | Следующий |