컬러 그래프 합산


9

경우에 따라 물리학에서 종종 그래프를 합산해야합니다. 문제는 선택한 언어로 여러 그래프를 이미지로 가져 와서 가능한 모든 합계를 계산하고 결과를 출력하는 프로그램 또는 함수를 작성하는 것입니다.

그래프

그래프는 rgb(255, 255, 255)각 열에 흰색이 아닌 픽셀이 있는 흰색 ( ) 배경 이 포함 된 이미지입니다 . 예 :

예제 그래프 예제 그래프 예제 그래프

스크립트의 값은 컬러 픽셀의 Y 위치로 표시됩니다. 특정 X 좌표의 값은 해당 열에서 가장 높은 색상의 픽셀의 Y 위치와 동일하며 좌표는 왼쪽 하단에서 0부터 시작합니다. 미학적 이유로 해당 픽셀 아래에 추가 컬러 픽셀이있을 수도 있고 없을 수도 있습니다.

직무

작업은 선택한 언어로 여러 그래프를 이미지로 가져 와서 가능한 모든 2^n - 1합계를 계산 하고 결과를 출력 하는 프로그램 또는 함수를 작성 하는 것입니다.

그래프의 합은 각 열의 값이 각 입력 그래프에서 해당 열의 값의 합과 같은 그래프입니다.

그래프는 여러 색상으로 나타납니다. 결과 이미지에는 원래 그래프를 포함하지만 0 합계를 제외한 다른 그래프와 같이 가능한 모든 그래프 합계가 포함되어야합니다.

각각의 합계의 색은, 예를 들면 색의 그래프, 그래프에 포함 된 색상의 평균 결정 rgb(255, 0, 255)rgb(0, 255, 255)의 그래프를 생성 할 rgb(128, 128, 255)(둥글게 또한 아래 일 수있다).

결과 이미지는 모든 그래프에 맞도록 필요한만큼 높아야합니다. 즉, 입력보다 큰 이미지를 출력해야 할 수도 있습니다.

결과 그래프가 결과 이미지에 그려지는 순서는 중요하지 않습니다. 즉, 결과 그래프가 겹치는 경우 어떤 그래프가 위에 있는지 선택할 수 있지만 색상 조합이 아닌 그래프 중 하나 여야합니다.

입력 이미지의 너비가 같고 이미지의 모든 열에 하나 이상의 흰색이 아닌 픽셀이 있고 이미지의 높이 (출력 포함)가 4096 픽셀 미만이라고 가정 할 수 있습니다.

입력 A :

예 그래프 a

입력 B :

예 그래프 b

출력 예 :

그래프 합계 예

(누군가 관심이있는 경우 무작위 회사의 주식 차트에서 이러한 데이터를 복사하여 붙여 넣었습니다. 이것이 현실적인 데이터를 CSV로 얻는 첫 번째 방법이었습니다.)

규칙

  • 비트 맵 이미지 입력 ​​파일 형식을 선택할 수 있습니다.
  • 비트 맵 이미지 출력 파일 형식을 선택할 수 있으며 입력과 일치하지 않아도됩니다.
  • 이미지 처리 라이브러리를 사용할 수 있지만이 작업을 직접 완료하는 기능은 모두 금지됩니다.
  • 표준 허점이 적용됩니다.
  • 이것은 바이트 단위의 가장 짧은 코드가 승리합니다.

그래프 생성기 스크립트

다음은 그래프를 생성하는 Python 2 스크립트입니다. 입력은 라인으로 제공되며, 첫 번째 세 라인은 RGB 색상으로, 나머지는 데이터로 EOF로 종료됩니다.

import PIL.Image as image
import sys

if len(sys.argv) < 2:
    sys.stderr.write("Usage: graphgen.py <outfile> [infile]")
    exit(1)
outfile = sys.argv[1]
if len(sys.argv) > 2:
    try:
        stream = open(sys.argv[2], "r")
        data = stream.read()
        stream.close()
    except IOError as err:
        if err.errno == 2:
            sys.stderr.write("File \"{0}\" not found".format(sys.argv[2]))
        else:
            sys.stderr.write("IO error {0}: {1}".format(err.errno, err.strerror))
        exit(1)
