Hầu như tất cả các cảm biến máy ảnh kỹ thuật số được tổ chức trong một mạng lưới cảm quang. Mỗi cảm biến ảnh nhạy cảm với một trong các màu chính : đỏ, xanh lá cây và xanh dương. Cách thức tổ chức các cảm biến ảnh này được gọi là bộ lọc của Bayer , theo tên người phát minh ra nó, Bryce Bayer của Eastman Kodak. Sau khi chụp ảnh, bốn cảm biến ảnh sẽ tạo giá trị RGB của một pixel trong ảnh thu được. Nhiệm vụ của bạn là đảo ngược quá trình đó và tô màu các pixel kết quả theo màu bộ lọc của chúng. Để đơn giản, chúng tôi sẽ bỏ qua điều chỉnh gamma .
Ví dụ: các bước bộ lọc chuyển tiếp "bình thường" của Bayer là:
- một tia sáng với màu sáp ong Pantone chạm vào cảm biến;
- bộ lọc BGGR (Xanh lam - Xanh lục / Xanh lục - Đỏ) phân hủy thành bốn tia.
- Bốn tia chạm vào cảm biến, có nội dung: 81 - 168/168 - 235 (giá trị cảm biến nằm trong khoảng từ 0 - 255);
- Bộ lọc của Bayer dịch điều này thành một pixel RGB có màu (235, 168, 81).
Các bước lọc ngược của Bayer là:
- Pixel RGB có màu (235, 168, 81) được chia thành bốn pixel với các giá trị RGB: (0,0,81) - (0,168,0) / (0,168,0) - (235,0,0).
Thử thách
Bạn nên viết hàm ngắn nhất có thể hoặc chương trình thực hiện như sau:
- Lấy tên tệp như trong đầu vào và xuất hình ảnh DeBayered.
- Đầu ra có thể được ghi vào một tập tin hoặc hiển thị trên màn hình.
- Đầu ra phải gấp đôi chiều rộng và gấp đôi chiều cao của ảnh gốc.
Mỗi pixel của hình ảnh đầu vào phải được ánh xạ theo mẫu bộ lọc Bayer BGGR (Blue - Green / Green - Red) như được giải thích bằng đồ họa trong hình sau:
Chúng ta sẽ giả sử rằng cả hai cảm biến quang màu xanh lục đều nhận được cùng một tín hiệu, vì vậy cả hai giá trị G trong ma trận Bayer đều bằng giá trị G trong hình ảnh RGB.
- Bạn không thể trả về một đại diện mảng của hình ảnh kết quả. Đầu ra phải là một hình ảnh hoặc một tập tin (ở bất kỳ định dạng hình ảnh phù hợp nào ) có thể được hiển thị dưới dạng hình ảnh.
Thí dụ
Cho tệp này làm đầu vào:
Hình ảnh thu được phải là:
Tham khảo thực hiện python:
from PIL import Image
import numpy
import sys
if len(sys.argv) == 1:
print "Usage: python DeByer.py <<image_filename>>"
sys.exit()
# Open image and put it in a numpy array
srcArray = numpy.array(Image.open(sys.argv[1]), dtype=numpy.uint8)
w, h, _ = srcArray.shape
# Create target array, twice the size of the original image
resArray = numpy.zeros((2*w, 2*h, 3), dtype=numpy.uint8)
# Map the RGB values in the original picture according to the BGGR pattern#
# Blue
resArray[::2, ::2, 2] = srcArray[:, :, 2]
# Green (top row of the Bayer matrix)
resArray[1::2, ::2, 1] = srcArray[:, :, 1]
# Green (bottom row of the Bayer matrix)
resArray[::2, 1::2, 1] = srcArray[:, :, 1]
# Red
resArray[1::2, 1::2, 0] = srcArray[:, :, 0]
# Save the imgage
Image.fromarray(resArray, "RGB").save("output.png")
Hãy nhớ rằng: đây là một môn đánh gôn , vì vậy đoạn mã ngắn nhất sẽ thắng!
BG
trên hàng trên cùng và GR
dưới cùng, trong khi hình ảnh ví dụ hiển thị RG
ở trên và GB
dưới cùng. Điều đó có nghĩa là bất kỳ sự sắp xếp nào đặt hai ô màu xanh lá cây trên một đường chéo đều được chấp nhận? (những người khác sẽ là GB / RG và GR / BG.)