Python Nikon RAW

Hình ảnh JPEG là đầu ra được xử lý 'sẵn sàng để xem' từ máy ảnh. Trong chụp ảnh điện toán, có thể hữu ích khi làm việc trực tiếp với dữ liệu cảm biến thô từ máy ảnh kỹ thuật số. Cái gọi là xử lý RAW và các tệp RAW thường phải được xử lý trước khi chúng có thể được hiển thị. Trong phòng thí nghiệm này, chúng tôi sẽ khám phá bản chất của dữ liệu cảm biến thô và triển khai trình đọc ảnh RAW của riêng chúng tôi

NGUYÊN là gì?

'RAW' là một loại tệp máy tính thường chứa hình ảnh không nén chứa cả giá trị pixel cảm biến và một lượng lớn thông tin meta về hình ảnh do máy ảnh tạo ra [dữ liệu EXIF]. Bản thân các tệp RAW có nhiều định dạng tệp độc quyền [của Nikon. NEF, Canon. CR2, v.v. ], nhưng có một định dạng mở phổ biến,. DNG, viết tắt của Âm bản kỹ thuật số. Cái sau chỉ ra cách các nhiếp ảnh gia kỹ thuật số nghĩ về các tệp này. bản gốc chính, kho lưu trữ tất cả thông tin đã chụp của hiện trường

Dữ liệu thô từ cảm biến hình ảnh chứa các giá trị cường độ ánh sáng được ghi lại từ một cảnh, nhưng những dữ liệu này về bản chất không thể nhận biết được đối với mắt người. Dữ liệu là một hình ảnh cường độ kênh đơn, có thể có giá trị tối thiểu khác không để biểu thị 'màu đen', với các giá trị số nguyên chứa 10-14 bit dữ liệu [đối với máy ảnh kỹ thuật số điển hình]. Thay vì nói về giá trị 'trắng' nội tại, sẽ không có giá trị nào trong ảnh vượt quá mức tối đa nào đó biểu thị điểm bão hòa của cảm biến máy ảnh vật lý [e. g. , cảm biến CMOS hoặc CCD]

Dữ liệu cảm biến thô thường ở dạng Mảng bộ lọc màu [CFA]. Đây là một mảng m-by-n pixel [trong đó m và n là kích thước của cảm biến] trong đó mỗi pixel mang thông tin về một kênh màu duy nhất. đỏ, xanh lá cây hoặc xanh dương. Vì ánh sáng chiếu vào bất kỳ điểm ảnh [pixel] nhất định nào trong cảm biến CCD được ghi lại dưới dạng một số electron trong tụ điện, nên nó chỉ có thể được lưu dưới dạng giá trị vô hướng; . CFA cung cấp một sự thỏa hiệp trong đó thông tin về từng kênh trong số ba kênh màu được ghi lại tại các vị trí khác nhau bằng các bộ lọc chọn lọc quang phổ được đặt phía trên mỗi pixel

Mẫu CFA phổ biến nhất là mảng Bayer, được hiển thị trong Hình 1. Số điểm ảnh đại diện cho ánh sáng xanh lục trong ảnh mảng của Bayer nhiều gấp đôi vì mắt người nhạy cảm hơn với sự thay đổi sắc thái của màu xanh lá cây và nó tương quan chặt chẽ hơn với nhận thức về cường độ ánh sáng của cảnh

Bố cục CFA của Bayer. Mỗi pixel đại diện cho giá trị màu đỏ, xanh lam hoặc xanh lục của ánh sáng tới cảm biến, tùy thuộc vào sự sắp xếp trong mảng. Để có được cả ba yếu tố ở mọi vị trí, phải áp dụng phương pháp gỡ lỗi

Debayering là gì?

Debayering, còn được gọi là khử màu, là quá trình chuyển đổi hình ảnh CFA [m-by-n] thành hình ảnh kỹ thuật số màu RGB thực [m-by-n-by-3]. Mặc dù bạn chỉ có thể thực sự biết một giá trị màu tại bất kỳ vị trí pixel nào, nhưng bạn có thể khéo léo nội suy hai giá trị màu còn lại từ các hàng xóm lân cận nơi những màu đó được biết đến

bản vẽ của Dave Coffin

