Rekonstruksi saluran RGB yang hilang

11

Lihatlah foto-foto pemandangan alam ini, dengan salah satu saluran RGB diambil darinya:

hutan idilis tanpa merah

Sumber (dengan warna merah): https://en.wikipedia.org/wiki/File:Altja_j%C3%B5gi_Lahemaal.jpg

pantai Antartika tanpa hijau

Sumber (dengan warna hijau): https://commons.wikimedia.org/wiki/File:007_mather-lake_hg.jpg

rubah merah tanpa biru

Sumber (dengan warna biru): https://commons.wikimedia.org/wiki/File:Fox_01.jpg

Bahkan tanpa salah satu saluran, Anda mungkin dapat mengetahui warna apa yang seharusnya, atau setidaknya memiliki ide bagus jika rekonstruksi saluran yang hilang akurat.

Sebagai contoh, berikut adalah gambar pertama dengan saluran merah yang ditambahkan kembali ke dalamnya yang merupakan derau acak:

foto 1 dengan noise ditambahkan

Gambar ini jelas bukan rekonstruksi akurat dari saluran merah. Ini karena foto alam umumnya tidak menggunakan seluruh spektrum RGB, tetapi hanya sebagian dari "warna yang tampak alami". Juga, nuansa merah akan mengikuti gradien tertentu yang berkorelasi dengan yang lain.


Tugas Anda adalah membuat program yang akan mengambil foto yang satu salurannya dihapus dan berusaha mendekati gambar aslinya sedekat mungkin dengan merekonstruksi apa yang diyakini sebagai saluran yang hilang.

Program Anda akan dinilai berdasarkan seberapa dekat saluran yang hilang cocok dengan saluran gambar asli, dengan menghitung persentase piksel yang nilainya dari saluran tersebut berada dalam ± 15 (inklusif) dari nilai aktual dalam gambar asli (di mana nilainya berkisar dari 0 hingga 255 seperti pada saluran warna 8-bit standar).

Kasing uji bahwa program Anda akan dinilai dapat ditemukan di sini (file zip 9,04 MB, 6 gambar). Saat ini hanya berisi tiga contoh gambar di atas dan aslinya, tetapi saya akan menambahkan beberapa lagi nanti untuk membuat suite lengkap setelah saya selesai melakukannya.

Setiap gambar diperkecil dan dipotong menjadi 1024 x 768, sehingga memiliki bobot yang sama dalam skor Anda. Program yang dapat memprediksi piksel terbanyak dalam toleransi yang diberikan menang.

Joe Z.
sumber
1
Bisakah Anda menulis program penilaian, misalnya dengan Python?
orlp
Saya akan membahasnya besok. Sekarang aku harus tidur.
Joe Z.
Apakah ada batas waktu runtime program?
Lause
@Lause Batasannya adalah kesabaran Anda terhadap program untuk benar-benar menghasilkan output.
Joe Z.

Jawaban:

17

Python 3 + scikit-image

Cukup atur warna saluran yang hilang ke rata-rata dari dua saluran lainnya.

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)

Dan gambar yang dipulihkan:

hutan rubah dingin

orlp
sumber
3
rata-rata dari dua lainnya - tampaknya jauh lebih akurat (subyektif) daripada yang saya duga. +1.
Trauma Digital
2
Mereka mengingatkan daguerreotypes berwarna tangan dulu. Sangat bagus. +1
6

Lua, Love2D

Atur saja saluran yang hilang ke yang lebih kecil dari dua saluran yang tersisa.

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"))

Mengambil nama file sebagai argumen di baris perintah.

Hutan Rubah Salju

Bonus

Saya mencoba mengatur saluran yang hilang ke 255- (a + b), menjepit nilainya. Seperti untuk "mengisi celah". Hasilnya tidak berguna tetapi mulia.

Forrest Red Teal Fox Yellow Blue Snow Purple Green

Dan dengan 255- (a + b) / 2

Hutan Cyan Merah Membosankan Fox Yellow Blue Boring Snow Purple Green Boring

ATaco
sumber
Gambar terlihat lebih realistis daripada jawaban lainnya. Kerja bagus! Karena penasaran, apa yang terjadi jika Anda melakukan 255- (a + b) / 2 sebagai gantinya (tidak perlu dijepit)?
ETHproduk
Hasilnya adalah versi yang kurang jenuh dari yang diposting di atas. Saya akan menambahkannya ke jawaban untuk cekikikan.
ATaco
Sebenarnya aku terkikik. Terima kasih.
Gabriel Benamy