Không phải tất cả các hình ảnh kỹ thuật số cuối cùng chỉ là giá trị pixel trong khoảng 0 - 255?


56

Tôi có một vài câu hỏi cực kỳ cơ bản (ngu ngốc?) Về hình ảnh; cụ thể, định dạng hình ảnh và giá trị pixel.

Tha lỗi cho tôi, tôi không phải là một nhiếp ảnh gia. Tôi chỉ là người làm việc với hình ảnh và với tôi, họ chỉ là những hàng và cột số.

Câu hỏi của tôi là:

Nếu ở cốt lõi, ảnh chỉ là 3 kênh giá trị pixel [0, 255] X RBG, thì làm sao có thể có bất kỳ sự khác biệt nào giữa hai định dạng hình ảnh? Ý tôi là, điều gì làm cho RAW khác với TIFF - không phải tất cả đều bị giới hạn ở các giá trị trong khoảng từ 0 - 255? Một số là một số - không nên chỉ có một định dạng có thể đặt? Hoặc, không nên để bất kỳ hai hình ảnh có cùng chiều cao và chiều rộng bị khóa có cùng kích thước tệp?

Hơn nữa, từ quan điểm số, điều gì làm cho một cái gì đó giống như hình ảnh 16 bit khác với hình ảnh 32 bit? Một lần nữa, một hình ảnh chỉ là một mảng với các giá trị nguyên nằm trong khoảng 0 -255.

Tiếp tục với viễn cảnh này rằng một hình ảnh trên hệ thống tập tin của máy tính chỉ là một dãy số nguyên 3 kênh trong khoảng từ 0 - 255, ví dụ như việc nén một hình ảnh vào một định dạng mất dữ liệu như JPG là gì? Giả sử thuật toán nén thay đổi một số giá trị pixel từ 254 thành 255 hoặc bất cứ điều gì. Vì thế? Làm thế nào mà cung cấp bất kỳ tiết kiệm trong kích thước tập tin hoặc thực hiện bất kỳ tác động đến chất lượng hình ảnh?

Tôi biết rằng có rất nhiều cách khác nhau để lưu trữ dữ liệu hình ảnh. Nhưng tôi không hỏi về bất cứ điều gì ngoài hình ảnh RBC 3 kênh cơ bản. Tất cả những gì tôi biết là nếu ai đó đưa cho tôi một trong những thứ này, thì bây giờ tôi có một dãy số. Tôi không có lý do để biết tại sao một mảng số có thể khác bất kỳ mảng số nào khác từ 0 đến 255. Tôi hy vọng điều này có ý nghĩa. Câu hỏi này không giới hạn ở định dạng RAW! Thay vào đó, đó là về bất kỳ mảng giá trị pixel nào


32
Tôi bắt đầu tự hỏi liệu quan niệm sai lầm này xuất phát từ việc làm việc với cấp độ cao hơn. Bạn đang đọc các tập tin với MATLAB hoặc một số công cụ khác? Tin tôi đi, nếu bạn mở và đọc tệp TIFF, PNG hoặc JPG ở cấp tệp thô, bạn sẽ phải thực hiện khá nhiều việc trước khi kết thúc với ma trận RGB đẹp và sạch.
ống

2
Nó sẽ giúp nếu OP có thể cung cấp thêm một chút bối cảnh. Ví dụ, điều này có liên quan đến mã xử lý hình ảnh?
remco

1
Về chỉnh sửa: nếu bạn được cung cấp một dãy số, chỉ cần làm việc với nó. Mảng kia ở đâu? Nếu bạn có 2 mảng để so sánh thì đó là một câu chuyện khác. Những giá trị này có thể chứa các giá trị đủ gần giống với mắt người. Và được cung cấp một mảng, sau khi mã hóa bị mất, giải mã mảng sẽ không bao giờ cung cấp cho bạn mảng ban đầu, nhưng là một mảng đủ gần
phuclv

3
Cảnh giác với các gói phần mềm có ý định nhập TIFF, FITS và các hình ảnh không nén khác. Nhiều gói như vậy, bao gồm MATLAB cơ sở và các công cụ python, tự động cắt dữ liệu thành 8 bit bất kể kích thước nguồn. Nếu bạn muốn tránh điều này, bạn sẽ phải tìm các chức năng / thư viện chuyên dụng hoặc cuộn các công cụ của riêng bạn.
Carl Witthoft

2
@Monica Heddneck: đã có một loạt các câu trả lời hay khiến bạn nghĩ thẳng rằng không, một hình ảnh không đơn giản là một mảng pixel của các giá trị RGB255, nhưng tôi đơn giản là không hiểu tại sao bạn không hiểu lý do cho các định dạng nén. Họ ở đó để lưu dữ liệu trong kho hoặc quá cảnh. Nén sẽ có ích ngay cả khi tất cả các hình ảnh chỉ là bộ ba RGB255.
Gábor

Câu trả lời:


72

Xin lỗi, nhưng tiền đề cơ bản của bạn là sai: một hình ảnh có thể được mã hóa dưới dạng một mảng các pixel RBG với 8 bit cho mỗi giá trị, nhưng có rất nhiều cách khác:

  • một kênh với một bit / kênh (đen trắng thuần khiết),
  • một kênh có x bit / kênh (định dạng thang độ xám, x thường sẽ là 8 hoặc 16, cho giá trị 256 hoặc 65536),
  • các định dạng dựa trên bảng màu khác nhau (cfGIF)
  • đầy đủ màu sắc (ít nhất là trên lý thuyết) nhiều kênh như bạn muốn với bất kỳ độ sâu bit cần thiết nào.

Và đó là hình ảnh được lưu trữ trong RAM của máy tính trong khi chỉnh sửa / xem. Tôi đang bỏ qua các định dạng hình ảnh RAW khác nhau tồn tại (ở đây và trong phần còn lại của bài đăng này).

Để chụp ảnh , phổ biến nhất là 3 kênh với 8, 16 hoặc 32 bit / kênh (thường là số nguyên, nhưng ít nhất một số chương trình hoạt động nội bộ với số dấu phẩy động 32 bit). Thường có kênh thứ 4 (alpha), đặc biệt khi chương trình cho phép sử dụng các lớp. Và ở đâu đó, kích thước của mảng hình ảnh cần được lưu trữ.

Có nhiều lý do cho các định dạng khác nhau. Đối với định dạng trong bộ nhớ, một cân nhắc quan trọng được sử dụng là kích thước của dữ liệu và tốc độ (nhanh hơn nhiều để thao tác với một kênh 8 bit so với 4 kênh 32 bit). Những thứ đó ít quan trọng hơn hiện nay, nhưng chúng tôi có quản lý màu sắc đầy đủ với nhiều không gian màu khác nhau. Một số trong số đó (ví dụ như RGB tiên tri) cần ít nhất 16 bit / kênh để giữ sự khác biệt giữa các màu lân cận đủ nhỏ để tránh hiện tượng dải màu nhìn thấy được. Và khi các phương pháp điều trị trở nên phức tạp hơn, có những lợi thế khi sử dụng số dấu phẩy động 32 bit (trong đó màu sắc được mã hóa với các giá trị trong khoảng từ 0,0 đến 1,0 và việc xử lý cho phép các giá trị trung gian nằm ngoài phạm vi này).

Nếu bạn muốn có thể lưu trữ hình ảnh vào tệp và tải lại nó vào cùng một dữ liệu trong bộ nhớ, bạn sẽ cần sử dụng ít nhất nhiều bit trên mỗi kênh như định dạng bộ nhớ im và bạn phải lưu trữ thông tin về kích thước hình ảnh, độ sâu bit và không gian màu.

Người dùng của những hình ảnh đó cũng muốn lưu trữ một số thông tin bổ sung về hình ảnh (chú thích, tiêu đề, người đã chụp ảnh, v.v ...). Một lần nữa nhiều cách khác nhau để lưu trữ thông tin này.

Sau đó, có nhiều cách khác nhau để nén dữ liệu hình ảnh để lưu trữ tệp. Một trong những cái đơn giản hơn là RLE (Mã hóa độ dài chạy), trong đó bạn lưu trữ số đếm và giá trị pixel bất cứ khi nào bạn gặp giá trị pixel lặp lại. Những người khác, như jpeg, phức tạp hơn rất nhiều, nhưng cũng cho phép nén nhiều hơn. Ví dụ: jpeg sử dụng biến đổi cosine và loại bỏ thông tin tần số cao (ít nhìn thấy hơn), cho tốc độ nén cao với chi phí mất thông tin (có nhiều hơn thế, nhưng điều này sẽ kéo dài quá lâu).

Điều này đã đưa ra rất nhiều cách để lưu trữ thông tin trên đĩa, nhưng dù bạn chọn cách nào, định dạng phải được chỉ định rõ để cho phép diễn giải chính xác khi tải hình ảnh.

Sau đó, có một sự phát triển không ngừng trong các kỹ thuật nén không mất dữ liệu, mà các định dạng hiện tại không thể luôn luôn xử lý.

Vì vậy, chúng tôi kết thúc với nhiều định dạng tệp khác nhau, với sự đánh đổi khác nhau giữa độ trung thực của thông tin được lưu trữ, chiếm dung lượng ổ đĩa và tốc độ đọc, ghi và truyền (so sánh kích thước của TIFF không nén và jpg chất lượng khá) .


Sau khi xem câu hỏi được chỉnh sửa, một số khía cạnh bổ sung:

Nếu bạn được xử lý một hình ảnh trong bộ nhớ, nó sẽ ở dạng một hoặc nhiều mảng. Tại thời điểm đó, định dạng tệp gốc không còn đóng vai trò nữa. Tôi sẽ giả sử bạn được xử lý dữ liệu của mình với 8 bit / kênh.

Nhưng bạn sẽ phải biết nếu bạn có một hình ảnh được xử lý hoặc một hình ảnh thô, vì có hai sự khác biệt quan trọng giữa chúng:

  • hình ảnh thô thường có 1 màu trên mỗi pixel và các pixel thường được sắp xếp trong một mảng của Bayer với 2 pixel màu xanh lá cây, 1 màu đỏ và 1 màu xanh trên mỗi ô vuông 4 pixel. Các giá trị tỷ lệ thuận với cường độ cảnh (ngoại trừ các giá trị rất thấp và rất cao).
  • hình ảnh được xử lý có thể được sắp xếp thành một mảng các bản ghi 2D chứa 3 giá trị số hoặc dưới dạng các mặt phẳng màu (3 mảng 2D, một cho mỗi R, G, B). Ngoài ra, các giá trị thường không tỷ lệ thuận với cường độ cảnh . Tồi tệ hơn, mối quan hệ chính xác giữa các giá trị pixel và cường độ cảnh phụ thuộc vào quá trình xử lý hình ảnh đã có. Và sự cân bằng giữa các màu đã được điều chỉnh để tương ứng với phản ứng của mắt người (Cân bằng trắng, đỏ và xanh dương được khuếch đại so với màu xanh lá cây).

Vì vậy, nếu bạn nhận được một hình ảnh thô với 3 giá trị màu cho mỗi pixel, thì hình ảnh thô đó đã được xử lý (ít nhất là khử màu hoặc tạo đơn giản 4 pixel thô thành 1 pixel hình ảnh). Cho dù đó là chấp nhận được, sẽ phụ thuộc vào ứng dụng của bạn.


Tôi ít quan tâm đến nhiều cách khác nhau để thể hiện hình ảnh, nhưng thay vào đó, nếu tôi được cung cấp hai ma trận 3 kênh, điều gì làm cho một trong những cách này khác với những cách khác? Sự khác biệt giữa nói TIFF và RAW là gì, nếu cả hai đều là mảng 3 chiều?
Monica Heddneck

4
Có lẽ quan tâm, tôi đã nhầm lẫn khi bạn nói hình ảnh 16 bit là 16 bit trên mỗi kênh. Trong thế giới đồ họa máy tính, hình ảnh 16 bit là 16 bit cho tổng số của cả 3 kênh (thường là 5 màu đỏ, 6, xanh lục, 5 xanh lam). Tôi chỉ muốn chỉ ra điều này trong một bình luận, để ai đó đang nhìn thấy màu 16 bit nhận thức được rằng có hai ý nghĩa cho thuật ngữ đó, tùy thuộc vào người đang sử dụng nó.
Cort Ammon

"Nhanh hơn nhiều để thao tác một kênh 8 bit so với 4 kênh 32 bit". Ý bạn là "thao tác nhanh hơn một kênh 32 bit so với 4 kênh 8 bit"?
l0b0

