Chuyển đổi NEF sang jpg Python

Đây là bài đăng đầu tiên của tôi và trong khi tôi viết bài này, tôi đang mắc phải một loại hội chứng trang trống. Nhân dịp khai trương blog này, tôi nghĩ đến nhiều loại chủ đề khác nhau, nhưng cuối cùng tôi quyết định viết về hai niềm đam mê của mình. chụp ảnh kỹ thuật số và lập trình Python. Cho đến nay tôi vẫn đang sử dụng Python cho công việc hàng ngày của mình. nghiên cứu khảo cổ học, thường liên quan đến việc phân tích hình ảnh kỹ thuật số (xem ví dụ trong một trong những bài báo gần đây của chúng tôi). Tuy nhiên, nhiều phương pháp mà tôi đã học được có thể được sử dụng trong việc chỉnh sửa các bức ảnh kỹ thuật số thông thường. Trong bài đăng này, tôi sẽ chỉ cho bạn cách chỉnh sửa tệp RAW gốc từ máy ảnh của mình, xử lý ảnh ở chế độ đen trắng và lưu lại dưới dạng tệp ảnh

Tôi đã chụp bức ảnh này cách đây vài năm bằng một chiếc máy ảnh Nikon D50 cũ mà tôi đã mượn của một người họ hàng. Bức ảnh được chụp ở một trong những rìa của sông Tagus và mô tả một đống đá mà những người chăn cừu sử dụng để xây dựng ở một số phần của cảnh quan chỉ để sử dụng chúng làm điểm định hướng. Mặc dù một số người chăn cừu phủ nhận ý nghĩa đó và nói với tôi rằng có một số tảng đá trong cảnh quan đủ khả năng được đánh dấu bằng dấu hiệu này. Tôi thường chụp ở định dạng RAW, đặc biệt khi làm việc vì nhiều lý do. Vấn đề chính có thể là xử lý hàng loạt tệp, mặc dù nhiều phần mềm chỉnh sửa hình ảnh kết hợp các tùy chọn để xử lý hàng loạt

Tôi đã thử nghiệm rất nhiều ứng dụng mã nguồn mở cho đến khi cuối cùng tôi quyết định sử dụng DCRAW. DCRAW là một công cụ dòng lệnh có thể được gọi từ tập lệnh Python, điều này làm cho nó rất thú vị. Tuy nhiên, tôi đã phát hiện ra rawpy, một trình bao bọc cho thư viện LibRaw. rawpy có thể có tài liệu kém và các tùy chọn hạn chế so với DCRAW, nhưng đủ mạnh để sử dụng không chuyên nghiệp (và thậm chí là chuyên nghiệp). Một lợi thế chính là sự đơn giản của nó. Tôi cũng sẽ sử dụng imageio để xuất kết quả và scikit-image để chỉnh sửa độ phơi sáng. Hãy cài đặt chúng, vì chúng có rất nhiều tùy chọn thú vị. Hãy thử

import rawpy, imageio
import numpy as np
from skimage.exposure import rescale_intensity

raw = rawpy.imread('/home/user1/DSC_0004.NEF')
rgb = raw.postprocess(no_auto_bright=True,use_auto_wb =False,gamma=None)

Tập lệnh ở trên tải tệp NEF (RAW) và chuyển đổi trực tiếp tệp đó thành một mảng có nhiều mảng ở một biểu mẫu khá đơn giản và dễ hiểu. Quá trình này cũng liên quan đến quá trình khử màu tự động của ma trận Bayer. Liên quan đến các tùy chọn, tôi đã quyết định không sửa độ sáng của cân bằng trắng và gamma, vì tôi sẽ chuyển đổi hình ảnh sang B&W. Sự lựa chọn này đặc biệt thú vị đối với việc sử dụng hình ảnh một cách khoa học, chẳng hạn

Vì tôi cũng là một người yêu thích B&W kể từ thời của phòng tối, tôi sẽ xử lý hình ảnh bắt chước sự xuất hiện của phim B&W. Một bộ phim đặc biệt đáng chú ý đối với tôi là Ilford HP5. Tôi thích độ tương phản cao và khía cạnh nổi hạt của hình ảnh. Mặc dù rất khó để bắt chước chính xác các kết quả nhưng tôi sẽ cố gắng xác định các bộ lọc tương tự

