Nếu bạn có thể xử lý các tệp RAW, bạn sẽ có một mảng pixel bayer bao gồm các hàng RGRGRG và GBGBGB (hoặc có thể là các hàng RGBGRGBG.) Bạn có thể bỏ qua tất cả các pixel R và B, tổng hợp các pixel G, lấy căn bậc hai ( vì có gấp đôi số pixel màu xanh lục so với màu đỏ hoặc màu xanh) và chia cho một nửa số pixel G. Điều đó sẽ cung cấp cho bạn mức trung bình có trọng số phù hợp cho "màu xanh lá cây" trong ảnh của bạn. Sau đó, bạn có thể lấy trung bình của màu đỏ và màu xanh lam và tính tỷ lệ phần trăm màu xanh lá cây của bạn từ cả ba mức trung bình.
Để chính xác hơn, bạn có thể muốn tính đến trọng số thích hợp cho các pixel cảm biến màu đỏ, xanh lục và xanh lam, vì các cảm biến CMOS có độ nhạy khác nhau đối với từng bước sóng ánh sáng. Các trọng lượng sẽ phụ thuộc vào cảm biến, nói chung. Đó sẽ là cách tiếp cận đơn giản.
Để tính toán việc tạo màu do thời gian trong ngày, nhiều loại ánh sáng nhân tạo, v.v. thì có thể thích hợp hơn để xử lý trước mỗi ảnh trong một công cụ như Lightroom để điều chỉnh cân bằng trắng trước, sau đó thực hiện tính toán của bạn trên ảnh pixel RGB tiêu chuẩn. Không giống như xử lý dữ liệu cảm biến RAW, bạn sẽ muốn tính trọng số của mình dựa trên pixel "độ tinh khiết xanh", thay vì trung bình toàn bộ thành phần màu xanh lá cây. Pixel càng xanh càng tinh khiết thì trọng lượng của nó so với pixel càng nhiều màu đỏ hoặc xanh càng cao. Bình thường hóa cân bằng trắng trước khi xử lý sẽ loại bỏ mọi nhu cầu phức tạp hóa một tính toán khá đơn giản khác với các tiếp tuyến được thiết kế để tính đến các yếu tố có nhiều như mây che, thời gian trong ngày, mùa, v.v.
Bạn vẫn có thể muốn tính đến các vùng lớn các pixel không sự cố, chẳng hạn như bầu trời. Tôi thực sự không thể giúp bạn nhiều trong lĩnh vực đó mà không biết thêm về chính xác những gì bạn đang cố gắng đạt được. Màu xanh lá cây của một "bức ảnh" tổng thể có thể sẽ được phục vụ tốt nhất bằng cách tính tỷ lệ giữa màu xanh lá cây và màu đỏ và màu xanh lam, bao gồm các pixel "bầu trời".
Đối với quy trình của bạn, không cần phải nói rằng nếu bạn chụp ảnh với cùng cài đặt máy ảnh, dưới cùng một vật phát sáng (cùng cường độ và nhiệt độ màu), được đo theo đường cơ sở chung như thẻ màu xám 18%, rõ ràng sẽ đi một chặng đường dài hướng tới bình thường hóa kết quả của bạn. Với kỹ thuật số, mọi sự khác biệt đều có thể được sửa chữa bằng phần mềm xử lý RAW và công cụ chọn cân bằng trắng cơ bản, vì vậy hãy chắc chắn chụp ở định dạng RAW.
Để cung cấp thêm thông tin chi tiết về tính toán "độ xanh" cho ảnh của bạn. Rõ ràng có những cách đơn giản, chẳng hạn như tính toán trọng lượng của các pixel bayer xanh so với xanh dương và đỏ, hoặc tính độ tinh khiết của màu xanh lá cây liên quan đến độ tinh khiết của màu đỏ / xanh lam của các pixel RGB. Bạn có thể gặp nhiều may mắn hơn nếu bạn chuyển đổi sang không gian màu thích hợp hơn, chẳng hạn như HSV ( Hue / Saturation / Value , đôi khi được gọi là HSB, thay thế Giá trị bằng Độ sáng) và tính toán lượng xanh của bạn bằng cách sử dụng đường cong trong không gian HUE. (LƯU Ý: HSL là một loại không gian màu khác nhau và có lẽ sẽ không lý tưởng để tính toán mức độ "xanh" trong ảnh, vì vậy tôi sẽ sử dụng HSV. Bạn có thể tìm hiểu thêm về các không gian màu này tại đây.) Màu xanh lá cây thuần khiết (bất kể độ bão hòa hoặc giá trị) rơi ở góc màu 120 ° và rơi ra từ đó khi bạn di chuyển về phía màu đỏ (ở 0 °) hoặc hướng về màu xanh (ở 240 °). Trong khoảng 240 ° đến 360 °, sẽ không có lượng màu xanh lá cây nào trong một pixel, bất kể độ bão hòa hay giá trị.
Hình 1. Lô đất Huế - Độ tinh khiết xanh ở độ Huế
Bạn có thể điều chỉnh đường cong trọng số thực tế để đáp ứng nhu cầu cụ thể của mình, tuy nhiên một đường cong đơn giản có thể tương tự như sau:
range = 240
period = range * 2 = 240 * 2 = 480
scale = 360/period = 0.75
pureGreen = sin(scale * 120)
Giá trị cho pureGreen
nên là 1.0 . Một công thức tính toán greenness
sau đó có thể được thực hiện như sau:
sin(scale * hue) } 0 > hue > 240
greenness =
0 } 240 <= hue <= 360 || hue == 0
Mức hue
độ màu từ giá trị màu HSV của bạn. Một radius
nửa period
trong đó màu xanh lá cây hiện diện ở một mức độ nào đó. Điều scale
chỉnh đường cong tội lỗi theo thời kỳ của chúng ta, sao cho các sin(scale * hue)
đỉnh (trả về 1.0) chính xác nơi bạn sẽ có màu xanh lục thuần khiết (bỏ qua cường độ xanh lục đó). Vì số lượng greenness
chỉ có giá trị trong nửa đầu của giai đoạn của chúng tôi, phép tính độ xanh chỉ có hiệu lực khi màu sắc lớn hơn 0 ° và nhỏ hơn 240 ° và bằng 0 đối với bất kỳ màu nào khác.
Bạn có thể điều chỉnh trọng số bằng cách điều chỉnh khoảng thời gian, phạm vi mà bạn xác định green
có thể có mặt (thay vì từ 0 đến 240, bạn có thể đặt ràng buộc như 40 > hue > 200
thay vào đó) và xác định bất kỳ thứ gì ngoài phạm vi đó có độ xanh là 0 Cần lưu ý rằng điều này sẽ chính xác về mặt toán học, tuy nhiên nó có thể không hoàn toàn chính xác về mặt nhận thức. Tất nhiên, bạn có thể điều chỉnh công thức để điều chỉnh điểm pure green
hướng về màu vàng nhiều hơn (có thể tạo ra kết quả chính xác hơn về mặt nhận thức), tăng biên độ của đường cong lên cao nguyên và mở rộng dải màu lục thuần thành một dải màu, thay vì một màu giá trị màu sắc, v.v ... Để có độ chính xác về nhận thức của con người, một thuật toán phức tạp hơn được xử lý trong CIE XYZ và CIE L a b *không gian có thể được yêu cầu. (LƯU Ý: Độ phức tạp khi làm việc trong không gian XYZ và Lab tăng đáng kể ngoài những gì tôi đã mô tả ở đây.)
Để tính độ xanh của ảnh, bạn có thể tính độ xanh của từng pixel, sau đó tạo trung bình. Sau đó, bạn có thể lấy thuật toán từ đó và điều chỉnh nó cho các nhu cầu cụ thể của mình.
Bạn có thể tìm thấy các thuật toán để chuyển đổi màu tại EasyRGB , chẳng hạn như thuật toán cho RGB sang HSV:
var_R = ( R / 255 ) // Red percentage
var_G = ( G / 255 ) // Green percentage
var_B = ( B / 255 ) // Blue percentage
var_Min = min( var_R, var_G, var_B ) //Min. value of RGB
var_Max = max( var_R, var_G, var_B ) //Max. value of RGB
del_Max = var_Max - var_Min //Delta RGB value
V = var_Max //Value (or Brightness)
if ( del_Max == 0 ) //This is a gray, no chroma...
{
H = 0 //Hue (0 - 1.0 means 0° - 360°)
S = 0 //Saturation
}
else //Chromatic data...
{
S = del_Max / var_Max
del_R = ( ( ( var_Max - var_R ) / 6 ) + ( del_Max / 2 ) ) / del_Max
del_G = ( ( ( var_Max - var_G ) / 6 ) + ( del_Max / 2 ) ) / del_Max
del_B = ( ( ( var_Max - var_B ) / 6 ) + ( del_Max / 2 ) ) / del_Max
if ( var_R == var_Max ) H = del_B - del_G
else if ( var_G == var_Max ) H = ( 1 / 3 ) + del_R - del_B
else if ( var_B == var_Max ) H = ( 2 / 3 ) + del_G - del_R
if ( H < 0 ) H += 1
if ( H > 1 ) H -= 1
}