重建丢失的RGB通道


11

看一下这些自然场景的照片,并从其中取出RGB通道之一:

没有红色的田园诗般的森林

来源(红色):https : //en.wikipedia.org/wiki/File : Altja_j%C3%B5gi_Lahemaal.jpg

没有绿色的南极海岸

来源(绿色):https : //commons.wikimedia.org/wiki/File : 2007_mather-lake_hg.jpg

没有蓝的红狐狸

来源(蓝色):https : //commons.wikimedia.org/wiki/File : Fox_01.jpg

即使没有其中一个通道,您也可以确定某些事物应该是什么颜色,或者如果丢失通道的重建准确无误,至少可以有个好主意。

例如,这是第一张添加了红色通道的图片,它只是随机噪声:

照片1添加了噪点

该图像显然不是红色通道的准确重建。这是因为自然照片通常不使用整个RGB光谱,而仅使用“看起来自然的颜色”的子集。同样,红色阴影将遵循与其他阴影相关的特定梯度。


您的任务是构建一个程序,该程序将拍摄已删除一个通道的照片,并尝试通过重建它认为丢失的通道来尽可能接近原始图像。

通过计算该通道的值在原始图像中的实际值的±15(含)以内的像素百分比,您的程序将在缺失通道与原始图像的通道匹配度上得分范围从0到255,如在标准的8位彩色通道中)。

可以在此处找到对您的程序进行评分的测试用例(9.04 MB压缩文件,6张图像)。目前,它仅包含上面的三个示例图像及其原始图像,但是一旦完成,我将在后面再添加一些图像来制作完整的套件。

每张图像都按比例缩小并裁剪为1024 x 768,因此它们在您的乐谱中的权重相同。可以预测给定公差内最多像素的程序将获胜。


1
您可以编写评分程序,例如用Python吗?
奥尔普

我明天再说。现在我要去睡觉
乔Z。

程序的运行时间是否有限制?
劳斯

@Lause限制是您对程序实际产生输出的耐心。
JoeZ。16年

Answers:


17

Python 3 + scikit图像

只需将缺失通道的颜色设置为其他两个通道的平均值即可。

import sys
from skimage import io, color

im = io.imread(sys.argv[1])
h, w, c = im.shape

removed_channel_options = {0, 1, 2}
for y in range(h):
    for x in range(w):
        if len(removed_channel_options) == 1: break
        removed_channel_options -= {i for i, c in enumerate(im[y][x]) if c > 0}
removed_channel = removed_channel_options.pop()

for y in range(h):
    for x in range(w):
        p = [float(c) / 255 for c in im[y][x][:3]]
        p = [sum(p)/2 if i == removed_channel else p[i]
             for i in range(3)]
        im[y][x] = [int(c*255) for c in p] + [255]*(c == 4)

io.imsave(sys.argv[2], im)

和还原的图像:

森林 狐狸 冰冷的


3
其他两个的平均值 -显然(主观上)比我猜想的要准确得多。+1。
Digital Trauma

2
它们使人联想起很久以前的手工着色的双色刻板印象。非常好。+1

6

Lua,Love2D

只需将缺少的通道设置为其余两个通道中较小的一个即可。

local inp = love.image.newImageData(arg[2])

local channels = {1, 2, 3}
local removed = nil
local removed_options = {true,true,true}

inp:mapPixel(function(x,y,r,g,b)
    local o = {r,g,b}
    for k,v in pairs(o) do
        if v > 0 then
            removed_options[k] = false
        end
    end
    return r,g,b
end)

for k,v in pairs(removed_options) do
    if v then
        removed = k
        break
    end
end
inp:mapPixel(function(x,y,r,g,b)
    local o = {r,g,b}
    o[removed] = math.min(o[removed%3+1], o[(removed+1)%3 + 1])
    return unpack(o)
end)

inp:encode('png', IMAGE:gsub("%.png", "2.png"))

在命令行上使用文件名作为参数。

森林 狐狸 雪

奖金

我尝试将缺少的通道设置为255-(a + b),以固定值。至于“填补空白”。结果是无用的,却光荣的。

福雷斯特红蓝绿色 狐狸黄蓝色 雪紫绿色

和255-(a + b)/ 2

森林红青色无聊 狐狸黄蓝无聊 雪紫绿无聊


这些图像看起来比其他答案更加真实。做得好!出于好奇,如果改用255-(a + b)/ 2(不需要钳位)会发生什么?
ETHproductions

结果是上面发布的结果的较不饱和版本。我会将它们添加到傻笑的答案中。
ATaco

我确实笑了。谢谢。
加布里埃尔·贝纳米
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.