1
@MonicaHeddneck Nếu một trong các ma trận chứa dữ liệu RGB, trong khi các ma trận khác chứa dữ liệu HSV, thì chắc chắn, kích thước và độ sâu bit của cả hai mảng là như nhau và khi được hiển thị cho thiết bị hiển thị, chúng sẽ trông giống nhau ( + ) nhưng dữ liệu được lưu trữ trong hai mảng chắc chắn không giống nhau. ( + ) Trên thực tế, chúng sẽ không giống hệt nhau, vì trong khi 888RGB và 888HSV đều có 2 ^ 24 "điểm" trong các gam màu tương ứng của chúng, không có ánh xạ một-một giữa hai bộ điểm. Tuy nhiên, trong thực tế có lẽ sẽ rất khó để thấy sự khác biệt với mắt người.
dgnuff

Trên thực tế, điểm của hdr 32 bit màu nổi mà nó không được mã hóa thành 0 thành 1 mà là 0 thành bất cứ thứ gì nếu bạn thực sự sẽ làm điều đó sau đó sử dụng số nguyên thay thế. Giống như ánh sáng thực sự không có giới hạn trên. Nhưng bạn sẽ chỉ thấy một lát của nó. Điều này hữu ích vì nhiều lý do, nhưng nếu bạn khởi kiện chúng chẳng hạn như phản chiếu 3d thì năng lượng thực sự vẫn bị bắt giữ, điều này rất quan trọng đối với những thứ như bầu trời và độ chọn lọc 20% chẳng hạn
joojaa

48

Nếu ở lõi, ảnh chỉ là 3 kênh giá trị pixel [0, 255] X RBG,

Nhưng ảnh không phải là "chỉ 3 kênh giá trị pixel" thậm chí "ở lõi". Màn hình máy tính thường được tạo thành từ một mảng các pixel RGB, vì vậy, nếu bạn muốn hiển thị một hình ảnh trên màn hình máy tính, đôi khi, bạn phải ánh xạ bất kỳ dữ liệu hình ảnh nào bạn có vào một mảng các pixel RGB, nhưng dữ liệu đó chỉ là một kết xuất cụ thể của dữ liệu hình ảnh. Dữ liệu trong ảnh có thể không bao gồm một luồng các giá trị pixel nào cả. Để có được giá trị pixel từ một hình ảnh, bạn phải biết cách dữ liệu được định dạng.

sau đó làm thế nào có thể có bất kỳ sự khác biệt giữa bất kỳ hai định dạng hình ảnh? Ý tôi là, điều gì làm cho RAW khác với TIFF - không phải tất cả đều bị giới hạn ở các giá trị trong khoảng từ 0 - 255?

Đó là hai ví dụ hay, bởi vì không một trong những định dạng đó nhất thiết phải chứa một mảng hình chữ nhật của các giá trị RGB.

RAW hoàn toàn không phải là một định dạng - đó là một loại tên bắt cho tất cả các tệp chứa dữ liệu được ghi trực tiếp từ cảm biến hình ảnh. Vì vậy, một tệp RAW có thể chứa một chuỗi các giá trị đại diện cho điện áp được đọc từ các trang web cảm biến khác nhau. Những trang web đó giống như pixel hình ảnh, nhưng chúng không phải là pixel RGB. Để có được các pixel RGB từ tệp RAW, bạn phải diễn giải dữ liệu đó trong ngữ cảnh thông tin về cảm biến, cài đặt camera tại thời điểm đó, v.v. Nói cách khác, bạn có thể mở tệp RAW trong trình chỉnh sửa hex và xem tất cả những gì bạn muốn, nhưng bạn sẽ không tìm thấy một giá trị RGB nào.

TIFF là viết tắt của định dạng tệp hình ảnh được gắn thẻ và đó là một định dạng rất thú vị bởi vì nó có thể chứa nhiều biểu diễn khác nhau của một hình ảnh. Một tệp TIFF có thể chứa hình ảnh "giống nhau" ở nhiều kích cỡ, như hình thu nhỏ, hình ảnh độ phân giải màn hình và hình ảnh độ phân giải in, và nó cũng có thể có các phiên bản màu và thang độ xám. Bạn có biết rằng máy fax thường gửi dữ liệu của họ dưới dạng tệp TIFF không? Để lấy pixel RGB ra khỏi tệp TIFF, bạn cần hiểu không chỉ định dạng TIFF mà còn cả định dạng của biểu diễn hình ảnh cụ thể trong tệp đó.

Một số là một số - không nên chỉ có một định dạng có thể đặt?

Không. Có rất nhiều định dạng hình ảnh khác nhau bởi vì mỗi người phục vụ một nhóm nhu cầu khác nhau. Việc nén JPEG bị mất rất tốt để có được các tệp hình ảnh rất nhỏ, nhưng sẽ không tốt cho những hình ảnh sẽ phải chỉnh sửa nhiều lần. Một số định dạng sử dụng xen kẽ , giúp đọc hình ảnh ở nhiều độ phân giải khác nhau rất nhanh. Và như vậy ... mỗi định dạng cung cấp hỗn hợp lợi thế và thỏa hiệp riêng.

Hoặc, không nên để bất kỳ hai hình ảnh có cùng chiều cao và chiều rộng bị khóa có cùng kích thước tệp?

Không, điều đó thật tồi tệ. Nếu kích thước của mỗi tệp hình ảnh về cơ bản phải là width * height * 3(giả sử màu 24 bit), thì bạn sẽ lãng phí rất nhiều dung lượng lưu trữ. Hầu hết các bức ảnh chứa rất nhiều dư thừa, tức là các khu vực có cùng màu được lặp lại nhiều lần. Để tiết kiệm không gian lưu trữ, thường có ý nghĩa để loại bỏ thông tin dư thừa đó. Một cách để làm điều đó, ví dụ, là chạy mã hóa chiều dàihoặc RLE. Ví dụ: nếu bạn có một vùng gồm 4195 pixel liên tiếp có màu trắng, thì việc mã hóa sẽ hiệu quả hơn rất nhiều vì "4195 pixel tiếp theo là tất cả {255, 255, 255}" thay vì chỉ lưu trữ nhiều pixel trắng đó tập tin. RLE thực sự được sử dụng trong một số định dạng hình ảnh, nhưng nhiều định dạng có sơ đồ phức tạp hơn nhiều giúp tiết kiệm không gian hơn rất nhiều và điều đó có nghĩa là bạn có thể lưu trữ nhiều hình ảnh hơn trên ổ cứng hoặc thẻ nhớ. Nó cũng làm cho nó nhanh hơn nhiều để gửi hình ảnh cho người khác.

Tiếp tục với viễn cảnh này rằng một hình ảnh trên hệ thống tập tin của máy tính chỉ là một dãy số nguyên 3 kênh trong khoảng từ 0 - 255, ví dụ như việc nén một hình ảnh vào một định dạng mất dữ liệu như JPG là gì?

Vấn đề là nó làm cho tập tin nhỏ hơn nhiều. Nén JPEG thường xuyên làm giảm kích thước của tệp theo hệ số 10 trở lên. Điều đó có nghĩa là bạn có thể phù hợp với nhiều hình ảnh hơn trên một thiết bị lưu trữ nhất định, bạn có thể sao chép chúng nhanh hơn, bạn có thể mở chúng nhanh hơn và bạn có thể tải lên và tải xuống nhanh hơn. Lưu trữ cùng một hình ảnh (hoặc gần như vậy) trong một không gian nhỏ hơn nhiều sẽ sử dụng tài nguyên hiệu quả hơn và do đó giảm chi phí. Hãy nghĩ về điều đó ở quy mô lớn: có thể phần lớn thông tin có sẵn trên Internet bao gồm hình ảnh và phim, và không nén chúng ta sẽ cần nhiều trung tâm dữ liệu lớn hơn hoặc tiêu thụ nhiều năng lượng hơn.

Giả sử thuật toán nén thay đổi một số giá trị pixel từ 254 thành 255 hoặc bất cứ điều gì. Vì thế? Làm thế nào mà cung cấp bất kỳ tiết kiệm trong kích thước tập tin hoặc thực hiện bất kỳ tác động đến chất lượng hình ảnh?

Hãy xem xét ví dụ RLE của tôi ở trên. Giả sử bạn có một bức ảnh bao gồm một bức tường trống lớn, vì vậy các khu vực lớn của bức ảnh của bạn đều có màu giống nhau, ngoại trừ có sự phân tán các pixel hơi tối hơn, hầu như không thể nhận thấy trong ảnh. Những pixel đó làm giảm hiệu quả của việc nén. Thay vì chỉ có thể nói "500.000 pixel tiếp theo là tất cả {243, 251, 227}", bạn phải chạy độ dài mã hóa nhiều khối nhỏ hơn nhiều, bởi vì thường thì bạn thường chạy vào một trong những pixel hơi khác nhau đó. Nếu bạn cho phép thuật toán nén thực hiện các thay đổi nhỏ, có lẽ chỉ thay đổi bất kỳ pixel nào không quá 1% hoặc 2%, thì bạn có thể có tỷ lệ nén cao hơn nhiều mà không thay đổi hình ảnh. Đó là một sự đánh đổi: bạn ' đang từ bỏ một lượng nhỏ thông tin trong ảnh gốc để đổi lại việc giảm kích thước tệp. Chính xác nơi bạn muốn vẽ đường đó có thể thay đổi, vì vậy các định dạng mất mát như JPEG cho phép người dùng chọn mức độ nén mà họ muốn.


1
Ủng hộ cho một lời giải thích rất rõ ràng và toàn diện về một chủ đề phức tạp! Tôi đã học được rất nhiều từ nó tôi nghĩ. Tôi đang tự hỏi liệu một cách hiệu quả để quản lý nén không mất dữ liệu sẽ là mã hóa độ dài, nhưng về cơ bản sau đó sẽ có lần thứ hai đi qua hình ảnh để thêm vào bất kỳ ngoại lệ lẻ trên mỗi pixel nào sau đó. Một cái gì đó như "từ 23 - 400 là màu đen" và sau đó "302 là màu trắng" ghi đè lên một pixel đó. thay vì 23 - 301 là màu đen, 302 là màu đen, 303 - 400 là màu đen. Tôi nghi ngờ đây thực sự là cách ít nhất một định dạng nén xử lý nó.
Ruadhan2300

1
@ Ruadhan2300 - thực sự là có. Xem, ví dụ: en.wikipedia.org/wiki/Lossless_JPEG sử dụng phương pháp dự đoán màu của từng pixel (mặc dù hơi phức tạp hơn so với mã hóa độ dài chạy), sau đó mã hóa sự khác biệt giữa dự đoán đó và giá trị pixel thực tế.
Jules

18

Ngoài câu trả lời tuyệt vời của @ remco , tôi muốn thêm lý do tại sao có các loại tiền mã hóa khác nhau cho cùng một mục đích.

Codec được thiết kế để:

  • Mất mát so với mất mát
  • Mã hóa nhanh so với giảm kích thước tệp
  • Không đối xứng so với đối xứng en- / giải mã
  • Tương thích với phần mềm
  • Nhận thức gần như không mất mát trong các mức độ / tình huống nén khác nhau
  • Có các tính năng mà các codec khác không cung cấp, bao gồm:
    • được miễn phí bản quyền
    • hỗ trợ cho các lớp
    • hỗ trợ kênh alpha (ví dụ RGBA) / độ trong
    • cung cấp xem web nhanh
    • hỗ trợ độ sâu bit cao (er)
    • hỗ trợ nhiều không gian màu (RGB / CMYK)
    • hỗ trợ siêu dữ liệu / phiên bản / ...

Một số trong những điều đó là loại trừ lẫn nhau. Và vì điều đó, chúng tôi còn lại vô số tiền mã hóa.


Một vài ví dụ

Lưu ý: Không phải danh sách các codec hoàn chỉnh, cũng không phải tất cả các tính năng của chúng (hoặc thiếu nó) được đề cập. Nếu câu trả lời này tỏ ra hữu ích với ai đó, tôi có thể thêm một số thông tin (và chính xác hơn một chút).

Có lẽ định dạng phổ biến nhất là JPEG . Nó là một định dạng rất được hỗ trợ rộng rãi, nhưng định dạng cũ. Nó sử dụng DCT (Biến đổi Cosine rời rạc), do đó, trong khi nó cung cấp chất lượng khá tốt ở cài đặt chất lượng cao nhất, việc chặn sẽ xuất hiện với các cài đặt thấp hơn.

