几乎所有的数码相机传感器都组织在一个光电传感器网格中。每个光电传感器都对三种原色之一敏感:红色,绿色和蓝色。这些光传感器的组织方式被称为拜耳滤镜,其发明者伊士曼·柯达(Eastman Kodak)的布莱斯·拜耳(Bryce Bayer)。拍摄图像后,四个光电传感器组成最终图像中一个像素的RGB值。您的任务是反转该过程,并根据其像素的滤镜颜色为其着色。为了简单起见,我们将忽略伽马校正。
例如:“常规”正向拜耳过滤器步骤为:
- 潘通蜂蜡色的光线照射到传感器上;
- BGGR(蓝-绿/绿-红)滤镜将其分解为四射线。
- 四个光线照射到传感器上,显示为:81-168/168-235(传感器值范围为0-255);
- 拜耳滤镜将其转换为一个具有颜色(235、168、81)的RGB像素。
反向拜耳过滤器步骤为:
- 颜色(235、168、81)的RGB像素被分为四个具有RGB值的像素:(0,0,81)-(0,168,0)/(0,168,0)-(235,0,0)。
挑战
您应该编写执行以下操作的最短函数或程序:
- 像输入一样获取文件名,然后输出DeBayered图像。
- 输出可以写入文件或显示在屏幕上。
- 输出必须是原始图像宽度的两倍和高度的两倍。
输入图像的每个像素必须根据BGGR(蓝-绿/绿-红)Bayer滤镜模式进行映射,如下图所示:
我们假设两个绿色光电传感器都接收到相同的信号,因此拜耳矩阵中的两个G值都等于RGB图像中的G值。
- 您可能不会返回结果图像的数组表示形式。输出必须是可以显示为图像的图像或文件(任何合适的图像格式)。
例
给定此文件作为输入:
生成的图像应为:
参考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")
记住:这是一个 代码高尔夫球,因此最短的代码获胜!
5
当我滚动时几近癫痫发作
—
Fatalize 2016年
@Fatalize为此感到抱歉!;-)奇怪的效果,不是吗?
—
2016年
指令显示了一个单元格,该单元格
—
Level River St
BG
的顶部和GR
底部分别显示,而示例图像则显示RG
在顶部和GB
底部。这是否意味着可以将两个绿色单元格放在对角线上的任何布置?(其他名称为GB / RG和GR / BG。)
@LevelRiverSt我的意图是遵守BGGR(如第四个挑战项目符号中所述)。如果实际示例图像位于RGGB中,则是我的错误。我将在笔记本电脑上纠正该问题。
—
agtoever
我认为您的示例图片不正确,因为其中一个图片具有怪异的蓝色调
—
orlp