Восстановить недостающий канал 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 x 768, поэтому они будут иметь одинаковый вес в вашем счете. Программа, которая может предсказать наибольшее количество пикселей в пределах заданного допуска, побеждает.


1
Не могли бы вы написать скоринговую программу, например, на Python?
orlp

Я доберусь до этого завтра. Прямо сейчас мне нужно идти спать.
Джо З.

Есть ли ограничения на время выполнения программы?
Lause

@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

Луа, 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

Я на самом деле хихикнул. Спасибо.
Габриэль Бенами
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.