Sau đó, JPEG 2000 đã xuất hiện để thay thế JPEG: Nó dựa trên Wavelet-Transform, do đó, mặc dù nó cung cấp chất lượng tương đương với JPEG trong các cài đặt chất lượng cao hơn, nhưng nó cung cấp chất lượng tốt hơn nhiều trong các cài đặt chất lượng thấp hơn (các khối hơi mờ ). Ngoài ra, JPEG 2000 cung cấp các vùng quan tâm (chất lượng cao tại một khu vực của hình ảnh, chất lượng thấp hơn ở nơi khác) và hỗ trợ 16 bit. (Ngoài ra, một số thứ khác.) Thật không may (?), Vì nó đắt hơn về mặt tính toán so với JPEG và vì một số lo ngại về cấp phép, JPEG 2000 không được hỗ trợ rộng rãi như JPEG.

PNG là một định dạng được biết đến rộng rãi - không mất dữ liệu và hỗ trợ các kênh alpha, nhưng nó không cung cấp hỗ trợ cho các không gian màu không phải là RGB (như CMYK). Do đó, đây là một định dạng "chỉ trực tuyến".

Sau đó, có các định dạng VFX như OpenEXR . Tất cả đều xoay quanh chất lượng và tốc độ: OpenEXR không mất dữ liệu, hỗ trợ lên đến 64 bit và mã hóa / giải mã nhanh. Nó chủ yếu được sử dụng trong ngành công nghiệp VFX như định dạng trung gian.

TIFF là một định dạng lossless khác khá phổ biến với các nhiếp ảnh gia. Để nén, nó không cung cấp / ZIP / RLE / LZW / JPEG. Nó hỗ trợ lên đến 32 bit. Với khả năng nén có thể lựa chọn của nó, nó khá thích ứng, nhưng vì tính dễ mất của nó, nó có nhiều định dạng ngoại tuyến hơn.

HEIF là một trong những codec hình ảnh mới nhất. Nó sử dụng cùng mức nén với HEVC / h.265 và do đó được dự kiến ​​sẽ cho tỷ lệ nén tốt hơn JPEG. Tuy nhiên, vì nó khá mới và vì nó thuộc đối tượng của bằng sáng chế, nên nó không được hỗ trợ rộng rãi như bất kỳ điều nào ở trên.

Hình ảnh RAW Xem cũng không phải là hình ảnh thực, thực sự: Chúng là một vật chứa cho dữ liệu đọc cảm biến thô (do đó là tên). Chỉ với phần mềm biết cách diễn giải dữ liệu thì mới có thể có được hình ảnh. Đó cũng là lý do tại sao các bộ chuyển đổi RAW như Lightroom / Capture One / DarkTable / ... cần cập nhật để hỗ trợ các máy ảnh mới sử dụng các thùng chứa đã được chỉ định như * .CR2 cho Canon. Đó cũng là lý do tại sao RAW 14 bit cung cấp nhiều tùy chọn chỉnh sửa hơn TIFF 32 bit mà bạn đã xuất ra từ cùng một RAW.


Sự xen kẽ: Mất mát so với mất mát

Tôi vẫn không chắc chắn những gì bạn đang thực sự hỏi, vì vậy tôi nghĩ rằng sẽ không đau khi thêm một lời giải thích nhỏ về mất mát so với mất mát.

Nén lossless hoạt động bằng cách thực hiện mã hóa độ dài chạy (RLE) / mã hóa Huffman / ... để nén dữ liệu. Dữ liệu không bị thay đổi, nhưng được lưu trong một gói nhỏ hơn. Ví dụ: lấy RLE: Giả sử, chúng ta có dòng bit kênh R (từ pixel 0,0đến pixel 0,11) của 255,255,255,255,255,215,215,235,100,000,000,000- RLE sẽ mã hóa cái này dưới dạng 52552215123511003000- cái này nhỏ hơn nhiều và vì chúng ta biết rằng nó được lưu trong nhóm 4 chữ số và rằng chữ số đầu tiên là bộ đếm và ba chữ số cuối cùng là giá trị, sau đó chúng ta có thể xây dựng lại toàn bộ 255,255,255,255,255,215,215,235,100,000,000,000.

Nén , tổn thất , mặt khác, cố gắng nén thậm chí nhiều hơn tổn thất có thể làm. Để làm điều này, các codec mất mát thường cố gắng loại bỏ những thứ mà nhận thức của chúng ta không có được. Lấy ví dụ, YUV( YCbCr, thực sự) mô hình JPEG (và hầu hết các video codec) sử dụng: Y = Luminance, Cb = Chrominance Blue, Cr = Chrominance Red. Một con người không thể tạo ra sự khác biệt giữa một 4:2:0(mọi pixel có giá trị độ chói, nhưng màu sắc được lưu trong các khối 2x2 xen kẽ) và một 4:4:4(mọi pixel đều có độ chói và cả hai kênh màu) hình ảnh được mã hóa. Điều này là do sinh lý của mắt chúng ta : Chúng ta không thể thấy sự khác biệt về màu sắc cũng như chúng ta có thể thấy sự khác biệt về độ chói.

Điều này hoạt động tốt hầu hết thời gian, nhưng so sánh nó với một tệp MP3: Hầu như không ai có thể tạo ra sự khác biệt giữa 192kbps và 320kbps, nhưng xuống dưới 64kbps và mọi thứ trở nên xấu đi nhanh chóng. Ngoài ra, mã hóa lại sẽ làm giảm chất lượng hơn nữa, vì các tạo tác không mong muốn có thể xuất hiện (ví dụ: trong JPEG, các khối nhỏ từ mã hóa chất lượng cao sẽ được coi là chi tiết của hình ảnh trong các bảng mã tiếp theo).


Dòng dưới cùng

Nếu bạn không quan tâm đến các định dạng hình ảnh hoặc các tính năng của chúng, một trong hai sẽ ổn. Với các cài đặt chất lượng đủ cao, có thể và bạn sẽ không thấy sự khác biệt giữa chúng.

Tuy nhiên, nếu bạn cần bất kỳ tính năng cụ thể nào, có thể (và gần như chắc chắn: sẽ) có một codec được bao phủ.


Tôi sẽ thêm hai điều vào danh sách các thuộc tính codec của bạn: 1. kết xuất lũy tiến (hiện tại không được sử dụng nhiều, nhưng là một tính năng lớn trong PNG) 2. hoạt hình (có PNG, JPEG, GIF hoạt hình ...).
Sulthan

@Sulthan Tôi sẽ suy nghĩ về việc thêm nó, mặc dù tiến bộ - như bạn nói - không phải là một điều được coi là quan trọng ngày nay và hoạt hình không phải là một tính năng liên quan đến nhiếp ảnh. Dù sao: cảm ơn cho đầu vào!
flolilo

2
"Chỉ với phần mềm biết cách diễn giải dữ liệu thì mới có thể có được hình ảnh" đúng với mọi định dạng hình ảnh. Nếu phần mềm không biết cách diễn giải, giả sử, dữ liệu JPEG, nó sẽ không thể hiển thị hoặc xử lý nó dưới dạng hình ảnh. Các tệp thô lưu trữ dữ liệu cho phép tái tạo lại hình ảnh từ nó và nó được cấu trúc theo một cách nhất định (mặc dù có thể cụ thể cho kiểu máy ảnh). Vì vậy, đây là định dạng hình ảnh, nó không chỉ là một định dạng, mà là "định dạng thô của máy ảnh X".
n0rd

1
@ n0rd Tất nhiên rồi. Nhưng JPEG từ 5D Mk III của tôi đáp ứng các thông số kỹ thuật tương tự (dường như) như của Nikon P7000 hoặc EOS M6. .CR2thực sự chỉ nói "nhìn tôi này, tôi là một tập tin RAW của máy ảnh Canon! Hãy đọc cho tôi nếu bạn dám!" - đó nên là quan điểm của tôi, mặc dù bạn đã nói rằng bằng một ngôn ngữ rõ ràng hơn nhiều.
flolilo

Không gian LAB và XYZ tồn tại trong một số định dạng hình ảnh.
joojaa

10

Nếu ở lõi, ảnh chỉ là 3 kênh giá trị pixel [0, 255] X RBG

Đó là một giả định bị phá vỡ nghiêm trọng và phần còn lại của câu hỏi của bạn chỉ đơn giản là không thể trả lời mà không tách rời khỏi nó.

Ý tôi là, điều gì làm cho RAW khác với TIFF - không phải tất cả đều bị giới hạn ở các giá trị trong khoảng từ 0 - 255?

Thuật ngữ "thô" có thể đề cập đến hai điều khác nhau, một hình ảnh "camera thô" hoặc một tệp chứa dữ liệu hình ảnh thô không có tiêu đề.

Hình ảnh "camera raw" lưu trữ dữ liệu thô khi nó đi ra khỏi cảm biến. Hầu hết các cảm biến máy ảnh hiện đại đều có ADC với hơn 8 bit, nhưng chúng cũng chỉ thu thập dữ liệu cường độ cho một thành phần màu ở mỗi vị trí. Hình học có thể bị biến dạng bởi ống kính, các giá trị cường độ từ ADC có thể không làm tốt việc phản ánh nhận thức của con người về cường độ, các thành phần màu sắc có thể không ánh xạ chính xác với các màn hình được sử dụng bởi v.v.

Một quy trình ánh xạ phức tạp liên quan đến phép nội suy là cần thiết để biến dữ liệu cảm biến thô thành hình ảnh RGB chất lượng tốt và không có cách nào đúng để thực hiện. Hơn nữa do nhu cầu nội suy các thành phần màu, hình ảnh RGB có thể lớn hơn dữ liệu thô.

Việc chuyển đổi có thể (và thường là) được thực hiện trong máy ảnh nhưng nhiều nhiếp ảnh gia vẫn cố gắng lưu dữ liệu thô để họ có thể điều chỉnh quá trình xử lý sau thực tế.

Tiff là một định dạng tệp phức tạp có thể lưu trữ hình ảnh ở nhiều định dạng khác nhau với nhiều loại siêu dữ liệu. Trong thực tế, mặc dù nó thường được sử dụng để lưu trữ hình ảnh RGB hoặc CMYK không nén hoặc không nén.

Các tệp chứa dữ liệu hình ảnh thô không có tiêu đề hiếm khi được sử dụng vì bạn phải biết định dạng và kích thước của chúng trước khi bạn có thể đọc chúng. Một số công cụ xử lý hình ảnh hỗ trợ chúng mặc dù.

Hơn nữa, từ quan điểm số, điều gì làm cho một cái gì đó giống như hình ảnh 16 bit khác với hình ảnh 32 bit?

Thật không may "n bit" có thể có nghĩa là hai điều khác nhau. Điều đó có nghĩa là tất cả các thành phần màu được nhồi nhét vào một số bit (ví dụ 5 bit cho màu đỏ, 5 bit cho màu xanh lam và 6 bit cho màu xanh lá cây cho 16 bit hoặc 8 bit màu đỏ, 8 bit màu xanh lá cây, 8 bit màu xanh lam và 8 bit màu xanh của alpha trong 32 bit) hoặc tại có thể có nghĩa là mỗi thành phần màu có n bit thông tin tại mỗi vị trí pixel.

Tiếp tục với viễn cảnh này rằng một hình ảnh trên hệ thống tập tin của máy tính chỉ là một mảng số nguyên 3 kênh trong khoảng từ 0 - 255

Một lần nữa quan điểm này chỉ đơn giản là sai.

Một tệp là một chuỗi các byte, nhưng các byte đó hầu như không bao giờ "chỉ là một mảng 3 số nguyên trong khoảng từ 0 - 255"

Bạn có thể lưu trữ một hình ảnh như thế. Một số công cụ thậm chí hỗ trợ đọc và ghi các tệp như vậy nhưng vấn đề là nó có nghĩa là bạn phải biết về tệp trước khi bạn có thể đọc nó. Giả sử bạn có một tệp có kích thước 3000 byte, bạn có 1000 pixel RGB 24 bit không? 3000 pixel màu xám 8 bit? 3000 8 bit pixel từ một pallete? Các thành phần màu theo thứ tự nào? hình ảnh là gì? các thành phần màu theo thứ tự RGB hoặc BGR? Trừ khi bạn biết câu trả lời cho những câu hỏi này, bạn không thể đọc một tập tin như vậy.

Vì vậy, các định dạng hình ảnh thực tế thường bắt đầu bằng một hoặc nhiều tiêu đề xác định loại tệp, kích thước của hình ảnh và cách lưu trữ dữ liệu hình ảnh thực tế. Chúng cũng có thể chứa siêu dữ liệu tùy chọn.

