Реконструюйте відсутній канал 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-бітовому кольоровому каналі).

Тестові приклади, на які буде набрана ваша програма, можна знайти тут (zip-файл 9,04 МБ, 6 зображень). Наразі він містить лише три приклади вище зображень та їх оригінали, але я додаю ще кілька пізніше, щоб зробити повний набір, як тільки я їх зробив.

Кожне зображення зменшується і обрізається до 1024 х 768, тож вони матимуть однакову вагу у вашій оцінці. Виграє програма, яка може передбачити найбільше пікселів у межах заданого допуску.


1
Чи можете ви написати програму підрахунку балів, наприклад, в Python?
orlp

Я доберусь до цього завтра. Зараз мені потрібно лягати спати.
Джо З.

Чи є обмеження на час виконання програми?
Лауза

@Lause Межа полягає у вашому терпінні, щоб програма фактично отримала вихід.
Джо З.

Відповіді:


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.
Цифрова травма

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

Результати є менш насиченою версією викладених вище. Я додам їх у відповідь за хихикання.
Атако

Я, власне, хихикав. Дякую.
Габріель Бенамі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.