Eksik bir RGB kanalını yeniden oluşturma


11

RGB kanallarından biri çıkarılmış olan bu doğal sahnelerin fotoğraflarına bakın:

kırmızı olmayan pastoral bir orman

Kaynak (kırmızı ile): https://en.wikipedia.org/wiki/File:Altja_j%C3%B5gi_Lahemaal.jpg

yeşil olmayan bir Antarktika kıyısı

Kaynak (yeşil ile): https://commons.wikimedia.org/wiki/File:2007_mather-lake_hg.jpg

mavi olmayan bir kızıl tilki

Kaynak (mavi ile): https://commons.wikimedia.org/wiki/File:Fox_01.jpg

Kanallardan biri olmasa bile, muhtemelen bazı şeylerin hangi renklerde olması gerektiğini belirleyebilir veya en azından eksik kanalın yeniden yapılandırılması doğru ise iyi bir fikre sahip olabilirsiniz.

Örneğin, üzerine kırmızı bir kanal eklenmiş ilk resim: bu sadece rastgele bir gürültü:

gürültü eklenmiş fotoğraf 1

Bu görüntü açıkça kırmızı kanalın doğru bir şekilde yeniden yapılandırılması değildir. Çünkü doğa fotoğrafları genellikle tüm RGB spektrumunu kullanmaz, sadece "doğal görünen renklerin" bir alt kümesini kullanır. Ayrıca, kırmızı tonları diğerleriyle ilişkili bazı degradeleri takip edecektir.


Göreviniz, bir kanalı kaldırılmış bir fotoğrafı çekecek ve eksik kanal olduğuna inandığı şeyi yeniden yapılandırarak orijinal görüntüyü mümkün olduğunca yakınlaştırmaya çalışacak bir program oluşturmaktır.

Programınız, o kanalın değerleri orijinal görüntüdeki gerçek değerin ± 15 (dahil) içindeki piksel yüzdesini (değerlerin standart 8 bit renk kanalında olduğu gibi 0 ila 255 arasındadır).

Programınızın puanlanacağı test senaryolarını burada bulabilirsiniz (9.04 MB zip dosyası, 6 resim). Şu anda sadece yukarıdaki üç örnek resmi ve orijinallerini içeriyor, ancak bunları tamamladıktan sonra tam paketi yapmak için birkaç tane daha ekleyeceğim.

Her görüntü ölçeklendirilir ve 1024 x 768 boyutuna kırpılır, böylece puanınızda aynı ağırlığa sahip olurlar. Verilen tolerans dahilinde en fazla pikseli tahmin edebilen program kazanır.


1
Python'da bir puanlama programı yazabilir misiniz?
orlp

Yarın buna geleceğim. Şimdi yatağa gitmem gerek.
Joe Z.

Programın çalışma süresinde bir sınır var mı?
Lause

@Lause Sınır, programın gerçekten çıktı üretme sabrınızdır.
Joe Z.

Yanıtlar:


17

Python 3 + scikit görüntüsü

Eksik kanalın rengini diğer ikisinin ortalamasına ayarlar.

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)

Ve geri yüklenen görüntüler:

orman tilki buzlu


3
diğer ikisinin ortalama - görünüşe göre çok daha doğru (öznel olarak) tahmin ediyorum. +1.
Dijital Travma

2
Uzun zaman önce elle boyanmış dagerreyotipleri anımsatıyorlar. Çok hoş. +1

6

Lua, Aşk2D

Eksik kanalı kalan iki kanaldan daha küçük olanına ayarlar.

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

Komut satırında dosya adını bağımsız değişken olarak alır.

Orman Tilki Kar

Bonus

Eksik kanalı 255- (a + b) değerine ayarlamaya çalıştım. "Boşluğu doldurmak". Sonuçlar işe yaramaz ama görkemli.

Forrest Kırmızı Çamurcun Tilki Sarı Mavi Kar Mor Yeşil

255- (a + b) / 2 ile

Orman Kırmızı Mavi Sıkıcı Fox Sarı Mavi Sıkıcı Kar Mor Yeşil Sıkıcı


Görüntüler diğer cevaba göre daha gerçekçi görünüyor. İyi iş! Merakla, bunun yerine 255- (a + b) / 2 yaparsanız (kenetlemeye gerek yok) ne olur?
ETHproductions 21:16

Sonuçlar, yukarıda yayınlananların daha az doygun bir halidir. Onları kıkırdamaların cevabına ekleyeceğim.
ATaco

Aslında kıkırdayarak yaptım. Teşekkür ederim.
Gabriel Benamy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.