Библиотека OpenIMAJ не может читать файлы TIFF?
Я использую библиотеку OpenIMAJ, она хорошо работает с файлами "JPEG" и "PNG", но с файлами TIFF она выдает ошибку. Вот код:
import org.openimaj.image.ImageUtilities;
import org.openimaj.image.MBFImage;
....
File file = new File("/home/mosab/Desktop/input/tif.tif");
MBFImage input = ImageUtilities.readMBF(file);
А вот и ошибка:
Exception in thread "main" java.io.IOException: org.apache.sanselan.ImageReadException: Tiff: unknown compression: 7
at org.openimaj.image.ExtendedImageIO.read(ExtendedImageIO.java:189)
at org.openimaj.image.ExtendedImageIO.read(ExtendedImageIO.java:126)
at org.openimaj.image.ImageUtilities.readMBF(ImageUtilities.java:355)
at org.mosab.TestOpenIMAJ.TestKmeans.main(TestKmeans.java:49)
Caused by: org.apache.sanselan.ImageReadException: Tiff: unknown compression: 7
at org.apache.sanselan.formats.tiff.datareaders.DataReader.decompress(DataReader.java:135)
at org.apache.sanselan.formats.tiff.datareaders.DataReaderStrips.readImageData(DataReaderStrips.java:96)
at org.apache.sanselan.formats.tiff.TiffImageParser.getBufferedImage(TiffImageParser.java:505)
at org.apache.sanselan.formats.tiff.TiffDirectory.getTiffImage(TiffDirectory.java:163)
at org.apache.sanselan.formats.tiff.TiffImageParser.getBufferedImage(TiffImageParser.java:441)
at org.apache.sanselan.Sanselan.getBufferedImage(Sanselan.java:1264)
at org.apache.sanselan.Sanselan.getBufferedImage(Sanselan.java:1163)
at org.apache.sanselan.Sanselan.getBufferedImage(Sanselan.java:1136)
at org.openimaj.image.ExtendedImageIO.read(ExtendedImageIO.java:187)
... 3 more
Это файл TIFF (в частности, GeoTiff), который я использую:
" https://drive.google.com/file/d/0ByKaCojxzNa9MWxPTUJjZURHR1E/view?usp=sharing"
Означает ли это, что библиотека OpenIMAJ не поддерживает формат TIFF /GeoTiff?
Я предположил, что OpenIMAJ не поддерживает tiff, поэтому я попробовал библиотеку "TwelveMonkeys", чтобы прочитать этот файл. Библиотека "TwelveMonkeys" по отдельности / в одиночку умеет читать файл. Поэтому я импортировал библиотеку TwelveMonkeys, чтобы работать вместе с OpenIMAJ и, следовательно, поддерживать файлы TIFF, и это работало для некоторых файлов TIFF, но для этого файла это не сработало (хотя "TwelveMonkeys" смог прочитать ее отдельно в отдельном проекте), и я получил это исключение:
Exception in thread "main" java.io.IOException: Resetting to invalid mark
at java.io.BufferedInputStream.reset(BufferedInputStream.java:448)
at org.openimaj.image.ExtendedImageIO.read(ExtendedImageIO.java:185)
at org.openimaj.image.ExtendedImageIO.read(ExtendedImageIO.java:126)
at org.openimaj.image.ImageUtilities.readMBF(ImageUtilities.java:355)
at org.mosab.TestOpenIMAJ.TestKmeans.main(TestKmeans.java:49)
Позже, когда я отслеживал сообщение об ошибке, я обнаружил, что что-то может быть связано с размером файла, потому что он составляет около 26 МБ, и я заметил, что ошибка происходит из метода "read" класса "org.openimaj.image.ExtendedImageIO", который я думаю, что он использует размер максимум 10 МБ:
public static BufferedImage read(InputStream input) throws IOException {
if (input == null) {
throw new IllegalArgumentException("input == null!");
}
final NonClosableInputStream buffer = new NonClosableInputStream(input);
buffer.mark(10 * 1024 * 1024); // 10mb I think here is the problem
BufferedImage bi;
try {
bi = readInternal(buffer);
} catch (final Exception ex) {
bi = null;
}
if (bi == null) {
buffer.reset();
try {
bi = Sanselan.getBufferedImage(buffer);
} catch (final Throwable e) {
throw new IOException(e);
}
}
return bi;
}
Итак, как я могу исправить эту проблему и прочитать этот tiff-файл в OpenIMAJ(Для дальнейшего применения возможностей, OpenIMAJ предоставляет, как кластеризация / сегментация)?
1 ответ
TIFF - ужасный формат, поскольку он имеет много пользовательских расширений, которые не всегда поддерживаются библиотеками. OpenIMAJ пытается обойти некоторые из этих проблем, используя пакет различных библиотек для чтения всевозможных изображений, однако в этом случае это не удается. Как вы заметили, существует ограничение в 10 МБ буфера, которое вызывает проблему - увеличение его до 100 МБ позволяет загружать изображение, на которое вы ссылаетесь. Я обновлю код для решения этой проблемы (так как это всего лишь предел, может показаться, что базовый буфер намного меньше, поэтому это не должно вызывать никаких проблем).
В качестве быстрого обходного пути до развертывания нового снимка, вы можете загрузить изображение, которое вы связали с этим:
MBFImage img = ImageUtilities.
createMBFImage(Sanselan.getBufferedImage(new File("tif.tif")), false);
Казалось бы, отдельная проблема заключается в том, что Sanselan не может загрузить все ваши изображения (на основе трассировки стека, ссылающейся на неизвестное сжатие изображений). Если вы можете предоставить ссылку на такое изображение в отчете об ошибке на GitHub ( https://github.com/openimaj/openimaj/issues/119), то можно было бы использовать код, который использует TwelveMonkeys для таких изображений, или мы можно увидеть, если более новая версия Sanselan исправляет эту проблему. Опять же, тем временем вы можете использовать TwelveMonkeys непосредственно для этих изображений в вашем коде и конвертировать в MBFImage
с помощью ImageUtilities
как указано выше.