điểm nén hình ảnh vào, định dạng mất như thế nào, ví dụ như JPG là gì? Giả sử thuật toán nén thay đổi một số giá trị pixel từ 254 thành 255 hoặc bất cứ điều gì. Vì thế? Làm thế nào mà cung cấp bất kỳ tiết kiệm trong kích thước tập tin hoặc thực hiện bất kỳ tác động đến chất lượng hình ảnh?

Các thuật toán nén không chỉ đơn thuần là "thay đổi giá trị", chúng mã hóa thông tin theo cách hoàn toàn khác, ví dụ JPEG có thể được mô tả đại khái là

  • Chuyển đổi dữ liệu từ RGB sang YUV
  • (tùy chọn) giảm độ phân giải của các kênh sắc độ theo hệ số 2 trong một hoặc cả hai chiều
  • Chia dữ liệu cho mỗi kênh thành các khối 8x8.
  • Chuyển đổi các khối thành miền tần số bằng cách sử dụng một biến đổi cosine rời rạc
  • Định lượng kết quả, bảo toàn thông tin tần số thấp đồng thời giảm độ chính xác của thông tin tần số cao.
  • Mã hóa các số kết quả dưới dạng một chuỗi các byte bằng cách sử dụng sơ đồ mã hóa có độ dài thay đổi (mã hóa huffman hoặc mã hóa số học)
  • Lưu các byte trong tệp cùng với các tiêu đề thích hợp.

Mặt khác, các định dạng nén không mất dữ liệu thường được xây dựng trên thuật toán nén dữ liệu cho mục đích chung, nhưng đôi khi bổ sung sau đó bằng xử lý trước hình ảnh cụ thể, ví dụ như PNG.

  • Chuyển đổi dữ liệu sang một trong các định dạng được hỗ trợ (ví dụ: mỗi bit cho Đỏ, lục và lam theo thứ tự đó)
  • Đối với mỗi dòng của hình ảnh thực hiện quá trình "lọc", có các tùy chọn lọc máy chủ (bao gồm cả không lọc) nhưng mục đích chung là lấy thông tin cụ thể về hình ảnh mà pixel có thể giống với hàng xóm của nó và mã hóa nó theo cách mà "xì hơi" có thể đối phó.
  • Nén dữ liệu đã lọc bằng thuật toán nén mục đích chung "khử".
  • Lưu các byte trong tệp cùng với các tiêu đề thích hợp.

1
Đây có lẽ là câu trả lời tốt nhất ở đây, nó nói về cả hai định dạng tệp khác nhau để giữ và nén hình ảnh và cách giả định rằng hình ảnh là một loạt các số từ 0-255 bị sai sót
pfg

Tốt để đề cập đến thứ tự thành phần. Tôi đoán những thứ như opengl 2 ish có lý do chính đáng để có chức năng đọc các hoán vị khác nhau của thứ tự RGB. Thành thật mà nói, không có tiêu chuẩn hoặc siêu dữ liệu, bạn thậm chí không biết nguồn gốc hoặc hướng của hình ảnh chứ đừng nói đến việc các dòng này dài bao nhiêu. Nếu bạn đã tải lên một sprite doom ngay cả sau khi xử lý pallete, bạn sẽ có các màu có nghĩa là bắt đầu ở phía dưới bên trái, đi lên theo các cột và sau đó bên phải bởi các hàng
StarWeaver

Tôi nhận thấy rằng thứ tự thành phần là giống như endian. Một số nhà cung cấp hệ thống chọn RGB trong khi những nhà cung cấp khác (đáng chú ý là windows) chọn BGR.
Peter Green

9

Có một số lý do tại sao giả định này không chính xác, và tất cả đều đi đến một điều:

Quy mô bạn đang thực sự sử dụng?

Và điều đó có thể được chia nhỏ thêm một chút:

255 là gì?

"Màu sắc" không phải là một tài sản của vũ trụ vật lý. Đó là một cảm giác nảy sinh trong tâm trí. Và, bao gồm những thứ như "xanh dương", "xanh lá cây" và "đỏ". Thang đo từ 0 có nghĩa là "hoàn toàn không có màu xanh" đến 255 có nghĩa là "tất cả màu xanh!" Thực tế không thể có 255 đại diện cho lý tưởng màu xanh lam , bởi vì ... không có thứ gì hoàn hảo như vậy trong thế giới thực. Vì vậy, nó có nghĩa là:

  • loại thứ xanh nhất bạn có thể làm trên thiết bị trước mặt?
  • gần với kết hợp lý tưởng với màu xanh thuần khiết theo quan điểm của hệ thống thị giác con người, ngay cả khi hầu hết các màn hình và kết hợp máy in / mực / giấy không thể đại diện cho nó?
  • một màu xanh khá tốt có khả năng được thể hiện hợp lý trên nhiều loại thiết bị?
  • một màu xanh nằm ngoài phạm vi tầm nhìn của con người, nhưng điều đó cho phép bộ ba RGB của bạn bao phủ hầu hết các màu trong phạm vi?

Âm thanh giả tạo? Không! Đây là những ví dụ thực sự . Kiểm tra các đại diện của mỗi lựa chọn. Vùng cong là một lát 2D của không gian màu thị giác của con người và hình tam giác cho thấy khu vực có thể được biểu thị cho một lựa chọn cụ thể cho màu đỏ, xanh lá cây hoặc xanh dương.

Đầu tiên, đây là hồ sơ cho màn hình máy tính xách tay của tôi, đại diện đẹp cho các thiết bị tầm trung hiện tại:

ThinkPad X260

Bây giờ, đây là không gian Adobe RGB. Lưu ý rằng cái này lớn hơn bao nhiêu so với những gì màn hình của tôi có thể hiển thị!

AdobeRGB

Vì vậy, đây là sRGB - tiêu chuẩn defacto và không gian mặc định thường được giả định khi không có gì được chỉ định. Nó có nghĩa là "đủ tốt" trong hầu hết các tình huống.

sRGB

Và cuối cùng, ProPhoto RGB, sử dụng màu sắc tưởng tượng làm màu gốc , để làm cho hình tam giác đủ lớn để phù hợp với hầu hết tầm nhìn của con người.

ProPhoto RGB

Bây giờ hãy ném vào màu sắc của ánh sáng và sự thích nghi màu sắc - khả năng điều chỉnh nhận thức của môi trường đối với môi trường. Trong thực tế, không chỉ là khả năng: điều xảy ra cho dù bạn có muốn hay không . "Màu xanh thuần khiết" có nghĩa là thứ đó trông có màu xanh như nó có thể nằm dưới ánh sáng sợi đốt này? Giá trị sẽ là gì nếu chúng ta thay vì chụp ảnh dưới ánh sáng mặt trời?

Vì vậy, "255" có thể có nghĩa là rất nhiều thứ khác nhau.

0 là gì?

Điều này khá đơn giản - bạn cần 0 màu đen như thế nào? Là nó vantablack đen? Nếu đúng như vậy, nhưng tất cả các sắc thái thực tế trong cảnh của bạn đều cực kỳ ít , bạn có thực sự muốn "lãng phí" một loạt các giá trị tiềm năng cho một phạm vi động không có trong cảnh của bạn - và, như màu sắc, có thể Thậm chí còn được đại diện bởi bất kỳ thiết bị hoặc máy in nào bạn có quyền truy cập?

Đường cong của bạn là gì?

Vì vậy, một khi bạn có điểm cuối của mình, làm thế nào để bạn đi từ điểm này sang điểm khác? Nhận thức của con người về độ sáng được quyết địnhphi tuyến tính . Trong thang điểm 0-255 của bạn, 100 nên sáng gấp đôi so với 50, hay nó nên là một yếu tố lớn hơn? Sự khác biệt về nhận thức giữa, giả sử, 3 và 4 có giống như giữa 203 và 204 không?

Nếu bạn quyết định sử dụng một hệ thống lưu trữ nhật ký, đường cong đó có nên được tối ưu hóa để phù hợp với tầm nhìn của con người, hoặc để tối ưu hóa dữ liệu, hoặc cho một cái gì khác không?

Có nhiều khả năng, cho nhiều nhu cầu khác nhau.

Đang nén

Bạn hỏi.

Giả sử thuật toán nén thay đổi một số giá trị pixel từ 254 thành 255 hoặc bất cứ điều gì. Vì thế? Làm thế nào mà cung cấp bất kỳ tiết kiệm trong kích thước tập tin hoặc thực hiện bất kỳ tác động đến chất lượng hình ảnh?

Các thuật toán nén hiện đại phức tạp hơn thế này, nhưng điều này cung cấp một ví dụ tốt. Tôi sẽ sử dụng hệ thập lục phân FFđể biểu diễn 255 và FEđại diện cho 254, và tưởng tượng chúng ta đang sử dụng mã hóa chiều dài chạy như một hình thức nén. Và để đơn giản, hãy giả sử màu đen và trắng thay vì màu. Với điều đó, nếu chúng ta có một hàng dữ liệu trông như thế này:

FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 

chúng ta có thể nén nó rất đơn giản

16×FF 

... Đó là một khoản tiết kiệm khá rõ ràng. Về cơ bản chúng ta có thể lưu trữ 16 byte thành hai (một cho số đếm, hai cho dữ liệu). Nhưng hãy nói rằng chúng ta có:

FF FF FE FF FE FF FF FF FF FF FE FE FE FF FE FE

Bây giờ, mã hóa độ dài chạy cho chúng ta:

2×FF 1×FE 1×FF 1×FE 5×FF 3×FE 1×FF 2×FE

... hoàn toàn không tiết kiệm và thực tế có thể tăng kích thước tệp. Nhưng nếu chúng ta làm tròn tất cả các FEgiá trị FF, chúng ta sẽ quay lại trường hợp đầu tiên, với việc giảm kích thước đáng kể, với tác động nhỏ nhưng có thể khó nhận thấy đối với chất lượng tệp.

Tất nhiên đó là một tầm thường, ví dụ giả tạo, nhưng tất cả các thuật toán nén lossy chia sẻ đặc điểm cơ bản này: sự mất mát dữ liệu làm cho nó dễ dàng hơn để sử dụng một định dạng lưu trữ nhỏ gọn hơn, với, hy vọng, không quá nhiều nhận thức thay đổi.

Độ sâu bit

Hơn nữa, từ quan điểm số, điều gì làm cho một cái gì đó giống như hình ảnh 16 bit khác với hình ảnh 32 bit? Một lần nữa, một hình ảnh chỉ là một mảng với các giá trị nguyên trong khoảng 0-255.

Vì vậy ..... một mảng các giá trị nguyên nằm trong khoảng 0-255 là một mảng tám bit . (2⁸ = 256.) Với ba kênh, đây là hình ảnh 24 bit; một số định dạng cũng có kênh trong suốt ("alpha"), trong 32 bit. Người ta cũng có thể sử dụng giá trị cao hơn trên mỗi kênh, thường là ý nghĩa của chúng tôi khi chúng tôi nói "độ sâu 16 bit". Điều đó có nghĩa là mảng đi từ 0-65535 (2¹⁶ = 65536) thay vì 0-255. Nói chung trong sơ đồ như vậy, về cơ bản, đây chỉ là một số nhân trong đó giá trị cao nhất đại diện cho cùng một thứ trên mỗi thang đo, nhưng độ sâu bit cao hơn mang lại nhiều sắc thái có thể hơn. (Xem câu trả lời này để biết thêm về điều này.) Ngoài ra còn có một số định dạng tệp chuyên dụng sử dụng số float 64 bit (!) Thay vì số nguyên cho các giá trị hoặc các loại dữ liệu khác tùy thuộc vào trường hợp sử dụng, nhưng khái niệm cơ bản là giống nhau .


s / 0-65536 / 0-65535 /
Ruslan

1
@Ruslan Bắt tốt. Xin lỗi vì tràn bộ đệm. :)
mattdm

Cũng là một lời giải thích tốt về lý do tại sao chiếc váy quá phân cực, FWIW
Wayne Werner

8

Không, hình ảnh không chỉ là giá trị RGB trong phạm vi 0-255. Ngay cả khi bạn bỏ qua các định dạng lưu trữ, có nhiều cách để mô tả màu sắc. Dưới đây là một số ví dụ:

  • Các thành phần màu đỏ, xanh lá cây và xanh dương (RGB)
  • Các thành phần màu lục lam, đỏ tươi, vàng và đen (CMYK)
  • Huế, độ bão hòa và độ sáng / giá trị (HSL / HSV)
  • Lượng ánh sáng chiếu vào một nhóm cảm biến trong máy ảnh
  • Lượng ánh sáng và hướng của nó khi chạm vào cảm biến (trong máy ảnh trường ánh sáng )

