Tôi đang làm việc với hình ảnh tif cực lớn mà tôi đang sáng tác thành một hình ảnh đơn lớn. Tôi có một thư viện được tạo ra bởi một đồng nghiệp của tôi tạo ra kim tự tháp hình ảnh và cung cấp một công cụ rất tiện dụng để hình dung kim tự tháp hình ảnh. Trình hiển thị này rất tuyệt vời khi chụp ảnh cao điểm ở hình ảnh lớn và xác định các điểm quan tâm trực quan, nhưng khách hàng quan tâm nhiều hơn đến việc phân tích hình ảnh trên những hình ảnh lớn này.Java - Cách viết hình ảnh tif rất lớn (20.000x20.000 px hoặc lớn hơn)
Do đó, cần phải xuất hình ảnh rất lớn thành một tệp. Tôi thấy điều này là phiền hà khi xem xét những hình ảnh này có thể ở bất kỳ đâu từ 800 MB đến nhiều GB. Và chỉ nhiệm vụ tải hình ảnh này vào bộ nhớ là khó khăn, đặc biệt khi phân tích hình ảnh đang được thực hiện.
Tôi đã tự hỏi, nếu nó có thể trong java để viết hình ảnh tiff lớn này trong một khối hoặc line-by-line thời trang. Hiện tại, ứng dụng của tôi đang hết bộ nhớ trên các máy nhỏ (8 GB RAM).
Phương pháp hiện hành đối với sáng tác những hình ảnh này là:
Store giá trị pixel thành một
BufferedImage
sử dụng mộtWritableRaster
short[][]pixels = ... BufferedImage image = new BufferedImage(width, height, type); WritableRaster = image.getRaster(); for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { raster.setSample(col, row, 0, pixel[row][col]); } }
Và sau đó viết hình ảnh đệm vào đĩa. Đối với phần này tôi đang sử dụng
ImageJ
để viết hình ảnh dưới dạng tif. Nếu có những cách tốt hơn để hỗ trợ 16-bit hình ảnh tif màu xám, sau đó tôi sẽ được hạnh phúc để có một cái nhìn// BufferedImage image; from above ... ImagePlus img = new ImagePlus(); img.setImage(image); FileSaver fs = new FileSaver(img); fs.saveAsTiff(file.getAbsolutePath());
Vấn đề với phương pháp này là nó có quá lớn của một bộ nhớ cho một 8GB của máy RAM.
Lý tưởng nhất những gì tôi muốn là chỉ cần có một đơn short[][]pixels
. Điều này chủ yếu là vì tôi cần tính toán một hàm pha trộn trung bình, do đó một số dấu vết bộ nhớ sẽ xuất hiện ở đó. Cũng trong tương lai tôi sẽ thêm một hỗn hợp tuyến tính. short[][]pixels
chỉ mất ~ 765 MB RAM cho dữ liệu pixel 20k x 20k, mà tôi nghĩ hiện không thể tránh khỏi, vì vậy đối với hình ảnh lớn hơn ví dụ 100k x 100k pixel, tôi hy vọng rằng các nhà sinh học sẽ không muốn xuất hình ảnh này nó sẽ chiếm 18GB RAM.
Sau đó, tôi sẽ sửa đổi mã để hỗ trợ xuất các hình ảnh cực lớn như 100k x 100k. Bây giờ tôi ổn với giả sử một phần của bộ nhớ để lưu trữ các giá trị pixel ban đầu.
Vì vậy, một phương pháp tốt để viết các phần của hình ảnh tif vào đĩa là gì để tôi có thể hỗ trợ viết ra các hình ảnh cốt lõi như hình ảnh 100k x 100k.
tôi đã xem bài này: Write tiled output of TIFF, using ImageIO in Java
Nhưng nó chỉ thảo luận về TIFF 6.0 spec. Nhưng tôi sẽ xem xét ImageOutputStreams
. Tif là một con thú mặc dù vậy tôi có thể chỉ cần cắn viên đạn và khuyến khích các nhà sinh học chỉ xuất khẩu các khu vực quan tâm.
EDIT: tìm thấy một giải pháp khả thi:
và
trang nhóm chính: https://github.com/openmicroscopy/bioformats
Bạn có thể làm việc với hình ảnh trong các phần, giả sử 10k ô vuông px sau đó hợp nhất chúng lại với nhau không? –
Tôi không có vấn đề khi làm việc với hình vuông 10k px, vấn đề là cách viết chúng vào một tệp tif. – Jameshobbs
Bạn có lẽ nên phân chia vấn đề. 1. Viết một tệp dữ liệu hình ảnh thô lớn. 2. Đọc và lưu dưới dạng tiff. Khi công trình đó hoạt động, bạn có thể xem xét việc thực hiện nó trong 1 lần. – hyde