Để làm việc với hình ảnh thô trong Python, trước tiên chúng ta phải sử dụng các phần mềm khác để chuyển đổi định dạng dành riêng cho nhà sản xuất máy ảnh và lấy dữ liệu hình ảnh ngọt ngào được tìm thấy bên trong

Có một phần mềm nguồn mở, đa nền tảng tuyệt vời, được viết bởi Dave Coffin, được gọi là dcraw [phát âm là dee-see-raw]. Đây là giải pháp mã nguồn mở để đọc hàng chục loại tệp RAW khác nhau và xuất tệp PPM hoặc TIFF dễ đọc [gói Gối của Python có thể đọc trực tiếp dữ liệu từ đó]. Nhiều bộ chỉnh sửa hình ảnh nguồn mở kết hợp chương trình này như thói quen đọc RAW của riêng họ. Nó có thể đọc tệp từ hàng trăm kiểu máy ảnh và thực hiện nhiều bước xử lý tiêu chuẩn để lấy tệp RAW và tạo đầu ra hấp dẫn

Để biên dịch dcraw, hãy tải xuống tệp nguồn 'dcraw. c' từ trang web của Dave Coffin và chạy lệnh sau tại dấu nhắc đầu cuối

gcc -o dcraw -O4 dcraw.c -lm -DNODEPS

Khi nó được biên dịch thành công, bạn sẽ có thể chạy "dcraw" để xem hướng dẫn cho tất cả các cờ có sẵn

Mac. Bạn có thể phải xóa cờ -O4 để biên dịch

các cửa sổ. Xây dựng dcraw bằng trình biên dịch C yêu thích của bạn [trực tiếp MinGW hoặc Visual C---repo tại đây cho Visual Studio] hoặc sử dụng các tệp thực thi dựng sẵn từ đây

Linux. Nên biên dịch tốt. Các tệp thực thi được tạo sẵn từ tại đây

rút tiền thay thế. c tải xuống. NƠI ĐÂY

Hiển thị ảnh RAW

Ảnh RAW mẫu. NƠI ĐÂY

Tổng quan

Dưới đây là tổng quan về những gì bạn sẽ khám phá để đọc và hiển thị ảnh RAW

  1. Sử dụng công cụ dcraw, trích xuất hình ảnh CFA ra khỏi tệp RAW
  2. Chuẩn bị hình ảnh CFA, bao gồm tuyến tính hóa và chuẩn hóa dữ liệu cảm biến thành phạm vi [0,1]
  3. Áp dụng cân bằng trắng cho dữ liệu
  4. Triển khai thuật toán gỡ lỗi bằng Python
  5. Chuyển đổi hình ảnh RGB thành không gian màu sRGB
  6. Thực hiện thuật toán hiệu chỉnh độ sáng và gamma
Quy trình xử lý ảnh thô

Thông qua mã stencil, chúng tôi sẽ giới thiệu cách triển khai từng bước này trong Python

Sự chuẩn bị

Trước khi cố gắng triển khai trình đọc RAW của riêng mình, chúng tôi cần trích xuất một số thông tin cần thiết từ dữ liệu EXIF ​​bằng cách sử dụng dcraw. Đây được gọi là "chạy trinh sát" [dành cho mục đích dò tìm]

Chạy lệnh sau [một lần nữa, bạn có thể chạy "dcraw" để biết các cờ sau đại diện cho điều gì]

dcraw -4 -d -v -T 

Bạn sẽ thấy đầu ra được định dạng sau

Scaling with darkness , saturation ,
and multipliers    

trong đó số nguyên điền vào các trường trên. Ghi lại từng người trong số họ vì chúng tôi sẽ sử dụng chúng trong thời gian ngắn

Bạn cũng sẽ tìm thấy sơ bộ. hình ảnh tiff trong thư mục không có màu và không có phép nội suy. Chúng tôi sẽ ghi đè nó ngay

Trích xuất CFA từ RAW

Để lấy dữ liệu cảm biến thô vào Python, chúng tôi sử dụng dcraw với các tùy chọn sau để xuất tệp TIFF 16bpp. Điều này cũng sẽ ghi đè lên hình ảnh sơ bộ được tạo trước đó