Hai cái đầu tiên được sử dụng phổ biến nhất để hiển thị trên màn hình và để in, tương ứng.

Ngoài ra, một hình ảnh không chỉ là pixel mà còn là siêu dữ liệu. Đó có thể là những thứ như chiều rộng về số pixel, chiều rộng vật lý nếu bạn in nó, hình ảnh thu nhỏ hoặc thậm chí là vị trí địa lý của máy ảnh khi chụp ảnh.


6
Và ngay cả với thứ gì đó "đơn giản" như RGB, vẫn có những không gian màu khác nhau. Ví dụ, một bitmap RGB 24 bit đơn giản có thể được hiệu chỉnh gamma - và nếu không đảo ngược hiệu chỉnh đó, nó sẽ xuất hiện quá tối. Sự phân bố cường độ có thể là tuyến tính, hoặc bất cứ điều gì nhưng. Adobe RGB và sRGB đều là bitmap RGB 24 bit, nhưng có cách thể hiện rất khác nhau về các màu "giống nhau". Giống như "không có gì giống như một tệp văn bản thuần túy", không có định dạng "hình ảnh đơn giản". Điều tốt nhất bạn có thể nhận được là "định dạng hình ảnh gốc cho hệ thống / ứng dụng cụ thể này".
Luaan

1
Chưa bao giờ thấy một định dạng chứa dữ liệu hsv / hsl nhưng tôi đã thấy các định dạng lưu trữ dữ liệu LAB hoặc XYZ
joojaa

2
@Luaan Bạn nên mở rộng câu trả lời. Sự khác biệt về Gamma là một điều mà không ai khác dường như chạm vào trong câu trả lời của họ.
Tim Seguine

5

Tiền đề của bạn không sai: bất kỳ hình ảnh nào cũng có thể được biểu diễn bằng mảng N chiều của các giá trị hữu hạn. Cá nhân, tôi khái quát rằng sử dụng hình học rời rạc thay vì ma trận, nhưng bản chất là như nhau. Nhưng đó là nội dung, không phải tập tin.

Tuy nhiên, các định dạng tập tin là khác nhau. Về cơ bản, có một số cách khác nhau để thể hiện cùng một hình ảnh, như mọi người đã đề cập: bmp, png, jpg, v.v ... Tất nhiên, một khi bạn giải mã chúng, hai phiên bản được mã hóa không mất dữ liệu của cùng một hình ảnh sẽ dẫn đến cùng một ma trận.
Hãy nghĩ về nó như một tệp .txt mà bạn đã nén bằng zip. Với sự kỳ lạ được thêm vào rằng một mã hóa không mất dữ liệu sẽ trả về một văn bản không giống với bản gốc, nhưng thực sự gần gũi, gần giống như một phiên bản văn bản bị câm.

Vẫn với sự tương tự văn bản, giả sử bạn có cùng một văn bản, được lưu dưới dạng .txt, .docx, .pdf, v.v ... Tại sao tất cả các tệp không giống nhau, nếu nội dung giống nhau? (Ok, txt không có định dạng, nhưng những người khác thì có).

Nhân tiện, hãy kiểm tra cách mã hóa Netpbm thực sự khác với JPEG .


3

Đối với định dạng RAW và TIFF, theo như tôi có thể nói, câu trả lời (như những người khác đã nói) là chúng không thực sự luôn sử dụng cùng một không gian màu (ví dụ: tệp RAW có thể sử dụng nhiều bit hơn trên mỗi pixel để có thể lưu trữ thông tin màu mịn hơn) .

Nhưng để đi đến mấu chốt của câu hỏi của bạn - đôi khi có những hình ảnh được lưu trữ ở các định dạng khác nhau, nhưng mỗi hình ảnh cuối cùng đại diện chính xác cho cùng một dãy số.

Một ví dụ điển hình cho lý do này là sự khác biệt trong nén giữa tệp PNG và tệp TIFF.

Các tệp PNG sử dụng một thuật toán nén cụ thể. Điều đó có nghĩa là một hình ảnh sẽ không được lưu trữ dưới dạng một danh sách lớn các số cho mỗi pixel. Ví dụ đơn giản: nó có thể lưu trữ một cái gì đó có nội dung "trong khối pixel 10 x10 này, tất cả các pixel đều có màu XYZ". Sau đó, thay vì lưu trữ thông tin đó hơn 100 lần, nó lưu trữ thông tin đó một lần, cộng với một chút thông tin về khu vực áp dụng thông tin đó.

Vấn đề là sau đó để lấy lại các mảng số ban đầu (đại diện cho màu sắc), vì vậy bạn có thể hiển thị hoặc chỉnh sửa nó hoặc bất cứ điều gì, bạn cần phần mềm biết cách diễn giải thông tin nén đó.

Các tệp PNG luôn sử dụng cùng một thuật toán nén, vì vậy phần mềm dễ dàng hỗ trợ tất cả các tệp PNG hợp lệ. Mặt khác, một số hình ảnh có cấu trúc không cho vay theo thuật toán nén của PNG, vì vậy một số tệp PNG của bạn có thể có kích thước khá lớn.

Mặt khác, các tệp TIFF hỗ trợ nhiều thuật toán nén khác nhau. Trong thực tế, nó thậm chí có thể lưu trữ các phần khác nhau của hình ảnh được nén khác nhau. nó hỗ trợ 'tiện ích mở rộng', vì vậy bạn có thể nén hình ảnh bằng các cách độc quyền. Vì vậy, có thể nửa trên của hình ảnh của bạn sẽ được nén bằng phương pháp tương tự như PNG, nhưng điều này sẽ không nén nửa dưới rất tốt, vì vậy nửa dưới được nén bằng một phương pháp khác.

Vì vậy, các tệp TIFF linh hoạt hơn - bạn có thể lưu trữ cùng một dãy số chính xác bằng cách sử dụng ít byte hơn. Nhưng phần mềm cần thiết để giải mã hình ảnh sẽ phức tạp hơn và có thể không hoạt động nhất quán với mọi tệp TIFF mà bạn ném vào, ví dụ: bạn có thể lưu tệp TIFF trong một phần mềm và không thể mở bằng phần mềm khác, mặc dù vậy vẫn hoạt động trong bản gốc.

Vậy bạn hỏi

Nhưng tôi không hỏi về bất cứ điều gì ngoài hình ảnh RBC 3 kênh cơ bản. Tất cả những gì tôi biết là nếu ai đó đưa cho tôi một trong những thứ này, thì bây giờ tôi có một dãy số. Tôi không có lý do để biết tại sao một mảng số có thể khác bất kỳ mảng số nào khác từ 0 đến 255.

Để trao nó cho bạn, ai đó phải biết cách lưu trữ hình ảnh và cách dịch nó thành một dãy số. (Hoặc có thể một số phần mềm đang thực hiện bản dịch đó cho bạn mà bạn không biết).

Bạn có thể thử lưu hình ảnh dưới dạng PNG và một lần nữa dưới dạng TIFF hoặc GIF và xem nó trong trình xem thập lục phân để xem mỗi hình ảnh đại diện cho cùng một mảng số khác nhau như thế nào. Hoặc đọc chi tiết về cách các tệp PNGtệp TIFF được trình bày bên trong để cung cấp cho bạn ý tưởng về những gì cần được xây dựng trong phần mềm để đọc các mảng số giống hệt nhau.


1
But to get to the crux of your question - sometimes there are images which are stored in different formats, but each ultimately represents exactly the same array of numbers.Điều đó có thể đúng với hình ảnh lossless - nhưng hoàn toàn sai nếu bạn ví dụ so sánh hình ảnh HEIF bitrate thấp với JPEG có bitrate thấp .
flolilo

1
@flolilolilo yep, đó là lý do tại sao tôi nói "đôi khi" - cách giải thích của tôi về câu hỏi là họ đã hỏi "nếu tôi kết thúc với cùng một lưới màu, thì sự khác biệt giữa các tệp" là gì. Vì vậy, tôi đã nói về nén không mất dữ liệu như là một trường hợp đơn giản trong đó bạn sẽ có thể lên cùng một lưới số chính xác từ các loại tệp khác nhau bằng các phương pháp nén khác nhau.
LangeHaare

Nguyên hầu như không bao giờ sử dụng nhiều bit trên mỗi "pixel" nhưng RAW cũng không mô tả pixel, nó mô tả các hình ảnh. Ảnh RAW là dữ liệu cảm biến thô từ cảm biến và mỗi photosite cụ thể chỉ có 1 kênh chứ không phải 3. Các kênh RGB được xác định bằng cách nhìn vào các ảnh lân cận có màu khác. Các tệp RAW thực sự sẽ thường nhỏ hơn một hình ảnh không nén là kết quả của việc xử lý RAW.
AJ Henderson

1
Ví dụ, 16 bit thô chỉ sử dụng 16 bit cho mỗi "pixel" nhưng BMP 8 bit màu không nén sẽ sử dụng 24 bit cho mỗi pixel vì nó cần lưu trữ 8 bit thông tin cho màu đỏ, xanh lá cây và xanh dương. Lý do RAW có thể được điều chỉnh nhiều hơn là thông tin màu chưa được kết hợp. Bạn có thể thay đổi những thứ như cân bằng trắng (làm thay đổi ảnh hưởng của từng photosite màu cụ thể trong việc xác định thông tin màu của từng pixel kết quả).
AJ Henderson

3

Bitmap

Một bitmap (BMP) về cơ bản là những gì bạn mô tả, một dãy số đại diện cho màu pixel. Ví dụ như một cái gì đó như

1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1

Nén không mất dữ liệu

Bây giờ, hãy xác định một sơ đồ nén. Trong sơ đồ nén của chúng tôi, chúng tôi sẽ có một loạt các cặp số. Ví dụ

3, 1, 1, 0, 7, 1

Bây giờ, điều đầu tiên tôi muốn chỉ ra là lược đồ nén này biểu thị các pixel giống như mảng đầu tiên. Mảng đầu tiên có ba số 1 theo sau là một số 0 và sau đó là 7 số 1. Và đó là những gì chúng tôi đại diện ở đây. Định dạng này ngắn hơn, vì nó đại diện cho nhiều pixel với hai số. Định dạng bitmap phải sử dụng một số cho mỗi pixel.

Rõ ràng đây là một hình ảnh được đơn giản hóa một chút của hình ảnh (ví dụ: nó chỉ là một hàng) và sơ đồ nén. Nhưng hy vọng điều này cho phép bạn xem sơ đồ nén thay đổi định dạng của hình ảnh như thế nào. Đây là cách GIF liên quan đến BMP. GIF sử dụng sơ đồ nén có tên Lempel-Ziv-Welch thay vì sơ đồ đơn giản này.

Những gì chúng tôi đã mô tả ở đây là một sơ đồ nén không mất mát. Một vấn đề với sơ đồ nén không mất dữ liệu là đối với một số đầu vào, dạng được mã hóa có thể dài hơn bản gốc. Ví dụ cho

1, 0, 1, 0, 1

Mã hóa là

1, 1, 1, 0, 1, 1, 1, 0, 1, 1

Vâng, đó là vô dụng. Chúng tôi thực hiện đầu vào dài gấp đôi.

Một nén không mất mát khác

Bây giờ, hãy xem xét một sơ đồ nén khác nhau. Trong phần này, chúng tôi sẽ biểu diễn hình ảnh dưới dạng các vòng tròn phủ. Đối với mỗi vòng tròn, chúng tôi sẽ xác định một trung tâm, bán kính và màu sắc.

Bitmap đầu tiên của chúng tôi sẽ trở thành

5, 5, 1, 3, 0, 0

Đây là cùng độ dài với phương pháp nén đầu tiên của chúng tôi.

Và thứ hai của chúng tôi có thể là một trong hai

2, 2, 1, 2, 1, 0, 2, 0, 1

Đây là ba vòng tròn tập trung ở phần tử ở giữa (mà trong máy tính là số 2, vì máy tính bắt đầu đếm bằng 0). Một vòng tròn có bán kính 2 và màu 1. Sau đó, chúng ta thêm một vòng tròn màu 0 và bán kính 1. Cuối cùng, chúng ta có một vòng tròn màu 1 và bán kính 0. Trong các bước, điều này sẽ là

1, 1, 1, 1, 1
1, 0, 0, 0, 1
1, 0, 1, 0, 1

Hoặc là

2, 2, 1, 1, 0, 0, 3, 0, 0

