Листинг 1 Класс, который содержит изображение, считанное из файла




Лабораторная работа № 2

 
 
БИЛИНЕЙНАЯ ИНТЕРПОЛЯЦИЯ ИЗОБРАЖЕНИЙ


 

 

Проверил Мартемьянов Б.В.

 

Выполнил студент группы к4136(ИТМО) Волков Г.О.

Рябов С.С.

 

Самара 2016

 

Цель работы: изучение классического метода увеличения растровых изображений.

 

Задание: Разработать среду для визуализации изображений, представленных в простейшем нестандартном формате, названным условно mbv.

 

Краткая теория:

УВЕЛИЧЕНИЕ РАСТРОВЫХ ИЗОБРАЖЕНИЙ

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

размера изображения, но и за счет одновременного расширения яркостного диапазона пикселей.

Самым эффективным методом по соотношению «качество решения задачи увеличения изображения» / «трудоемкость процесса» является метод билинейной интерполяции яркостей пикселей.

Под субпиксельной интерполяцией понимается вычисление яркости пиксела (отсутствующего на исходном изображении) смещенного относительно пиксельной сетки исходного изображения.

В методе билинейной интерполяции по координатам центра смещенного пиксела определяются координаты 4-х пикселов, центры которых ближе всего к центру смещенного пиксела. (рисунок 1).

Рисунок 1 – Билинейная субпиксельная интерполяции

Затем на системе из x найденных пикселей задается локальная система координат (СК) OXл Yл как показано на рисунке 1.

Центр смещенного пиксела расположен в точке (xл, yл) и (0 ≤ xл ≤ 1) Λ (0 ≤ yл ≤ 1).

Обозначим:

I(x, y) – яркость пиксела с координатами (x, y) в СК OXлYл. При этом

I(0, 0)= I1; I(1, 0)= I2; I(0, 1)= I3; I(1, 1)=I4.

Искомая яркость I(xл,yл) пиксела вычисляется по формуле:

I(xл, yл) = a xл + b yл + c xл yл – d, (1),

где d = I1;

a = I2 - d;

b = I3 - d; (13.3)

c = I4 - a - b - d.

 

НОРМИРОВАНИЕ ЯРКОСТИ ПИКСЕЛЕЙ ИЗОБРАЖЕНИЯ

Под нормированием яркости понимается приведения кодов яркости пикселов к некоторому диапазону. Процедура нормирования яркостей поясняется рисунком 2.

Рисунок 2 – Нормирование яркостей пикселей

 

Программа, считавшая изображение представлена на рисунке 1.

Рисунок 1. Программа, считавшая изображение

 

Пример работы программы с увеличенным фрагментом изображения представлен на рисунке 2.

Рисунок 2. Программа с увеличенным фрагментом изображения.

 

Листинг 1 Класс, который содержит изображение, считанное из файла

public class MbvImage { public static int MODE_NONE = 0x00; public static int MODE_x1 = 0x01; public static int MODE_x2 = 0x02; public static String EXTENSION = "MBV"; private boolean isValid = false; private BufferedImage image; public MbvImage() { } public MbvImage(String fileName, int mode) throws IllegalArgumentException, FileNotFoundException { this.open(fileName, mode); } public MbvImage(int[][] pixels) { BufferedImage image = new BufferedImage(pixels.length, pixels[0].length, BufferedImage.TYPE_INT_BGR); for (int i = 0; i < pixels.length; i++) { for (int j = 0; j < pixels[i].length; j++) { image.setRGB(i, j, pixels[i][j]); } } this.image = image; this.isValid = true; } public boolean isValid() { return this.isValid; } public boolean open(String fileName, int mode) throws IllegalArgumentException, FileNotFoundException { if (this.image!= null) { this.image = null; this.isValid = false; } File file = new File(fileName); if (!this.isCorrectFile(file)) { throw new IllegalArgumentException("Неверный формат файла"); } FileInputStream inStream = new FileInputStream(fileName); this.image = this.createImage(inStream, mode); try { inStream.close(); } catch (IOException ex) { Logger.getLogger(MbvImage.class.getName()).log(Level.SEVERE, null, ex); } if (this.image == null) { throw new IllegalArgumentException("Файл не может быть прочитан"); } this.isValid = true; return this.isValid; } public BufferedImage getBufferedImage() { return this.image; } protected boolean isCorrectFile(File file) { String fileName = file.getName(); int index = fileName.lastIndexOf('.'); if (index > 0 && fileName.substring(index + 1). compareToIgnoreCase(MbvImage.EXTENSION) == 0) { return true; } return false; } protected BufferedImage createImage(FileInputStream stream, int mode) { int width = this.readShort(stream); int height = this.readShort(stream); if (width <= 0 || height <= 0) { return null; } BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); int min = -1, max = -1; int[][] buffer = new int[width][height]; for (int h = 0; h < height; h++) { for (int w = 0; w < width; w++) { buffer[w][h] = this.readShort(stream); if (min == -1 || min > buffer[w][h]) { min = buffer[w][h]; } if (max == -1 || max < buffer[w][h]) { max = buffer[w][h]; } } } float k = 256f / (max - min); for (int h = 0; h < height; h++) { for (int w = 0; w < width; w++) { int value = Math.round((buffer[w][h] - min) * k) << mode; int rgb = value * 256 * 256 + value * 256 + value; image.setRGB(w, h, rgb); } } return image; } protected int readShort(FileInputStream stream) { byte[] b = new byte[2]; try { stream.read(b); return Byte.toUnsignedInt(b[1]) * 256 + Byte.toUnsignedInt(b[0]); } catch (IOException ex) { Logger.getLogger(MbvImage.class.getName()).log(Level.SEVERE, null, ex); } return -1; }}

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: