Làm cách nào để điều chỉnh nhiệt độ màu của hình ảnh theo chương trình?


8

Tôi đang tự hỏi làm thế nào để chuyển đổi lập trình (tức là với ngôn ngữ lập trình chứ không phải trình soạn thảo) từ nhiệt độ màu này sang nhiệt độ màu khác?

Ví dụ, nếu tôi đưa ra giả định (và đó là một giả định lớn) rằng thuật toán cân bằng trắng có thể lấy một hình ảnh được xử lý (ví dụ JPEG, v.v.) và đặt nhiệt độ tổng thể trong một cảnh ở mức 6500, bạn sẽ làm cho thuật toán "mát mẻ" như thế nào "Hoặc" làm ấm "cảnh đến một nhiệt độ cụ thể?

Rõ ràng đây là một hoạt động phổ biến trong một chương trình chỉnh sửa hình ảnh, nhưng chúng thường hoạt động trên các hình ảnh RAW không được xử lý (thao tác không gian màu hoặc cách khác). Trong trường hợp tệp RAW, có lẽ các tệp RAW riêng lẻ chứa đủ thông tin (trong tiêu đề tệp) liên quan đến hiệu chuẩn màu của cảm biến máy ảnh để làm cho việc chuyển đổi nhiệt độ cụ thể trở nên xác định hơn?

Nhân tiện, tôi đã hỏi câu hỏi này trên Stack Overflow thông thường và nó được gợi ý rằng tôi có thể nhận được câu trả lời tốt hơn ở đây.


"[Nhiều] có lẽ các tệp RAW riêng lẻ chứa đủ thông tin (trong tiêu đề tệp) liên quan đến hiệu chuẩn màu của cảm biến máy ảnh để làm cho việc chuyển đổi nhiệt độ cụ thể trở nên xác định hơn?" Đúng. Ví dụ là dành cho thô của Canon, vì vậy vị trí khác một chút cho các thương hiệu khác.
Jari Keinänen

Cảm ơn đó là một liên kết rất hữu ích! Mặc dù tôi vẫn không chắc chắn làm thế nào để thay đổi từ nhiệt độ màu này sang nhiệt độ khác?
Trican

Hình ảnh thô luôn được diễn giải với một số tập lệnh trong đó thông tin Exif về mức độ RGGB cân bằng trắng là một khía cạnh. Lần lượt JPG là hình ảnh tổng hợp ít nhiều trong đó tất cả thông tin được mã hóa cứng và các chỉnh sửa bị phá hủy. Tôi không thể cung cấp các ví dụ hay, nhưng tôi đã đi sâu vào ImageMagick , một trình chỉnh sửa hình ảnh dòng lệnh với một số giao diện chương trình. -color-matrixTùy chọn của nó có thể giúp bạn bắt đầu; xem thêm: fmwcon accept.com/imagemagick/whitebalance/index.php
Jari Keinänen

Anh chàng trả lời chồng tràn trả lời đúng nhưng ít chi tiết hơn. Ông đề xuất một ma trận tương đương về mặt toán học với mức tăng trên mỗi kênh của các giá trị đường chéo là 0.
agf1997

Câu trả lời:


6

Bạn sẽ cần thực hiện chuyển đổi điểm trắng không gian màu trong không gian L * a * b *. Hầu hết các mô hình màu mà chúng ta thường làm việc với, chủ yếu là RGB nhưng thường là CMYK, được thiết kế để hỗ trợ các giới hạn và yêu cầu của phần cứng vật lý. Tuy nhiên, những mô hình đó thường không đại diện cho không gian màu "cảm nhận" rất tốt, và điểm trắng chắc chắn là một khía cạnh cảm nhận của màu sắc.

Bất cứ khi nào bạn cần áp dụng các điều chỉnh nhận thức cho hình ảnh, chẳng hạn như nhiệt độ màu hoặc thay đổi sắc độ, tốt nhất là thực hiện bằng cách chuyển đổi từ RGB sang XYZ và trong quá trình chuyển đổi, bạn có thể áp dụng "điểm trắng tham chiếu" cho không gian màu nguồn và đích . Chuyển đổi từ XYZ sang Lab sau đó đưa bạn vào một không gian màu nơi bạn có thể cảm nhận lại điểm trắng và tất cả các màu sao cho chúng duy trì liên tục.