Đây là cùng một vòng tròn ban đầu nhưng được bao phủ bởi hai vòng tròn điểm. Trong các bước, nó sẽ là

1, 1, 1, 1, 1
1, 0, 1, 1, 1
1, 0, 1, 0, 1

Cả hai đều ngắn hơn phiên bản được mã hóa đầu tiên nhưng vẫn dài hơn phiên bản gốc.

Bạn có thể tự hỏi tại sao tôi đang nói về vòng tròn và không phải là phạm vi. Lý do chính là các vòng tròn gần với những gì hình ảnh hai chiều thực sự sử dụng.

Nén tổn thất

Chúng tôi cũng có khái niệm về các chương trình nén mất mát. Các sơ đồ nén không mất dữ liệu này có thể được chuyển trở lại thành mảng bitmap gốc. Đề án nén tổn thất có thể không thể đảo ngược.

Hãy xem xét một phiên bản mất mát của phương pháp vòng tròn của chúng tôi. Trong đó, chúng tôi sẽ sử dụng một quy tắc đơn giản. Chúng tôi sẽ không lưu trữ bất kỳ vòng tròn nào có bán kính nhỏ hơn 1. Vì vậy, trong hai lần mã hóa cuối cùng của chúng tôi, thay vào đó chúng tôi sẽ có

2, 2, 1, 2, 1, 0

2, 2, 1

mà chuyển đổi thành pixel một lần nữa là

1, 0, 0, 0, 1

1, 1, 1, 1, 1

Phiên bản đầu tiên chỉ dài hơn một yếu tố so với bản gốc. Phiên bản thứ hai ngắn hơn. Cả hai đều hợp lệ, vì vậy thuật toán được tự do phát triển cả hai và chọn cái ngắn hơn.

Chúng tôi mô tả hình ảnh với các quy tắc hạn chế hơn là có chất lượng thấp hơn.

Sự thể hiện hình ảnh này dưới dạng các bộ sưu tập các hình tròn được phủ chồng lên nhau tương tự như cách thức hoạt động của nhóm Các chuyên gia nhiếp ảnh chung hoặc định dạng JPEG . Hình dạng của nó là hình elip chứ không phải hình tròn, nhưng ý tưởng là tương tự nhau. Thay vì phương pháp đơn giản của chúng tôi, nó sử dụng biến đổi cosine rời rạc để mã hóa hình ảnh.

Không giống như GIF, JPEG thực sự là một cách khác để thể hiện hình ảnh. GIF vẫn là pixel. Chúng chỉ được lưu trữ theo một cách khác. JPEG là hình dạng. Để xem JPEG, sau đó chúng tôi chuyển đổi hình dạng thành pixel vì đó là cách màn hình hoạt động. Về lý thuyết, chúng ta có thể phát triển một màn hình không hoạt động theo cách này. Thay vì pixel, nó có thể tạo ra các hình dạng để phù hợp hơn với định dạng JPEG. Tất nhiên, màn hình đó sẽ không thể hiển thị ảnh bitmap. Để hiển thị BMP hoặc GIF, chúng tôi phải chuyển đổi sang JPEG.

Nếu bạn chuyển đổi một GIF tiêu chuẩn, giả sử 300x300 pixel, chuyển đổi nó thành JPEG và giảm chất lượng xuống, các hình dạng cơ sở mà nó sử dụng sẽ hiển thị. Nhiều JPEG tránh các tạo tác này bằng cách bắt đầu với hình ảnh có độ phân giải cao hơn nhiều.

JPEG có tỷ lệ tốt vì chúng là hình dạng chứ không phải pixel. Vì vậy, nếu bạn bắt đầu với một hình ảnh 8000x8000, hãy chuyển đổi nó thành JPEG và hiển thị nó dưới dạng hình ảnh 300x300, phần lớn chi tiết bị mất sẽ bị mất. Nếu bạn đã chuyển đổi bitmap 8000x8000 thành bitmap 300x300 trước rồi sang JPEG, kết quả thường sẽ có chất lượng thấp hơn.

MPEG

Chúng tôi đã nói về hình ảnh tĩnh. Các Moving Picture Experts Group hoặc MPEG định dạng sử dụng cùng một loại nén như JPEG, nhưng nó cũng làm cái gì khác. Mặc dù cách làm video đơn giản là gửi một chuỗi các hình ảnh tĩnh, MPEG thực sự gửi một khung hình, theo sau là một số khung hình liệt kê các thay đổi và hoàn thiện với một khung kết thúc. Bởi vì hầu hết các khung hình tương tự như khung hình trước đó, danh sách các thay đổi thường nhỏ hơn hình ảnh thứ hai.

Chuỗi thường không dài, nói năm khung. Nhưng nó giúp làm cho luồng nhỏ hơn so với nếu không.

Đơn giản hóa

Tôi đã bỏ qua rất nhiều. Hình ảnh của tôi chỉ có hai màu (1 bit), không phải là 256 của hình ảnh 8 bit và chắc chắn không phải là 4.294.967.296 của hình ảnh 32 bit. Ngay cả với hình ảnh 8 bit, lưu ý rằng bạn thường có thể chọn các bảng màu khác nhau cho hình ảnh. Vì vậy, hai bitmap 8 bit có cùng trình tự có thể đại diện cho hình ảnh trông khác nhau (cùng hình dạng nhưng màu sắc khác nhau).

Hình ảnh của tôi là hàng đơn, không phải hai chiều. Hầu hết các hình ảnh sẽ có kích thước hàng cụ thể được lưu trữ, làm cho các mảng hai chiều.

Tôi đã không cố gắng để đại diện cho các mã hóa thực tế ở tất cả. Chúng phức tạp hơn nhiều so với những cái đơn giản mà tôi đã sử dụng. Tôi đã làm điều này bởi vì tôi muốn có thể mô tả các bảng mã trong bài viết này. Tôi không tin rằng tôi có thể giải thích Lempel-Ziv ít hơn nhiều cho việc sàng lọc Lempel-Ziv-Welch phức tạp hơn trong một câu trả lời. Và tôi không hiểu Fourier biến đổi đủ tốt để giải thích chúng ở bất kỳ độ dài nào.

Đây là rất nhiều phiên bản đơn giản hóa của xử lý hình ảnh thực tế. Tuy nhiên, tôi cảm thấy rằng với mục đích giáo huấn, nó dễ hiểu hơn thực tế phức tạp hơn trong khi vẫn đạt được những điểm cốt yếu.


3

Hãy nói điều đó là sự thật, rằng mỗi pixel chỉ có ba số (đỏ, lục và lam) mỗi số trong phạm vi 0-255. Những người trả lời khác đã bắt đầu bằng cách (chính xác) thách thức giả định đó, nhưng để đơn giản, hãy nói điều đó đúng.

Tôi nhớ (nhưng đáng buồn là không thể tìm thấy trực tuyến) một phim hoạt hình từ sách giáo khoa ngôn ngữ học: hai thợ chạm khắc đá Ai Cập cổ đại đang ngồi kiệt sức dưới đáy của một bức tường lớn mà trên đó họ đã khắc một số lượng rất lớn các hình tượng diễu hành. Một người đang nói với người khác: "Chắc chắn phải có cách viết dễ dàng hơn, 'Pharaoh có 100.000 lính?'". Hãy ghi nhớ ý tưởng đó.

Bây giờ, giả sử hàng đầu tiên của hình ảnh của bạn chứa 1800 pixel màu đen. Làm thế nào mà được đại diện?

0 0 0    0 0 0     0 0 0   ....

Vì vậy, cần bao nhiêu không gian lưu trữ? Mỗi giá trị là một byte. Ba byte cho mỗi pixel, 1800 pixel trong hàng, vì vậy đã có 5400 byte mỗi hàng. Vì vậy, một hình ảnh có kích thước 1800 x 1200 phải chiếm gấp 1200 lần, tức là hơn 6 megabyte. Vì vậy, bây giờ chúng ta hãy đi và thực hiện tìm kiếm hình ảnh Google và tải xuống một vài hình ảnh 1800x1200 mà Hãy giả sử, một .pnghình ảnh và một .jpghình ảnh. Nhìn vào kích thước tập tin: có phải là 6 MB không? Không có cách nào, nó thường là nhiều nhỏ hơn thế. Và đó là một điều đáng mong muốn, tất nhiên, tất cả không gian đó đã được lưu và thời gian tải xuống ngắn hơn ....

Vì vậy những gì đang xảy ra? Điều quan trọng là, ngay cả khi bạn có nhiều số để lưu trữ, vẫn có những cách khác nhau để thể hiệnnhững con số trong tập tin Có một ví dụ về cách trình bày hiệu quả hơn ngay trong câu trả lời của tôi, hai đoạn trước. Tôi đã viết dòng chữ "1800 pixel đen". Đó là 17 ký tự, và do đó không cần chiếm quá 17 byte, nhưng nó mô tả hoàn hảo chính xác thông tin mà chúng tôi nghĩ rằng chúng tôi cần 5400 byte. Và bạn chắc chắn có thể làm tốt hơn 17 byte (và cũng tiết kiệm rất nhiều nỗ lực trong việc thực hiện mã hóa / giải mã) nếu bạn không sử dụng ngôn ngữ tiếng Anh để mã hóa thông tin này, mà là ngôn ngữ có mục đích đặc biệt hơn. Vì vậy, bây giờ, chúng tôi đã tạo ra nhiều định dạng nén hình ảnh: một định dạng sử dụng các từ tiếng Anh và một định dạng hiệu quả hơn thế. Thấy nơi đang tới không?

OK, bạn nói, nó hoạt động nếu một loạt các pixel liền kề xảy ra có cùng màu. Nhưng nếu họ không? Chà, chắc chắn, nó phụ thuộc vào nội dung của hình ảnh cụ thể: càng có nhiều dư thừa thì càng dễ nén thông tin. Dự phòng có nghĩa là các phần của hình ảnh có thể được dự đoán khá tốt nếu bạn đã biết các phần khác. Nén có nghĩa là chỉ viết ra mức tối thiểu cần thiết để tái cấu trúc thông tin. Không phải mọi hình ảnh có thể có sự dư thừa, nhưng bất kỳ hình ảnh thực nào có ý nghĩa đối với mắt và não của con người, mặc dù phức tạp hơn so với ví dụ thuần đen của tôi, vẫn sẽ có xu hướng dư thừa khá nhiều. Và có nhiều cách nén khác nhau. Một số phương pháp nén là lossless, có nghĩa là thông tin có thể được xây dựng lại để giống hệt về mặt toán học với bản gốc, như trong ví dụ về hàng pixel đen của tôi. Hầu hết .pngcác tập tin sử dụng một phương pháp nén lossless. Một số phương pháp bị mất : việc tái cấu trúc không hoàn hảo, nhưng các lỗi được ẩn giấu theo cách mà mắt và não của con người khó nhận thấy chúng. Hầu hết .jpgcác tập tin bị mất.

Các chi tiết về cách bạn nhận ra các mẫu dư thừa phức tạp và cách bạn viết các mô tả nén hiệu quả của chúng, là toán học cao và không tầm thường, đó là lý do tại sao có rất nhiều định dạng khác nhau, tương ứng với các chiến lược nén khác nhau. Nhưng hy vọng bạn có được nguyên tắc.

Một vài nhà bình luận ở trên đã đưa ra những phỏng đoán hợp lý về việc quan niệm sai lầm của bạn có thể xuất hiện ở đâu. Trong câu hỏi của bạn, dường như bạn nghĩ rằng nén chỉ thay đổi các giá trị pixel một chút (và chắc chắn, các phương pháp nén mất dữ liệu thực hiện điều đó ở những nơi, nhưng chỉ như một hiệu ứng phụ không mong muốn) mà không thay đổi bố cục thông tin. Khi bạn mở tệp và xem nội dung hình ảnh (ví dụ: dưới dạng một dãy số trong Matlab hoặc dưới dạng hình ảnh trên màn hình trong Photoshop), bạn không nhìn vào nội dung tệp nén mà thay vào đó là cấu trúc lại, có bố cục giống như bản gốc (nó sẽ không phải là một bản dựng lại nếu nó không tạo lại bố cục chính xác). Quy trình mở tệp đã giải nén thông tin từ tệp thành biểu diễn không nén hoàn toàn trong bộ nhớ. Nếu bạn so sánh hai bản dựng lại không nén , thì thực sự không có gì để phân biệt giữa hai định dạng hình ảnh khác nhau mà chúng xuất phát (ngoại trừ các lỗi tái tạo, nếu có).


1