else:
    data = sys.stdin.read()

try:
    items = map(int, data.strip().split("\n"))
    red, green, blue = items[:3]
    items = items[3:]
    highest = max(items)
except (ValueError, TypeError, IndexError):
    sys.stderr.write("Invalid value(s) in input")

img = image.new("RGB", (len(items), highest + 1), (255, 255, 255))

prev = items[0]
img.putpixel((0, highest - items[0]), (red, green, blue))
for x, item in enumerate(items[1:]):
    img.putpixel((x + 1, highest - item), (red, green, blue))
    if item < prev:
        for i in range(item + 1, prev):
            img.putpixel((x, highest - i), (red, green, blue))
    else:
        for i in range(prev + 1, item):
            img.putpixel((x + 1, highest - i), (red, green, blue))
    prev = item

img.save(outfile, "png")

@ MartinBüttner 저는 현재 두 개의 그래프 중 하나를 만들고 있습니다. 손으로 직접 작성하고 있으므로 (참조 impl 없음) 3에 대한 인내심이 있는지 모르겠습니다. 또한 내가 준 세 가지는 너비가 다르기 때문에 합산 할 수 없습니다.
PurkkaKoodari

n입력 그래프 가 있다면 2^n - 1출력 이미지에 선이 있습니까?
Peter Taylor

@PeterTaylor 예.
PurkkaKoodari

출력에 실제로 세로 줄이 필요하지 않습니까? 각 열의 최상위 픽셀 만?
Martin Ender

@ MartinBüttner 첫 번째 섹션에서 정의한대로 데이터를 그래프로 파싱 할 수 있기 때문에 맞습니다.
PurkkaKoodari

답변:


3

MATLAB, 405

통해 전화 : f('http://i.stack.imgur.com/ffCzR.png','http://i.stack.imgur.com/zHldg.png')

function f(varargin)
for k=1:nargin
i=im2double(imread(varargin{k}))
V(k,:)=size(i,1)-cellfun(@(V)find(any(V~=1,3),1),num2cell(i,[1,3]))
C(k,:)=i(find(any(i(:,1,:)~=1,3),1),1,:)
end
s=2^nargin-1
G=dec2bin(1:s)-'0'
C=bsxfun(@rdivide,G*C,sum(G,2))
V=G*V
m=max(V(:))
r=ones(m+1,size(V,2))
g=r
b=r
for i=1:s
M=bsxfun(@eq,(m:-1:0).',V(i,:))
r(M)=C(i,1)
g(M)=C(i,2)
b(M)=C(i,3)
end
imwrite(cat(3,r,g,b),'S.png')

4

파이썬, 422

커맨드 라인에서 호출 python plotsum im1.png im2.png im3.png

import sys
from numpy import*
from scipy import misc as m
R=m.imread
r=range
a=array
N=sys.args[1:]
L=len(N)
P=[map(argmin,R(n,1).T)for n in N]               #converts image to list of heights, counting from the top
C=a([R(N[i])[P[i][0],0,:]for i in r(L)])         #finds and stores the colour
P=a([len(R(N[i]))-a(P[i])for i in r(L)])         #flips the numbers, measures actual heights from bottom
w=len(P[0])
h=max(sum(P,0))+1                                    #compute dimensions
G=ones((h,w,3))*255                                  #and make a white grid
for i in r(1,2**L):
 z=where(a(list(bin(i)[2:].zfill(L)))=='1');y=sum(P[z],0)    #sum the graphs
 for x in r(w):G[y[x],x,:]=average(C[z],0)                   #average the colours
m.imsave('S.png',G[::-1])                            #flip image vertically and save

출력 예
여기에 이미지 설명을 입력하십시오
다른 예
여기에 이미지 설명을 입력하십시오

그것은 까다로운 하나의 고차원 배열 연산이며 배열을 인덱스로 사용하면 여기에 많은 도움이됩니다. Mathematica와 Matlab을 제외하고 1000 바이트 미만의 솔루션을 기대하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.