Chuyển đổi không gian màu, thích ứng màu sắc, điều chỉnh điểm trắng, v.v ... khá phức tạp về mặt toán học. Bạn càng có ý định chính xác về mặt nhận thức, thì toán học thường càng phức tạp hơn. Một nguồn thông tin tuyệt vời cho chuyển đổi không gian màu có thể được tìm thấy tại trang web của Bruce Lindbloom . Một số thông tin hữu ích bổ sung có thể được tìm thấy trên Wikipedia . Bạn cũng có thể thấy thông tin này trên Đèn chiếu sáng D-Series của CIE hữu ích, vì nó chứa thông tin, tính toán và hằng số cụ thể của điểm trắng.


Không cần phải đến một không gian tri giác như CIELAB để thực hiện cân bằng trắng cho phơi sáng cảnh như những gì được tìm thấy trong dữ liệu máy ảnh RAW. Cân bằng trắng là thay đổi phơi sáng trên mỗi kênh trong không gian phơi sáng cảnh tuyến tính. Thích ứng màu sắc được sử dụng để điều chỉnh hình ảnh dựa trên trạng thái thích nghi của người xem giả định với chất chiếu sáng. Điều này cũng được thực hiện như một mức tăng nhưng trong không gian phản hồi hình nón (LMS), đó là lý do tại sao nó sẽ tạo ra một kết quả hợp lý.
agf1997

Cần lưu ý để chuyển từ RAW cameraRGB sang XYZ và cuối cùng CIELAB người ta phải trải qua một ma trận đặc trưng đã được tối ưu hóa với một bộ giải. Các giá trị cameraRGB phải được cân bằng trắng đúng cách để phép biến đổi ma trận này thành XYZ chính xác một cách hiệu quả đòi hỏi phải thực hiện cân bằng trắng trong không gian phơi sáng cảnh tuyến tính.
agf1997

1
Tôi sẽ nói bạn nên đưa nó vào câu trả lời, nhưng tôi thấy bạn đã làm rồi. Cảm ơn cho những hiểu biết, mặc dù! Tôi đã không biết điều này có thể được thực hiện đơn giản như vậy.
jrista

4

Cân bằng trắng là một thao tác xử lý hình ảnh rất thẳng về phía trước. Nó chỉ là mức tăng trên mỗi kênh trong không gian RGB tuyến tính. Các tệp JPG là tối ưu phụ để thực hiện cân bằng trắng vì chúng thường có cả đường cong âm sắc và màn hình nghịch đảo Chức năng biến đổi quang điện tử (EOTF) được áp dụng phá vỡ mối quan hệ tuyến tính với các giá trị độ chói của cảnh. Đây là lý do tại sao nó thường được thực hiện bắt đầu với dữ liệu RAW. Nếu bạn có thể nhận được các giá trị RGB tuyến tính thông qua dữ liệu RAW hoặc bằng cách đảo ngược tính phi tuyến tính được mô tả ở trên, bạn có thể cân bằng trắng bằng cách áp dụng cách sau.

R_out = R_in * R_gain
G_out = G_in
B_out = B_in * B_gain

Lưu ý, đó là quy ước không áp dụng mức tăng cho kênh màu xanh lá cây vì nó gần như liên quan đến độ chói và việc thay đổi cả ba kênh cũng sẽ làm thay đổi độ phơi sáng tổng thể.

Thường có một trường siêu dữ liệu trong các tệp RAW chứa một tập hợp mức tăng cân bằng trắng được máy ảnh tính toán bằng thuật toán tích hợp. Các thuật toán này thường dựa trên một số dạng thuật toán ước lượng ánh sáng không đổi màu.

Khi mức tăng được áp dụng một ma trận chính mã hóa, đường cong tái tạo âm đích và EOTF nghịch đảo sẽ được áp dụng.