Đúng, nhưng cách bạn đạt được 1 và 0 đó rất khác nhau.

Tôi sẽ đưa ra một ví dụ, nhưng nó là giả và được cho là minh họa nhiều hơn là chính xác. Hãy nhớ rằng tất cả các hình ảnh kỹ thuật số được thể hiện ở dạng nhị phân ở một mức độ nào đó.

Để làm phức tạp vấn đề, có các kênh khác nhau. CMYK, RGB, B & W, chỉ để một vài tên. Chúng ta sẽ không đi vào đó. Ngoài ra còn có các giai đoạn khác nhau, như chụp, lưu trữ và hiển thị. Chúng ta sẽ đi sâu vào vấn đề đó, mặc dù một lần nữa ví dụ được cho là không chính xác. Nếu bạn muốn các ví dụ chính xác, bạn sẽ cần tra cứu rất nhiều tài liệu kỹ thuật.

Vì vậy, trong mẫu của chúng tôi, chúng tôi sẽ xem xét một hình ảnh đen trắng.

00067000
00067000
00567800
04056090
40056009

Các con số đại diện cho "Đen" mạnh như thế nào. Đây là cách máy ảnh chụp lại hình ảnh. Đó là một chiếc máy ảnh tốt vì vậy nó cũng là cách nó lưu trữ hình ảnh.

Bây giờ nó lưu trữ hình ảnh trên máy tính, nhưng chiếm rất nhiều dung lượng nên chúng tôi sẽ nén nó. Ngoài việc nghiền nát nó, chúng tôi cũng biết rằng hầu hết mọi người không thể phát hiện ra sự khác biệt 1 cấp độ màu đen vì vậy chúng tôi sẽ làm dịu đi một số.

302730
302730
204820
*04056090
1420262019

Bây giờ đó là cách chúng tôi lưu trữ hình ảnh trên đĩa. Nó chiếm ít không gian hơn và cho phép chúng tôi tạo ra nhiều hình ảnh gốc.

Bây giờ hãy nói rằng chúng tôi muốn in nó trên máy in. Máy in chỉ in một cấp độ màu đen, vì vậy một máy tính sẽ dịch hình ảnh được lưu trữ, nén thành máy in nói.

00011000
00011000
00111100
01011010
10011001

Điều này in ra một hình ảnh trông hợp lý, nhưng bạn có thể thấy, ngay cả trong ví dụ là một sự thiếu chất lượng. Nhưng này là lỗi của máy in.

Cuối cùng, bạn đi in hình ảnh trên một máy in tốt với 10 cấp độ màu đen. Tương tự như máy ảnh của bạn. Vì vậy, bạn sử dụng hình ảnh được lưu trữ và nén.

00077000
00077000
00888800
04056090
40066009

Như bạn có thể thấy hình ảnh "tốt hơn" nhưng đã bị thay đổi một chút so với ban đầu.

Tại bất kỳ thời điểm nào, chính xác của bạn rằng tất cả chỉ là sức mạnh của một kênh. Và khác với hình ảnh nén, dù sao cũng phải giải nén, nó vẫn khá đúng với điều đó.

Tuy nhiên, định dạng nén mất rất nhiều "thông tin". Thông tin đó có quan trọng không? Vâng, đó là tùy thuộc vào nghệ sĩ và khán giả. Có một số sự đánh đổi giữa việc tiết kiệm không gian, thời gian xử lý, chất lượng của hình ảnh cuối cùng / được lưu trữ và nhu cầu. Tôi quét hầu hết các tài liệu của mình trong một màu đen vì đó là tất cả những gì tôi cần. Tuy nhiên, ảnh cưới của tôi ở định dạng HUGE RAW vì tôi không bao giờ biết khi nào tôi sẽ muốn in lại những bức ảnh tuyệt vời đó. Điều đó nói rằng, khi tôi chuyển chúng (ảnh) sang khung ảnh kỹ thuật số, tôi chuyển đổi chúng thành JPEG để tiết kiệm không gian. Các kênh khác nhau, các bộ lọc khác nhau và các phương pháp nén khác nhau đều là một loạt các sự đánh đổi. Nó giống như một phiên bản kỹ thuật số của tam giác máy in.


Khối mã thứ 2 của bạn (đã nén) đang hiển thị RLE, phải không? Có lẽ bạn nên nói rằng bạn đang thay thế các mẫu bằng số lần lặp lại + giá trị mẫu để mọi người biết loại nén nào, bởi vì nó hoàn toàn không rõ ràng nếu bạn không mong đợi RLE.
Peter Cordes

1

Tôi sẽ kết hợp với một chút thông tin bổ sung khi tôi đã làm việc với cảm biến hình ảnh và mã hóa / nén, mặc dù chủ yếu là các hình ảnh chuyển động.

Ở dạng cơ bản, một hình ảnh (BẤT K image) được hiển thị trên một màn hình cụ thể thực sự chỉ là một dãy số giống hệt nhau. Những con số đó có thể là 0-255 hoặc 0-65535 hoặc 0-anything-32-bit-is-I-quên-go-google-it.

NHƯNG có rất nhiều cách để LƯU TRỮ và VẬN CHUYỂN thông tin đó, rất nhiều trong số chúng chỉ đơn giản là sản phẩm của công nghệ bị mất theo thời gian.

Ngoài ra, một chi tiết mà tôi chưa thấy bất kỳ người đi bộ nào khác đề cập ở đây là dữ liệu cảm biến hình ảnh RAW thực sự từ máy ảnh kỹ thuật số cũng có thể là RGrGbB theo mô hình bayer hoặc somesuch cần được xử lý ít nhất một chút để thực hiện bất kỳ ý nghĩa đối với nhãn cầu con người Mk.1. Có thể bạn không bao giờ có được điều đó ngay cả ở định dạng RAW được lưu bởi máy ảnh DSLR của bạn bởi vì nó vô dụng cho đến khi bạn chuyển đổi nó thành một lưới pixel RGB hoặc YUV đẹp mắt, có thể sâu 8, 16, 32 hoặc một trăm triệu bitcoin.

Những thứ tôi đã làm việc sử dụng YUV trong nội bộ vì bất kỳ lý do gì, tôi cho rằng nó dễ dàng được xử lý bởi các codec hơn khi con người cảm nhận được độ sáng với độ nhạy cao hơn nhiều so với màu sắc.

Để đọc sách trước khi đi ngủ, hãy xem phần "định dạng hình ảnh khung": http : // f Focus.ti.com/lit/ug/sprufg8b/sprufg8b.pdf

Dù sao ... trở lại câu hỏi ban đầu của bạn về sự khác biệt giữa các tệp hình ảnh không nén như TIFF / RAW / IFF / PNG.

Nói chung, lý do tồn tại là vì, nhiều mặt trăng trước đây, mỗi nhà sản xuất máy tính / HĐH / máy in đã đưa ra các yêu cầu hơi khác nhau của riêng họ đối với một số cách lưu trữ / gửi hình ảnh.

Vì vậy, RAW như được thảo luận bởi những người khác trong chủ đề này là một thuật ngữ chung cho một số thứ khác nhau được lưu bởi các máy ảnh kỹ thuật số khác nhau, sử dụng bất kỳ tải dữ liệu nào mà nhà sản xuất máy ảnh cho là quan trọng, dựa trên các tính năng mà máy ảnh của họ có hoặc có thể có trong tương lai. Vì vậy, mặc dù bit dữ liệu hình ảnh chính có thể rất giống nhau, "bao bì" xung quanh nó mô tả hình ảnh và tất cả các cài đặt máy ảnh, v.v. vì vậy một nhà sản xuất khác sẽ không hiểu được một tập tin.

Theo truyền thống, điều này là để họ có thể khiến bạn (hoặc, rất có thể, các nhiếp ảnh gia chuyên nghiệp) sử dụng phần mềm độc quyền (và đôi khi đắt tiền) của họ để xử lý những hình ảnh chất lượng cao hơn này, nếu không bạn có thể bắt đầu sử dụng phần mềm đắt tiền của người khác. Ngoài ra, có thể Adobe Photoshop muốn hỗ trợ định dạng của họ, vì vậy có thể họ có thể tính phí Adobe $$$ cho thông tin đó để các nhiếp ảnh gia chuyên nghiệp hơn sẽ mua PS và có thể mua máy ảnh đó vì PS hỗ trợ ngay bây giờ. Ấm cúng!

RAW cũng lưu trữ thông tin về cách biến gói dữ liệu cụ thể đó trở thành hình ảnh có thể xem được của con người, chỉ cần đặt tất cả các chỉnh sửa bạn cần thực hiện để dữ liệu có được hình ảnh "đúng".

TIFF là một định dạng hình ảnh ban đầu, trong số những thứ khác, được sử dụng để gửi dữ liệu đồ họa đến máy in (khi máy in có khả năng đồ họa bắt đầu có giá phải chăng). Nó khá cơ bản nên dễ dàng xử lý trên bộ vi xử lý nhỏ giá rẻ bên trong máy in.

IFF (vâng, đó là một thứ) là một định dạng tương tự được sử dụng trên máy tính Amiga, tôi tin rằng chúng được phát minh bởi chúng hoặc một trong những gói sơn phổ biến. Nhưng, tôi đang sử dụng nó ở đây làm ví dụ vì mặc dù nó lưu trữ dữ liệu ảnh bản đồ bit như các loại khác, nó hỗ trợ dữ liệu RLE không nén hoặc, độ sâu bit thay đổi từ đơn sắc 1 bit đến 8 bit 256 màu (nhưng với một bảng màu RGB 3x8 bit để lựa chọn cho từng màu) cũng như các chế độ đặc biệt có tên Halftone và Hold-And-Modify cho phép nhiều màu sắc hơn các máy khác trong thời đại có thể quản lý. Ồ, và nó cũng hỗ trợ hoạt hình (như GIF) để tệp IFF có thể lưu trữ bất kỳ số lượng khung hình nào, với độ trễ thay đổi giữa các khung và mỗi khung hình có thể có bảng màu riêng. Vì vậy, IFF sẽ bao gồm dữ liệu bổ sung để xử lý tất cả điều này so với, ví dụ, một tệp TIFF.

PNG là một định dạng hình ảnh không mất dữ liệu khác, một lần nữa lưu trữ dữ liệu bitmap, nhưng hỗ trợ một số tính năng thú vị như kênh alpha 8 bit để có độ trong suốt trên một hình ảnh (hữu ích trên các trang web), do đó, "tải trọng" dữ liệu hình ảnh có thể trông rất giống nhau nhưng trình bao bọc xung quanh nó thì khác và tải trọng có thể chứa RGBA thay vì chỉ dữ liệu RGB trên mỗi pixel.

Vì vậy, đó là 4 định dạng tệp hình ảnh khác nhau được mô tả - bạn có thể lưu trữ một hình ảnh HD đầy màu sắc của một con mèo trong bất kỳ 4 hình nào và nó sẽ NHÌN giống hệt nhau, mọi pixel trên màn hình của bạn sẽ có giá trị CÙNG CHÍNH XÁC và sẽ KHÔNG CÓ sự khác biệt về chất lượng giữa 4 ... nhưng 4 tệp có thể khác nhau về kích thước, bố cục và phần mềm dễ dàng hơn hoặc khó hơn để tải & xử lý.

Mong rằng sẽ giúp!


0

Chỉ cần nghĩ rằng tôi sẽ bấm vào đây với thông tin nên có trong câu trả lời đầu tiên cho câu hỏi này.

Các pixel trong một hình ảnh không được lưu trữ trong một byte - trừ khi hình ảnh là đơn sắc, tức là chỉ có màu đen và trắng.

Nếu bạn có một hình ảnh truecolor, thì mỗi pixel được biểu thị bằng 16 bit hoặc 2 byte - dưới dạng một giá trị. Nếu bạn có một hình ảnh 32 bit, thì mỗi pixel yêu cầu 32 bit hoặc 4 byte, một lần nữa dưới dạng một giá trị.

đủ thú vị, các tệp hình ảnh và âm thanh và mọi loại dữ liệu khác trong máy tính sẽ giảm xuống còn các bit 1 và 0. Chỉ bằng cách giải thích chúng trong các đoạn có kích thước chính xác mà ý nghĩa được trích ra từ chúng.

Ví dụ: một hình ảnh và một tài liệu từ và một tệp mp3 đều có cùng một nội dung dữ liệu cơ bản (một bó byte) và bất kỳ trong số chúng có thể được hiểu là một trong những loại khác - bạn có thể hiểu tài liệu từ là âm thanh tập tin và bạn sẽ nghe thấy một cái gì đó, nhưng nó sẽ không phải là âm nhạc. Bạn chắc chắn có thể diễn giải một tập tin âm thanh như một hình ảnh, và nó sẽ hiển thị một cái gì đó, nhưng nó sẽ không phải là một hình ảnh gắn kết.

