Tái tạo một kênh RGB bị thiếu


11

Nhìn vào những bức ảnh chụp cảnh thiên nhiên này, với một trong những kênh RGB được lấy ra từ chúng:

một khu rừng bình dị không có màu đỏ

Nguồn (có màu đỏ): https://en.wikipedia.org/wiki/File:Altja_j%C3%B5gi_Lahemaal.jpg

một bờ Nam Cực không có màu xanh

Nguồn (có màu xanh lá cây): https : //commons.wik mega.org/wiki/File:2007_mather-lake_hg.jpg

một con cáo đỏ không có màu xanh

Nguồn (có màu xanh): https : //commons.wik mega.org/wiki/File:Fox_01.jpg

Ngay cả khi không có một trong các kênh, bạn có thể tìm ra màu sắc nhất định của những thứ nhất định hoặc ít nhất là có ý tưởng hay nếu việc xây dựng lại kênh bị thiếu là chính xác.

Ví dụ, đây là hình ảnh đầu tiên có kênh màu đỏ được thêm lại vào đó chỉ là nhiễu ngẫu nhiên:

ảnh 1 có thêm nhiễu

Hình ảnh này rõ ràng không phải là một bản dựng lại chính xác của kênh màu đỏ. Điều này là do các bức ảnh thiên nhiên thường không sử dụng toàn bộ phổ RGB mà chỉ là một tập hợp con của "màu sắc trông tự nhiên". Ngoài ra, các sắc thái của màu đỏ sẽ theo độ dốc nhất định tương quan với các màu khác.


Nhiệm vụ của bạn là xây dựng một chương trình sẽ chụp một bức ảnh đã bị xóa một kênh và cố gắng xấp xỉ hình ảnh gốc càng gần càng tốt bằng cách tái tạo lại những gì nó tin là kênh bị thiếu.

Chương trình của bạn sẽ được ghi điểm về mức độ phù hợp của kênh bị thiếu với kênh của hình ảnh gốc, bằng cách đếm tỷ lệ phần trăm pixel có giá trị của kênh đó nằm trong phạm vi ± 15 (đã bao gồm) giá trị thực trong ảnh gốc (trong đó các giá trị phạm vi từ 0 đến 255 như trong kênh màu 8 bit tiêu chuẩn).

Các trường hợp thử nghiệm mà chương trình của bạn sẽ được ghi vào đây có thể được tìm thấy ở đây (tệp zip 9.04 MB, 6 hình ảnh). Hiện tại nó chỉ chứa ba hình ảnh ví dụ ở trên và bản gốc của chúng, nhưng tôi sẽ thêm một vài cái sau để tạo bộ đầy đủ sau khi tôi đã thực hiện chúng.

Mỗi hình ảnh được thu nhỏ lại và cắt thành 1024 x 768, vì vậy chúng sẽ có cùng trọng số trong điểm số của bạn. Chương trình có thể dự đoán hầu hết các pixel trong phạm vi dung sai đã cho sẽ thắng.


1
Bạn có thể viết một chương trình cho điểm, ví dụ như trong Python?
orlp

Tôi sẽ đến đó vào ngày mai. Ngay bây giờ tôi cần đi ngủ.
Joe Z.

Có giới hạn thời gian chạy của chương trình không?

@ Nguyên nhân Giới hạn là sự kiên nhẫn của bạn để chương trình thực sự tạo ra đầu ra.
Joe Z.

Câu trả lời:


17

Python 3 + hình ảnh scikit

Đơn giản chỉ cần đặt màu của kênh bị thiếu thành trung bình của hai kênh còn lại.

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)

Và những hình ảnh được khôi phục:

rừng cáo băng giá


3
trung bình của hai người kia - rõ ràng chính xác hơn (chủ quan) nhiều hơn tôi tưởng. +1.
Chấn thương kỹ thuật số

2
Chúng gợi nhớ đến những con daguerreotypes được nhuộm màu từ lâu. Rất đẹp. +1

6

Lua, Love2D

Chỉ cần đặt kênh bị thiếu thành nhỏ hơn trong hai kênh còn lại.

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

Lấy tên tệp làm đối số trên dòng lệnh.

rừng cáo Tuyết

Tặng kem

Tôi đã thử đặt kênh bị thiếu thành 255- (a + b), kẹp giá trị. Như để "điền vào chỗ trống". Kết quả là vô ích nhưng vinh quang.

Teal đỏ Cáo vàng xanh Tuyết tím xanh

Và với 255- (a + b) / 2

Rừng đỏ Cyan nhàm chán Fox màu xanh nhàm chán Tuyết tím xanh nhàm chán


Các hình ảnh trông thậm chí còn thực tế hơn các câu trả lời khác. Bạn đã làm rất tốt! Vì tò mò, điều gì xảy ra nếu bạn thực hiện 255- (a + b) / 2 thay vào đó (không cần kẹp)?
Sản phẩm ETH

Kết quả là một phiên bản ít bão hòa hơn của những người được đăng ở trên. Tôi sẽ thêm chúng vào câu trả lời cho những tiếng cười khúc khích.
ATaco

Tôi đã làm, trên thực tế, cười khúc khích. Cảm ơn bạn.
Gabriel Benamy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.