สร้างช่องสัญญาณ 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 บิต)

กรณีทดสอบที่โปรแกรมของคุณจะได้รับสามารถดูได้ที่นี่ (ไฟล์ซิป 9.04 MB, 6 ภาพ) ขณะนี้มันมีเพียงภาพสามภาพด้านบนและต้นฉบับของพวกเขา แต่ฉันจะเพิ่มอีกไม่กี่นาทีเพื่อสร้างชุดเต็มเมื่อฉันทำเสร็จแล้ว

ภาพแต่ละภาพจะถูกลดขนาดลงและถูกตัดเหลือ 1024 x 768 ดังนั้นภาพเหล่านั้นจะมีน้ำหนักเท่ากันในคะแนนของคุณ โปรแกรมที่สามารถทำนายจำนวนพิกเซลมากที่สุดภายในความอดทนที่กำหนด


1
คุณช่วยเขียนโปรแกรมการให้คะแนนเช่นใน Python ได้ไหม
orlp

พรุ่งนี้ฉันจะไปที่นั้น ตอนนี้ฉันต้องไปนอนแล้ว
Joe Z.

มีการ จำกัด การใช้งานของโปรแกรมหรือไม่?
Lause

@Lause ข้อ จำกัด คือความอดทนของคุณสำหรับโปรแกรมในการสร้างผลลัพธ์จริง
Joe Z.

คำตอบ:


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
Digital Trauma

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

อันที่จริงฉันก็หัวเราะคิกคัก ขอบคุณ.
Gabriel Benamy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.