Vì vậy, để tóm tắt, một máy tính chỉ biết về bit - một bit là 1 hoặc 0. Tất cả hình ảnh, âm thanh, tài liệu, phim, video, ghi âm, trò chơi, cuộc gọi điện thoại, tin nhắn văn bản và bất cứ thứ gì khác được dán nhãn là kỹ thuật số đều có cùng một chính xác nội dung - một loạt các 1 và 0. Các số 1 và 0 trở thành hình ảnh, âm thanh và tài liệu và mọi thứ khác vì mã đọc chúng biết để đọc các bit đó theo nhóm và xử lý chúng theo đó.

Đó là lý do tại sao chúng ta có những thứ như hình ảnh 16 bit và 32 bit, và tệp âm thanh 16 bit và 24 bit. Bạn càng sử dụng nhiều bit cho pixel hoặc mẫu âm thanh, bạn càng có thể biểu cảm hơn - 16 bit chỉ có thể xác định 64k màu duy nhất, nhưng 32 bit có thể xác định hơn 4 triệu màu duy nhất. Một hình ảnh đơn sắc sử dụng 1 bit cho mỗi pixel - nó là bật hoặc tắt.

Với các tệp âm thanh, bạn sử dụng càng nhiều bit trên mỗi mẫu, bản ghi càng chi tiết và nhiều sắc thái.


0

Tôi đã không đọc toàn bộ chủ đề nhưng dường như nhiều người đang quên mất các định dạng hình ảnh được vector hóa. Chúng không phải là mảng pixel, bởi vì khái niệm pixel thậm chí không tồn tại ở định dạng như vậy. Tùy thuộc vào trình kết xuất để tìm ra cách tạo hình ảnh trên màn hình hoặc bất kỳ phương tiện nào khác.

Ngay cả khi không đề cập đến miền màu, nén, kích thước bit và định dạng kênh, vẫn có một bộ định dạng tệp hoàn toàn không giống với bản đồ pixel. Tuy nhiên, các định dạng vector cũng "tốt hơn" trong việc thể hiện một số loại hình ảnh nhất định, thường được sản xuất bởi máy tính chứ không phải máy ảnh.


1
Đây là một trang web nhiếp ảnh và vì máy ảnh kỹ thuật số ghi lại các mảng pixel chứ không phải vectơ, tôi sẽ không nói rằng nó "quên" nhiều đến mức không bình thường trong bối cảnh này.
mattdm

0

Câu hỏi này đã được trả lời khá chi tiết trước đây. Tuy nhiên, mặc dù có rất nhiều lý thuyết được trình bày trong các câu trả lời, tôi cảm thấy có một số môn học cơ bản, thường liên quan đến lập trình máy tính đòi hỏi phải làm rõ hơn. Tôi phải nói tôi là một kỹ sư phần mềm. Sau khi tôi đọc câu hỏi tôi nhận ra có một sự hiểu lầm hoàn toàn về các loại dữ liệu lập trình cơ bản đã tạo ra câu hỏi này.

Câu hỏi đầu tiên ở đây là:

Hơn nữa, từ quan điểm số, điều gì làm cho một cái gì đó giống như hình ảnh 16 bit khác với hình ảnh 32 bit? Một lần nữa, một hình ảnh chỉ là một mảng với các giá trị nguyên nằm trong khoảng 0 -255.

Như đã trình bày trước: Không, không phải vậy. Một hình ảnh không chỉ là một mảng các giá trị nguyên trong khoảng 0-255. Trên thực tế, nó có thể là một mảng đơn hoặc đa chiều từ 0 đến 65535 giá trị, một mảng từ 0 đến 4294967295 hoặc thậm chí là một mảng bit (một bit có thể chứa 0 hoặc 1 giá trị, đó là tất cả) được chuyển đổi bởi phần mềm có thể đọc các tập tin hình ảnh thành số nguyên theo các quy tắc mã hóa khác nhau.

Để hiểu rõ hơn về điều này, như đã nêu trước đây, tôi nghĩ rằng một cuộc thảo luận về các loại dữ liệu lập trình cơ bản là cần thiết. Tôi sẽ cố gắng giải thích chúng đơn giản nhất có thể để mọi người hiểu các vấn đề liên quan đến việc lưu trữ giá trị nguyên trong các tệp máy tính.

Trong lập trình máy tính, chúng tôi sử dụng một số loại dữ liệu nguyên thủy cơ bản để ghi giá trị vào tệp, đọc chúng từ tệp vào bộ nhớ máy tính, thao tác các giá trị đó bằng nhiều loại dữ liệu ngôn ngữ lập trình cụ thể khác nhau và cuối cùng lưu chúng trở lại tệp. Số nguyên trong lập trình máy tính không chỉ là số nguyên. Có tất cả các loại số nguyên, phụ thuộc vào ngôn ngữ lập trình chúng ta đang sử dụng và chúng ta cần bao nhiêu bộ nhớ cho mỗi loại. Thông thường, trong hầu hết các ngôn ngữ lập trình, chúng tôi có các loại dữ liệu sau (và cách để thao tác chúng):

  • BIT - giữ 0 hoặc 1
  • UINT8 - số nguyên không dấu 8 bit - chúng có thể giữ các giá trị trong khoảng [0 đến 255].
  • INT8 - Số nguyên có chữ ký 8 bit - chúng có thể giữ các giá trị trong khoảng [-126 đến 127].
  • Số nguyên không dấu UINT16 - 16 bit - chúng có thể giữ các giá trị trong khoảng [0 đến 65535].
  • Số nguyên không dấu INT16 - 16 bit - chúng có thể giữ các giá trị trong khoảng [−32768 đến 32767].
  • Số nguyên không dấu UINT32 - 32 bit - chúng có thể giữ các giá trị trong khoảng [0 đến 4294967295].
  • INT32 - số nguyên không dấu 32 bit - chúng có thể giữ các giá trị trong khoảng [−2147483648 đến 2147483647].
  • HOẶC một sự kết hợp của tất cả các loại dữ liệu trong một định dạng phức tạp hơn. Ví dụ: UINT16 (16 BIT) giữ 3 giá trị khác nhau, 4 giá trị BIT đầu tiên giữ từ 0 đến 127, BIT tiếp theo giữ 0 hoặc 1, v.v.

Hơn nữa có một số lập trình viên phải giải quyết khi đọc hoặc ghi kiểu dữ liệu số nguyên từ các tệp. Người cuối đời.Endianness đề cập đến thứ tự tuần tự trong đó các byte (UINT8 từ bảng của chúng tôi) được sắp xếp thành các giá trị số lớn hơn khi được lưu trữ trong bộ nhớ hoặc tệp. Endianness được quan tâm trong khoa học máy tính vì hai định dạng mâu thuẫn và không tương thích được sử dụng phổ biến: các giá trị có thể được biểu thị theo định dạng endian lớn hoặc endian, tùy thuộc vào việc bit hoặc byte hoặc các thành phần khác được sắp xếp từ đầu lớn (quan trọng nhất bit) hoặc đầu nhỏ (bit đáng kể nhất). Đơn giản, bạn có thể lưu trữ một giá trị như thế này 0000000011011111 hoặc ... như thế này 1101111100000000 tùy theo thứ tự cuối cùng mà bạn đã chọn. Và bạn có thể tự do chọn bất kỳ đơn hàng nào phù hợp với mục đích của bạn. Không có quy tắc nào khác mà bạn thực hiện khi bạn thiết kế định dạng tệp hình ảnh.

Xin lưu ý trong các số nguyên lập trình máy tính đang sử dụng nhiều hoặc ít không gian, tùy thuộc vào giá trị. Giống như bạn cần thêm giấy để viết 255255255, bạn cần nhiều BIT hơn để viết giá trị lớn hơn. Sau đó, khi bạn muốn đọc giá trị, bạn phải biết chính xác các quy tắc bạn đã tạo khi bạn viết nó. Mặt khác, bạn không thể tìm ra cách chúng ta chỉ đọc một mảng có giá trị nguyên trong khoảng 0 -255 vì đơn giản là bạn không biết những số đó được lưu trữ ở đâu và làm thế nào những số đó được lưu trữ với rất nhiều lựa chọn (BIT, UINT8 , UINT16, UINT32 hoặc kết hợp tất cả các loại dữ liệu máy tính đó). Và đừng quên, Endianness. Nếu bạn không biết dữ liệu được ghi bằng cách sử dụng thứ tự lớn hoặc cuối nhỏ, bạn không thể đọc giá trị phù hợp.

Do các hình ảnh này KHÔNG BAO GIỜ chỉ là một mảng có giá trị nguyên trong khoảng 0 - 255. Một số trong số chúng là mảng UINT16 (hình ảnh 16 bit), một số khác là mảng UINT32 (hình ảnh 32 bit) hoặc các mảng khác là mảng UINT8 (hình ảnh 8 bit). Một số lập trình viên máy tính rất sáng tạo thậm chí có thể sử dụng các loại đã ký kết sống với các mảng INT8, có nghĩa là mảng các giá trị nằm trong khoảng từ -126 đến 127.

Thực tế khi bạn đọc một tệp hình ảnh, một trong những dữ liệu đầu tiên bạn gặp phải thường là một số BIT đại diện cho chiều rộng và chiều cao của hình ảnh. Và đó không chỉ là một số giá trị 0-255. Đó cũng là một số loại dữ liệu được chọn bởi lập trình viên. Một số lập trình viên sẽ nghĩ 16 BIT là enogh để lưu trữ chiều rộng hình ảnh tối đa 65535 pixel, bởi vì họ đang thiết kế một định dạng hình ảnh được sử dụng trong trò chơi để giữ một số hình ảnh nút nhỏ. Một số lập trình viên khác có thể sử dụng giá trị 32 bit ở đây cho phép bạn lưu trữ hình ảnh có chiều rộng và chiều cao 4294967295. Một số lập trình viên điên rồ của NASA thậm chí có thể sử dụng 64 bit để lưu trữ một bức ảnh khổng lồ của thiên hà lên tới 18446744073709551615 pixel.Nếu bạn không biết các quy tắc, bạn không thể đọc các "giá trị" đó khi bạn gọi chúng. Bởi vì bạn không biết họ bắt đầu từ đâu trong tệp hình ảnh và nơi họ kết thúc. Vì vậy, bạn kết thúc với một loạt BIT mà bạn không hiểu gì về nó.

Đó là lý do tại sao vũ trụ đầy rẫy với rất nhiều định dạng hình ảnh khác nhau. Bởi vì không có giải pháp chuẩn để ghi một số giá trị nguyên vào một tệp. Đó là sự lựa chọn của lập trình viên hoàn toàn dựa trên nhiều yếu tố như Endianess của máy bạn đang làm việc, ngôn ngữ lập trình bạn đang sử dụng để thiết kế triển khai định dạng tệp gốc và nhiều thứ khác như mục đích của định dạng hình ảnh (như đã nêu rõ trước đó câu trả lời khác).

Định dạng tệp đơn giản thực tế của hình ảnh đen trắng chỉ chứa một giá trị duy nhất 166 để thể hiện hình ảnh 4x2 pixel:

Hình ảnh (1 - pixel đen, 0 - pixel trắng):

1010 
0110

Định dạng tệp này sử dụng 1 BIT cho mỗi PIXEL được lưu dưới dạng giá trị nguyên 8 bit SINGLE 166 (10100110). Đó là tất cả. Không có mảng 0-255 giá trị nào được sử dụng nhưng 8 giá trị 0 hoặc 1 khác nhau được lưu trữ dưới dạng giá trị 166.

Nếu bạn đã sử dụng một mảng 0-255 giá trị cho mỗi pixel * 3 lần cho RGB, bạn sẽ có một hình ảnh lớn hơn 24 lần. Định dạng tệp này chỉ tiết kiệm 24 lần dung lượng ổ đĩa bạn cần để lưu một hình ảnh như thế này hoặc giảm 24 lần bộ nhớ máy tính cần thiết để đọc và giữ hình ảnh này vào RAM máy tính khi bạn sử dụng hình ảnh này trong công cụ trò chơi 3D hiệu suất cao của bạn để vẽ một cái gì đó trên màn hình với nó (kết cấu hàng ngàn hạt bụi bay xung quanh có thể là một ứng cử viên tốt :)).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.