누락 된 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 (포함) 내에있는 픽셀의 백분율을 계산하여 누락 된 채널이 원본 이미지의 채널과 얼마나 밀접하게 일치하는지 평가합니다. 표준 8 비트 컬러 채널에서와 같이 0에서 255 사이의 범위).

프로그램 점수를 매기는 테스트 사례는 여기 (9.04MB zip 파일, 6 개 이미지) 에서 찾을 수 있습니다 . 현재 위의 세 가지 예제 이미지와 원본 만 포함하고 있지만 나중에 한 번 더 추가하여 전체 제품군을 만들겠습니다.

각 이미지의 크기가 축소되고 1024 x 768로 잘 리므로 점수에서 무게가 동일합니다. 주어진 공차 내에서 가장 많은 픽셀을 예측할 수있는 프로그램이 승리합니다.


1
파이썬과 같은 스코어링 프로그램을 작성할 수 있습니까?
orlp

나는 내일 그에게 갈 것이다. 지금은 잠자리에 들어야합니다.
Joe Z.

프로그램 실행 시간에 제한이 있습니까?
Lause

@Lause 한계는 프로그램이 실제로 출력을 생성하는 인내심입니다.
Joe Z.

답변:


17

파이썬 3 + scikit-image

누락 된 채널의 색상을 다른 두 채널의 평균으로 설정하기 만하면됩니다.

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

나는 실제로 낄낄 거렸다. 감사합니다.
가브리엘 베 나미
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.