Tôi tò mò làm thế nào một người có thể thực hiện cân bằng trắng giống như được thực hiện với Lightroom, nơi bạn có nhiệt độ màu cũng như màu sắc. Hai thanh trượt này thẳng hàng hoàn hảo với hai trục không gian Lab phẳng, cũng như với công thức điều chỉnh điểm trắng dựa trên CIE có thể tìm thấy trực tuyến. Có thể kiểm soát nhiệt độ màu và màu riêng biệt với loại đơn giản này? Có phải đó chỉ là một số tính toán khác để xác định R_gain và B_gain?
jrista

@jrista Nhiệt độ màu và giá trị màu được sử dụng để xác định màu sắc. Màu sắc đó được chuyển đổi trở lại thành một tập hợp các hệ số khuếch đại R, G và B được sử dụng cho cân bằng trắng trong không gian phơi sáng cảnh.
agf1997

2

Tôi đã có một bức ảnh tuyệt vời về một người phụ nữ tôi chụp dưới ánh sáng kỳ lạ, phức tạp (đèn hơi natri và đèn hơi thủy ngân). Nụ cười tuyệt vời, sự tập trung hoàn hảo, hình ảnh tuyệt vời ngoại trừ cách, màu sắc.

Tôi đã sử dụng temp / tint trong một giờ trong adobe Camera Raw mà không có kết quả tốt. Tôi đã viết một chương trình để hack tệp XMP sidecar thay đổi nhiệt độ và sau đó tạo một liên kết tượng trưng đến NEF ban đầu có tên song song với tệp XMP.

Điều này KHÔNG gần như là lạ mắt cũng như không đúng về mặt kỹ thuật như câu trả lời ở trên, mà thay vào đó, ném một lượng lớn CPU vào vấn đề và mang lại một số kết quả thú vị (có thể).

Điều này tạo ra một loạt các liên kết tệp .NEF và một tệp sidecar .XMP thực cho mỗi liên kết. Chỉ cần sao chép một tập hợp tệp nef / xmp thực để sao chép vào thư mục thử nghiệm và đặt temp / max temp và Dif_temp (Kelvins giữa các bản sao). Một vòng lặp khác có thể được chèn để thay đổi giá trị màu ở một hằng số Kelvin nhưng các tệp được tạo sẽ được nhân với số lượng sắc độ.

Chạy tệp Photoshop -> script -> image_ Processor, trỏ nó vào thư mục này và nó sẽ tạo ra một tif / jpg / bất cứ thứ gì cho mỗi liên kết ở temp màu đã cho.

Mã này là một Hack bẩn, Xấu xí và chạy nó có thể sẽ làm tan chảy bộ xử lý của bạn trong khi thu hút bóng sét và những con ong sát thủ đến ngay gần đó. Không bảo hành đi mà không nói.

Yêu cầu Perl (chắc chắn được sử dụng hàng ngày) và mklink (có thể có mặt).

sub color_temp_experiment()  {
$nef = '6s-2014.1004-237695.acl.nef'; 
$xmp = '6s-2014.1004-237695.acl.xmp';  # crs:Temperature="6000"
$min_temp = 7800;
$max_temp = 9000;
$dif_temp = 200;   # Difference in temp per loop.
$xd = `cat $xmp`;  # Xmp Data;
($base = $nef) =~ s/\.nef//;  # Basename common to both nef and xmp.
$ii = -1;
for($temp = $min_temp; $temp <= $max_temp; $temp += $dif_temp)  {
    $ii++;
    $link = $base . ".$temp" . 'k.nef';  # Abuse Kelvins with lower case.
    $xfn  = $base . ".$temp" . 'k.xmp';  # Abuse Kelvins with lower case.
    if(-f $link)  {
        print("Found FILE (s/b sym link!) $link. Next!\n");  # This prints!
        next;
    }
    $cmd = "mklink $link $nef";
    printf("$ii) Cmd = $cmd\n");
    $sto = `$cmd`;
    unless(-f $link)  {
        print("ERROR! Sym link $link not found!\n StdOut=<<$sto>>\n\n");
        exit;
    }
    ($xt = $xd) =~ s/crs:Temperature="\d+/crs:Temperature="$temp/ms;
    open(O, ">$xfn");
    print(O "$xt");
    close O;
}

}

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.