dcraw -4 -D -T 

Bây giờ bạn có thể đọc tệp này bằng Python bằng cách sử dụng

raw_data = Image.open['../sample/sample.tiff']
raw = np.array[raw_data].astype[np.double]

, sẽ mang lại thông tin CFA thô của máy ảnh

Tuyến tính hóa và chuẩn hóa

Mảng 2-D mà chúng tôi vừa tạo trong TIFF có thể không phải là hình ảnh tuyến tính. Có thể máy ảnh đã áp dụng phép biến đổi phi tuyến tính cho dữ liệu cảm biến cho mục đích lưu trữ. Nếu vậy, siêu dữ liệu DNG sẽ chứa một bảng để ánh xạ các giá trị của mảng CFA thành các giá trị 10-14 bit đầy đủ. May mắn thay, dcraw xử lý tuyến tính hóa cho chúng tôi vì chúng tôi đã sử dụng tùy chọn '-4', vì vậy bước này không cần thiết

Tuy nhiên, ngay cả khi không có nén phi tuyến tính để đảo ngược, hình ảnh thô vẫn có thể có độ lệch và tỷ lệ tùy ý. Do đó, chúng ta cần áp dụng phép biến đổi affine từ phạm vi [đen, trắng] sang phạm vi [0,1], để chuẩn hóa các giá trị pixel của hình ảnh. Phạm vi [đen, trắng] có thể được tìm thấy từ các giá trị chúng tôi thu được từ bước 'Chuẩn bị'

Nhập những số này vào mã stencil. Nếu chúng ta hiển thị hình ảnh của mình, nó sẽ giống như thế này

Cân bằng trắng

Bất kỳ vật thể nào cũng có thể trông giống như bất kỳ màu nào, tùy thuộc vào ánh sáng chiếu vào nó. Để tiết lộ màu sắc mà chúng ta sẽ nhìn thấy với tư cách là con người, thứ chúng ta cần là một điểm tham chiếu, thứ mà chúng ta biết phải là một màu nhất định [hay chính xác hơn là một sắc độ nhất định]. Sau đó, chúng ta có thể thay đổi tỷ lệ các giá trị R, G, B của pixel cho đến khi nó có màu đó. Vì thường có thể xác định các đối tượng phải có màu trắng, nên chúng tôi sẽ tìm một pixel mà chúng tôi biết phải có màu trắng [hoặc xám], pixel mà chúng tôi biết phải có các giá trị RGB bằng nhau, sau đó chúng tôi tìm các hệ số tỷ lệ cần thiết để buộc mỗi kênh . Như vậy, quá trình thay đổi kích thước này được gọi là cân bằng trắng. Khi chúng tôi làm điều này cho một pixel, chúng tôi sẽ giả định rằng cùng một nguồn sáng đang chiếu sáng toàn bộ cảnh và sử dụng các giá trị chia tỷ lệ này cho tất cả các pixel trong hình ảnh

Do đó, vấn đề đơn giản là tìm hai đại lượng vô hướng biểu thị tỷ lệ tương đối của hai trong số các kênh màu với kênh thứ ba. Điển hình là kênh màu xanh lá cây được giả định là kênh mà các kênh khác được so sánh, i. e. , vô hướng kênh màu lục thường là 1, trong khi các kênh khác thường > 1

Các vô hướng được ghi lại trong dữ liệu EXIF. Bạn có nhớ các giá trị tỷ lệ mà chúng ta đã nhận được trước đó trong bước Chuẩn bị không?

nhiệm vụ

  • Truyền bá các giá trị vô hướng trên mỗi kênh cho tất cả các pixel trong ảnh
  • Chúng tôi sẽ làm điều này bằng cách tạo ra một ma trận các giá trị vô hướng, sau đó nhân nó với hình ảnh thô
  • Hoàn thành hàm wbscalematrix[] trong mã khuôn tô để tạo ma trận chính xác

tranh cãi

Có nhiều hàm demosaic[] khác nhau để hoàn tất quá trình gỡ lỗi. Thay vì sử dụng chúng, trong phòng thí nghiệm này, chúng tôi muốn bạn viết thuật toán gỡ lỗi của riêng mình

