欠落しているRGBチャネルを再構築する


11

これらの自然シーンの写真を見てください。RGBチャネルの1つが取り出されています。

赤のないのどかな森

ソース(赤):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つもない場合でも、特定の色がどのような色であるかがわかるか、少なくとも、欠落しているチャネルの再構築が正確である場合は良い考えが得られます。

たとえば、次は、ランダムノイズである赤いチャネルが追加された最初の画像です。

ノイズが追加された写真1

この画像は明らかに赤チャンネルを正確に再現したものではありません。これは、自然の写真は通常、RGBスペクトル全体を使用するのではなく、「自然に見える色」のサブセットのみを使用するためです。また、赤の色合いは、他の色と相関する特定のグラデーションに従います。


あなたの仕事は、1つのチャネルが削除された写真を撮るプログラムを構築し、失われたチャネルであると考えられるものを再構築することによって、元の画像にできるだけ近づけることを試みることです。

プログラムは、そのチャネルの値が元の画像の実際の値(ここで値が標準の8ビットカラーチャネルと同様に、0〜255の範囲です。

あなたのプログラムが採点されるテストケースはここにあります(9.04 MBのzipファイル、6つの画像)。現在、上記の3つのサンプル画像とそのオリジナルのみが含まれていますが、後でいくつか追加して、完成したら完全なスイートを作成します。

各画像は1024 x 768に縮小およびトリミングされるため、スコアの重みは同じになります。指定された許容範囲内のほとんどのピクセルを予測できるプログラムが優先されます。


1
例えばPythonで採点プログラムを書いてもらえますか?
orlp 2016年

明日行きます。今、私は寝なければなりません。
Joe Z. 2016年

プログラムの実行時間に制限はありますか?
2016年

@Lause制限は、プログラムが実際に出力を生成するための忍耐力です。
Joe Z.

回答:


17

Python 3 + scikit-image

不足しているチャネルの色を他の2つのチャネルの平均に設定するだけです。

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
他の2つの平均 -私が推測したよりも明らかに(主観的に)より正確です。+1。
デジタルトラウマ2016年

2
それらは、はるか昔の手で着色したダゲレオタイプを連想させます。非常に素晴らしい。+1

6

Lua、Love2D

不足しているチャネルを残りの2つのチャネルのうち小さい方に設定するだけです。

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 2016年

結果は、上記に投稿されたものの飽和度の低いバージョンです。笑いの答えに追加します。
ATaco

実際、私は笑いました。ありがとうございました。
Gabriel Benamy 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.