2017-02-14 38 views
8

Trong ứng dụng, có khoảng 1 tỷ hình ảnh png (kích thước 1024 * 1024 và khoảng 1MB), cần kết hợp 1 tỷ hình ảnh với một hình ảnh lớn, sau đó tạo ra kích thước 1024 * 1024 thumbnail đơn cho nó . Hoặc có lẽ chúng ta không cần phải thực sự kết hợp các hình ảnh với một hình ảnh lớn, nhưng chỉ cần thực hiện một số thuật toán ma thuật để tạo ra hình thu nhỏ đơn nhất trong bộ nhớ máy tính? Trong khi đó quá trình này cần phải được thực hiện càng nhanh càng tốt, tốt hơn trong vài giây, hoặc ít nhất là trong một vài phút. Có ai có ý tưởng?Làm thế nào để tạo ra một hình thu nhỏ đơn nhất cho một tỷ hình ảnh png?

enter image description here

+2

Tỷ USD ('10 ** 9') hoặc EU tỷ (' 10 ** 12')? – alk

+0

Có nghĩa là một tỷ, một số lượng lớn. – Suge

+0

Bạn có ý nghĩa gì bởi * hình thu nhỏ đơn nhất * và cho mục đích gì? – user694733

Trả lời

3

ImageMagick có thể làm điều đó:

montage -tile *.png tiled.png

Nếu bạn không muốn sử dụng một helper bên ngoài vì lý do gì, bạn vẫn có thể sử dụng các nguồn.

+0

Nó rất chậm đối với số lượng lớn hình ảnh trong thử nghiệm của tôi, bất kỳ đề xuất nào? – Suge

+0

Vì vậy, trên một cụm máy, sử dụng montage (với -resize) sẽ cho phép hình ảnh được nhóm lại với nhau. Vì vậy, để đạt được mục tiêu của bạn, trước tiên bạn sẽ tạo ra một tập hợp các công việc nxn và chạy chúng, sau đó trên các đoạn phim được tạo ra, lặp lại cho đến khi bạn còn lại với một montage duy nhất. – mksteve

9

Ý tưởng tải một tỷ hình ảnh vào một quá trình montage là vô lý. Câu hỏi của bạn không rõ ràng, nhưng cách tiếp cận của bạn phải là xác định số lượng pixel mỗi hình ảnh ban đầu sẽ tính vào hình ảnh cuối cùng của bạn, sau đó trích xuất số pixel cần thiết từ mỗi hình ảnh song song. Sau đó, ghép các pixel đó thành hình ảnh cuối cùng.

Vì vậy, nếu mỗi hình ảnh sẽ được đại diện bởi một điểm ảnh trong hình ảnh cuối cùng của bạn, bạn cần phải nhận được giá trị trung bình của mỗi hình ảnh mà bạn có thể làm như thế này:

convert image1.png image2.png ... -format "%[fx:mean.r],%[fx:mean.g],%[fx:mean.b]:%f\n" info: 

Sample Output

0.423529,0.996078,0:image1.png 
0.0262457,0,0:image2.png 

Bạn có thể làm điều đó sau đó rất nhanh song song với GNU song song, sử dụng một cái gì đó giống như

find . -name \*.png -print0 | parallel -0 convert {} -format "%[fx:mean.r],%[fx:mean.g],%[fx:mean.b]:%f\n" info: 

Sau đó, bạn có thể tạo ra hình ảnh cuối cùng và đặt các điểm ảnh cá nhân trong.

quét thậm chí 1.000.000 file PNG có thể sẽ mất nhiều giờ ...

Bạn đừng nói lớn như thế nào hình ảnh của bạn , nhưng nếu chúng có thứ tự 1MB, và bạn có 1.000.000.000 thì bạn cần phải làm một petabyte I/O để đọc chúng, vì vậy ngay cả với SSD siêu nhanh 500MB/s, bạn sẽ có 23 ngày .

+0

Nếu hình ảnh xếp kề sẽ được tải lên từ các máy khách khác nhau, bạn có nên tạo ra pixel đại diện trên máy khách trước khi tải lên, sau đó ghép các pixel vào hình ảnh trên máy chủ không? Cách này sẽ rất nhanh? – Suge

+1

Câu trả lời tùy thuộc vào môi trường của bạn, thật không may, tôi không thể hiểu được với mô tả hiện tại. Nếu có 1.000.000.000 khách hàng gửi cho bạn một hình ảnh, điều đó sẽ có ý nghĩa đối với mỗi người gửi cho bạn mức tối thiểu cần thiết. Nếu chỉ có 1024 khách hàng mỗi cung cấp 1.000.000 hình ảnh, nó sẽ có ý nghĩa cho mỗi khách hàng để làm việc ra một khối toàn cho bạn nhưng bạn không thể làm điều đó nếu mỗi khách hàng chỉ gửi một hình ảnh. Nói chung, càng có nhiều máy bạn có thể làm việc trên từng bộ phận, thì càng tốt. –

+2

Tôi xin trân trọng đề nghị bạn chỉnh sửa câu hỏi của bạn và cải thiện câu hỏi để dân gian không phải đoán và lãng phí thời gian của họ bao gồm các trường hợp có thể không liên quan hoặc không đưa ra câu trả lời dựa trên giả định sai phát sinh từ mô tả kém ... –

3

Thuật toán ngẫu nhiên như lấy mẫu ngẫu nhiên có thể khả thi.

Xem xét hình ảnh kết hợp quá lớn, bất kỳ thuật toán tuyến tính nào đều có thể bị lỗi, chưa kể đến phương pháp phức tạp cao hơn.

Theo tính toán, chúng tôi có thể phỏng đoán mỗi pixel hình ảnh thu nhỏ phụ thuộc vào 1000 hình ảnh. Vì vậy, một mẫu duy nhất còn lại không ảnh hưởng đến kết quả nhiều.

Mô tả thuật toán có thể như sau:

Đối với mỗi điểm ảnh thumbnail phối hợp, chọn ngẫu nhiên hình ảnh N mà vào vị trí tương ứng, và mỗi mẫu ảnh M pixel và sau đó tính toán giá trị trung bình của họ. Làm tương tự cho các điểm ảnh thu nhỏ khác.

Tuy nhiên, nếu hình ảnh của bạn được kết hợp ngẫu nhiên, kết quả có xu hướng là hình ảnh có thang màu xám có giá trị 0,5.Bởi vì theo Định lý giới hạn trung tâm, phương sai của pixel hình ảnh thu nhỏ có xu hướng bằng không. Vì vậy, bạn có đảm bảo hình thu nhỏ kết hợp được cấu trúc chính nó.

PS: sử dụng OpenCV sẽ là lựa chọn tốt

Các vấn đề liên quan