Phương pháp đơn giản nhất là phép nội suy lân cận gần nhất, đơn giản là sao chép một pixel liền kề của cùng một kênh màu. Một phương pháp đơn giản khác là nội suy tuyến tính, được gọi là nội suy song tuyến tính trong 2D, theo đó giá trị màu đỏ của pixel không phải màu đỏ được tính bằng giá trị trung bình của hai hoặc bốn pixel màu đỏ liền kề và tương tự đối với màu xanh lam và xanh lục

nhiệm vụ

  • Hoàn thành chức năng debayering[] trong khuôn tô

Bây giờ khi chúng tôi hiển thị nó, có màu

Hiệu chỉnh không gian màu

Hình ảnh RGB hiện tại có thể xem được với các chức năng hiển thị matplotlib tiêu chuẩn. Tuy nhiên nhìn màu hơi lạ. bởi vì các pixel của nó không có tọa độ trong không gian RGB chính xác mà hệ điều hành mong đợi

Những gì chúng ta cần làm là chuyển đổi từ không gian màu của máy ảnh sang không gian màu sRGB bằng cách áp dụng phép biến đổi ma trận 3x3 cho từng pixel

Phần chức năng này được cung cấp cho bạn trong mã khuôn tô. Tuy nhiên, nếu bạn muốn sử dụng ảnh RAW của riêng mình từ một mẫu máy ảnh tùy chỉnh, bạn cần tìm hiểu ma trận XYZ-to-camera cho mẫu máy ảnh của mình. Ma trận này [nhân 10.000] có thể được tìm thấy trong mã nguồn bên dưới hàm adobe_coeff

nhiệm vụ

  • Bỏ ghi chú bước này trong mã stencil

Hiệu chỉnh độ sáng và gamma

Bây giờ chúng ta có một hình ảnh RGB 16 bit đã được sửa màu và tồn tại trong không gian màu phù hợp để hiển thị. Tuy nhiên, nó vẫn là một hình ảnh tuyến tính với các giá trị liên quan đến những gì mà máy ảnh cảm nhận được, có thể không nằm trong phạm vi phù hợp để hiển thị [quá tối]. Nói cách khác, hình ảnh đã 'đúng' theo một nghĩa nào đó, nhưng không nhất thiết phải 'đẹp'. ’

Làm thế nào để làm cho nó 'đẹp', sau đó? . Lưu ý rằng bước cuối cùng này mang tính chủ quan cao

Một phương pháp hiệu chỉnh độ sáng đơn giản là tìm độ chói trung bình của hình ảnh và sau đó chia tỷ lệ sao cho độ chói trung bình là một giá trị hợp lý hơn. Trong các mã khuôn tô, chúng tôi [khá tùy ý] chia tỷ lệ hình ảnh sao cho độ sáng trung bình bằng 1/4 mức tối đa. Đối với người thiên về chụp ảnh, điều này tương đương với việc chia tỷ lệ hình ảnh để có hai điểm dừng chi tiết vùng sáng

Hình ảnh bây giờ sáng hơn, nhưng các vùng tối vẫn quá tối. Chúng tôi sẽ áp dụng một hàm phi tuyến tính cho các giá trị độ sáng để làm cho chúng dễ chịu hơn về mặt cảm quan---chúng tôi có thể thực hiện điều này thông qua phép lũy thừa. Đây được gọi là hiệu chỉnh gamma, sử dụng định luật lũy thừa để ảnh hưởng đến độ sáng. Số mũ cụ thể được chọn---giá trị gamma \[\gamma\]---là tùy ý;

$$O=\alpha I^\gamma$$ trong đó \[I\] là hình ảnh đầu vào, \[O\] là hình ảnh đầu ra và \[\alpha\] thường là 1

nhiệm vụ

  • Thực hiện điều chỉnh độ sáng
  • Thực hiện hiệu chỉnh gamma

Xin chúc mừng. Bây giờ bạn đã có một trình đọc ảnh RAW hoạt động

bàn giao

Thêm mã cuối cùng và hình ảnh cuối cùng của bạn vào PDF và gửi nó tới Gradescope. có nhiệt độ. tex tại đây—đối với phòng thí nghiệm, không cần cung cấp bản ghi chi tiết

Chủ Đề