Hãy bắt đầu bằng cách chuyển đổi hình ảnh rgb thành B&W. Về mặt tính toán, nó bao hàm việc chuyển đổi một mảng 3d (hình ảnh rgb) thành một mảng duy nhất thu thập thông tin kết hợp từ mỗi kênh từ mảng ban đầu. Có rất nhiều phương pháp và ý kiến, tôi chỉ chọn phương pháp độ sáng, được mô tả ở đây bởi J. Đ. Cook, hợp nhất mọi kênh bằng cách nhân nó với trọng lượng. Tôi nhớ rằng đó là những giá trị mặc định mà Khẩu độ cũ và các giải pháp phần mềm chỉnh sửa hình ảnh khác sử dụng để chuyển đổi RGB sang thang độ xám. Cho nên

bw=(0.21*rgb[:,:,0])+(0.72*rgb[:,:,0])+(0.07*rgb[:,:,0])

Kết quả là một ma trận duy nhất chứa các giá trị B&W mới. Trọng số cho mỗi kênh có thể khác nhau, chẳng hạn như để mô phỏng các bộ lọc của ống kính B&W. Bạn nên xác định trọng số gần đúng cho mỗi bộ lọc

Bây giờ, hãy mô phỏng khía cạnh nhiễu hạt của phim. Tôi sẽ tạo nhiễu với phân phối gaussian nhờ thư viện Numpy và áp dụng nó vào mảng thang độ xám. Giá trị trung bình và sigma trong np. ngẫu nhiên. bình thường có thể được sửa đổi để tạo ra một loại tiếng ồn khác

mean=0
sigma=3
row,col= bw.shape
fnoise = np.random.normal(mean,sigma,(row,col)) + bw

Vâng. Chung tôi đa hiểu. Bạn cũng có thể tìm loại “bộ lọc” tiếng ồn khác. Tôi có thể nhớ rằng OpenCV kết hợp một số tùy chọn

Và bây giờ, tôi sẽ đối chiếu hình ảnh

fnoise=fnoise-fnoise.min()
fnoise[fnoise<38]=0
fnoise=rescale_intensity(fnoise)

Đầu tiên, tôi tăng cường màu đen bằng cách. 1) đặt giá trị thấp nhất của cài đặt thành màu đen (0) và 2) đặt 15% (38) giá trị thấp hơn của hình ảnh kết quả cũng thành màu đen. Đây có thể là một quyết định tùy tiện và chắc chắn có những giải pháp khác hay hơn, nhưng nó hoạt động khá tốt đối với tôi và mô phỏng tốt màu đen thuần khiết từ phim HP5

Tôi phải thú nhận rằng tôi thích hiệu ứng vignette trong ảnh B&W. Theo tôi, trong trường hợp ảnh phong cảnh đen trắng, họa tiết góp phần phân định bầu trời. Tôi đã điều chỉnh bộ lọc từ một ví dụ rất hay

xs = np.arange(row)
ys = np.arange(col)
distance_squared = (xs - row/2.0)[..., np.newaxis] ** 2 \
    + (ys - col/2.0) ** 2
sigma_squared = (row/2) ** 2 + (col/2) ** 2
falloff = np.exp(-distance_squared/sigma_squared)
vignette = fnoise * (falloff*1.5)

Và cuối cùng, hãy ghi kết quả vào định dạng tệp hình ảnh

imageio.imwrite('/home/user1/final.jpg', vignette)

Đây là chi tiết của RAW đã xử lý và hình ảnh cuối cùng

Chuyển đổi NEF sang jpg Python

Tập lệnh có thể được xây dựng lại dưới dạng chức năng Numpy để xử lý hàng loạt một số ảnh RAW. Ưu điểm chính là các bộ lọc bổ sung có thể được thiết kế với các mục đích khác nhau

Chuyển đổi NEF sang jpg Python

Đó là tất cả. Có thể tìm thấy sổ tay IPython và hình ảnh RAW tại đây. Kịch bản hoàn chỉnh và nhận xét được đính kèm bên dưới