数字によるペイント(数字ではなくプログラミングを使用)


56

あなたの仕事は、白黒のアウトライン画像(サンプル画像は下にあります)を取り、それを色で塗りつぶすプログラムを作成することです。各領域をどのように区切るか、どの色で塗りつぶすかはあなた次第です(RNGを使用することもできます)。

例えば:

例1の出力

ご覧のとおり、私は明らかにMSペイントに関して優れた能力を持つアーティストです。


得点

これは人気のコンテストなので、正味の投票数が最も多い答えが勝ちます。投票者は次の方法で回答を判断することが推奨されます

  • 入力基準:白/薄灰色の背景と黒/濃灰色の輪郭で構成される画像
  • 色付けがどれだけうまく行われたか。上記とは異なり、白い領域がほとんどまたはまったくないことを意味します(明らかにクラウドなどに白色を使用する場合を除きます)。
  • 特定のセクションで使用される色のカスタマイズ可能性
  • (さまざまな詳細の)さまざまな画像の範囲でシステムがどれだけうまく機能するか
  • プログラムが画像ごとに要する時間を投稿します。私たちはコードゴルフをしているわけではないかもしれませんが、より短く、より速く、より効率的なコードはより良いとみなされるべきです
  • 新しいイメージを画面またはファイルに出力する必要があります(回答に表示できるように2MB以下)
  • その画像タイプに出力することを選択した理由を正当化し、コードの動作をコメント/説明してください
  • バインドされているそれぞれの形状に使用される色の適用可能性(現実的な配色、つまり草は緑、木製のフェンスは茶色など)

    「各領域をランダムに色付けすることもできますが、「フェンス」を識別して同様に色付けすることができれば、それは賛成に値するものです」-ネイサン・メリル

これ人気コンテストであるため、オプションで次のように判断することもできます。

  • 全体的な魅力(画像の見栄え)
  • 芸術的センス; シェーディングや水彩風の色付けなどでプログラムできる場合

一般に、断食プログラムと最高の一般投票で、最高品質の最小出力画像(ファイルサイズ)が勝ちます。

使用すべきだと思われる他の審査仕様がある場合は、この投稿のコメントでそれらを推奨してください。


私は何も持っていない; サンプル画像はすべてクリエイティブコモンズライセンスのものです。

黒/白の例1 ソース:https 黒/白の例2 : //pixabay.com/ro/stejar-arbore-schi%C5%A3%C4%83-natura-303890/ 黒/白の例3 ソース:http: //www.freestockphotos.biz/stockphoto/10665ソース:http:/ /crystal-rose1981.deviantart.com/art/Dragon-Tattoo-Outline-167320011黒/白の例4 出典:http://jaclynonacloudlines.deviantart.com/art/Gryphon-Lines-PF-273195317 黒/白の例5 出典:http://captaincyprus.deviantart.com /アート/ドラゴン・アウトライン-331748686 黒/白の例6 出典:http://electric-meat.deviantart.com/art/A-Heroes-Farewell-280271639 黒/白の例7 出典:http://movillefacepalmplz.deviantart.com/art/Background-The-Pumpkin -古き良き時代の農場-342865938


編集:黒/白ではないピクセルと黒/白ではなくグレーを含む画像の原因となるラインのアンチエイリアスにより、ボーナスチャレンジとして対処することができます。私の意見では、これは十分に簡単なはずです。


4
みなさんへ:これを「アートコンテスト」として採点/終了しないでください-それ以上のことがあります
-edc65

16
PPCGへようこそ!私はあなたの最初の投稿が挑戦であるだけでなく、ポップコンの挑戦だけでなく、その上に芸術的な挑戦であるという勇気を持っていることを称賛します。幸運を祈ります。あなたに最善を尽くします。
AdmBorkBork

4
@OliverGriffin クロージングに反対しています。また、リンクしてくれた画像に追加しました。必要に応じて、コメントを削除できます。
アディソンクランプ

2
私はついに、おそらくスタックオーバーフローを起こさないアプローチを見つけましたが、現在はゆっくりと実行されています。
SuperJedi224

4
私はあなたの質問を再開することに投票し、私の-1を+1に変更しました。適切な編集と追加情報の追加。また、コミュニティの批判を受け入れてくれたことを称賛します。PPCGへようこそ!楽しんでください。
ザックゲイツ

回答:


30

スペクトルエアブラッシング(Python、PIL、scipy)

これは、洗練された数学的アルゴリズムを使用してカラフルなナンセンスを生成します。このアルゴリズムは、GoogleのPageRankアルゴリズムに関連していますが、Webページではなくピクセル用です。

このアプローチを採用したのは、塗りつぶしベースの方法とは異なり、鶏肉や木のような画像に対処できる可能性があると考えたためです。ご覧のとおり、それは一種の作品ですが、空のさまざまな部分を異なる色で着色する傾向があります

数学的には、画像のwhileピクセルの隣接グラフを作成し、グラフラプラシアンの上位25個の固有ベクトルを見つけることです。(暗いピクセルが含まれているため、接続の重みを低くするだけではありません。これは、アンチエイリアスの処理に役立ち、一般的にはより良い結果が得られるようです。)固有ベクトルが見つかったら、出力画像のRGB成分を形成するために、それらの逆固有値で重み付けされたそれらのランダムな線形結合。

計算時間のために、画像はこれをすべて行う前に縮小され、再び拡大されてから元の画像で乗算されます。それでも、私のマシンでは、入力イメージに応じて約2〜10分かかりますが、何らかの理由で鶏肉は17分かかりましたが、すぐには実行されません。

実際に、各固有ベクトルの色と強度を制御できるインタラクティブなアプリを作成することで、このアイデアを何か有用なものに変えることが可能かもしれません。そうすれば、空をさまざまなセクションに分割するものをフェードアウトし、画像の関連する特徴を拾うものをフェードインできます。しかし、私はこれを自分で行う予定はありません:)

出力画像は次のとおりです。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

(カボチャではあまりうまくいきませんでしたので、私はそれを省略しました。)

そして、ここにコードがあります:

import sys
from PIL import Image
import numpy as np
import scipy.sparse as sp
import scipy.sparse.linalg as spl
import os
import time

start_time = time.time()

filename = sys.argv[1]
img = Image.open(filename)
orig_w, orig_h = img.size

# convert to monochrome and remove any alpha channel
# (quite a few of the inputs are transparent pngs)
img = img.convert('LA')
pix = img.load()
for x in range(orig_w):
    for y in range(orig_h):
        l, a = pix[x,y]
        l = (255-a) + a*l/255
        a = 255
        pix[x,y] = l,a
img = img.convert('L')

orig_img = img.copy()

# resize to 300 pixels wide - you can get better results by increasing this,
# but it takes ages to run
orig_w, orig_h = img.size
print "original size:", str(orig_w)+ ', ' + str(orig_h)
new_w = 300
img = img.resize((new_w, orig_h*new_w/orig_w), Image.ANTIALIAS)

pix = img.load()
w, h = img.size
print "resizing to", str(w)+', '+str(h)

def coords_to_index(x, y):
    return x*h+y

def index_to_coords(i):
    return (int(i/h), i%h)

print "creating matrix"

A = sp.lil_matrix((w*h,w*h))

def setlink(p1x, p1y, p2x, p2y):
    i = coords_to_index(p1x,p1y)
    j = coords_to_index(p2x,p2y)
    ci = pix[p1x,p1y]/255.
    cj = pix[p2x,p2y]/255.
    if ci*cj > 0.9:
        c = 1
    else:
        c =  0.01
    A[i,j] = c
    return c

for x in range(w):
    for y in range(h):
        d = 0.
        if x>0:
            d += setlink(x,y,x-1,y)
        if x<w-1:
            d += setlink(x,y,x+1,y)
        if y>0:
            d += setlink(x,y,x,y-1)
        if y<h-1:
            d += setlink(x,y,x,y+1)
        i = coords_to_index(x,y)
        A[i,i] = -d

A = A.tocsr()

# the greater this number, the more details it will pick up on. But it increases
# execution time, and after a while increasing it won't make much difference
n_eigs = 25

print "finding eigenvectors (this may take a while)"
L, V = spl.eigsh(A, k=n_eigs, tol=1e-12, which='LA')

print "found eigenvalues", L

out = Image.new("RGB", (w, h), "white")
out_pix = out.load()

print "painting picutre"

V = np.real(V)
n = np.size(V,0)
R = np.zeros(n)
G = np.zeros(n)
B = np.zeros(n)

for k in range(n_eigs-1):
    weight = 1./L[k]
    R = R + V[:,k]*np.random.randn()*weight
    G = G + V[:,k]*np.random.randn()*weight
    B = B + V[:,k]*np.random.randn()*weight

R -= np.min(R)
G -= np.min(G)
B -= np.min(B)
R /= np.max(R)
G /= np.max(G)
B /= np.max(B)

for x in range(w):
    for y in range(h):
        i = coords_to_index(x,y)
        r = R[i]
        g = G[i]
        b = B[i]
        pixval = tuple(int(v*256) for v in (r,g,b))
        out_pix[x,y] = pixval

out = out.resize((orig_w, orig_h), Image.ANTIALIAS)
out_pix = out.load()
orig_pix = orig_img.load()

for x in range(orig_w):
    for y in range(orig_h):
        r,g,b = out_pix[x,y]
        i = orig_pix[x,y]/255.
        out_pix[x,y] = tuple(int(v*i) for v in (r,g,b))

fname, extension = os.path.splitext(filename)
out.save('out_' + fname + '.png')

print("completed in %s seconds" % (time.time() - start_time))

4
これは本当にクールです。おそらく私のお気に入りの1つです。あなたはアンチエイリアスとオープンエンドのエリアをうまく​​処理し、誰かがついにリンクで色付けしました!(それを待っている:-P デスクトップへのセーブ セット)私の古い英語の先生はそれについて静止画像として何と言っていたのでしょうか...他にはその平和を得るために必要な戦いがあります。」Legend of Zeldaゲームへの私の愛については十分です...とても時間がかかるのは本当に残念です。結果のファイルはどのくらいの大きさでしたか?Psラブ画像4&5
OliverGriffin

2
@donbright固有ベクトルを理解できる3年生は実に非常に明るい子供です。そのレベルでアルゴリズムを説明できるかどうかはわかりません。とにかく試してみましょう。写真を硬い金属板に印刷すると想像してください。次に、すべての黒い線を慎重に切り取り、弾力性など、より柔軟なものに置き換えます。白い部分は金属板で、黒い部分は柔軟な布地です。次に、すべてをひもから空中に吊るすので、自由に移動できます。我々は、金属板をタップすると今、彼らが振動します...
ナサニエル

2
@donbright(続き)...金属板を叩く方法に応じて、さまざまな方法で振動します。たぶん、金属部分の1つだけが振動し、他の部分は振動しない場合もありますが、他の場合(弾性で接続されているため)、1つのプレートを押すと別のプレートも動き始めます。これらの異なる振動方法は、振動モードと呼ばれます。このプログラムは、この金属板の振動モードの一部をシミュレートしますが、音を生成する代わりに、それらを使用して描画する色を決定します。
ナサニエル

2
@donbright 金属板の振動を視覚化する方法については、こちらもご覧ください。
ナサニエル

2
@donbright(この技術的な説明も少し失われるかもしれませんが、プレートの振動モードも固有ベクトル計算を使用して計算されるため、この説明は機能します。確かではありません。)
ナサニエル

25

Python 2 + PILも、私の最初の塗り絵

import sys, random
from PIL import Image

def is_whitish(color):
    return sum(color)>500

def get_zone(image, point, mask):
    pixels = image.load()
    w, h = image.size
    s = [point]
    while s:
        x, y = current = s.pop()
        mask[current] = 255
        yield current
        s+=[(i,j) for (i,j) in [(x,y-1),(x,y+1),(x-1,y),(x+1,y)] if 0<=i<w and 0<=j<h and mask[i,j]==0 and is_whitish(pixels[i,j])]

def get_zones(image):
    pixels = I.load()
    mask = Image.new('1',image.size).load()
    w,h = image.size
    for y in range(h):
        for x in range(w):
            p = x,y
            if mask[p]==0 and is_whitish(pixels[p]):
                yield get_zone(image, p, mask)



def apply_gradient(image, mincolor, maxcolor, points):
    minx = min([x for x,y in points])
    maxx = max([x for x,y in points])
    miny = min([y for x,y in points])
    maxy = max([y for x,y in points])
    if minx == maxx or miny==maxy:
        return
    diffx, diffy = (maxx - minx), (maxy-miny)
    stepr = (maxcolor[0] - mincolor[0] * 1.0) / diffy
    stepg = (maxcolor[1] - mincolor[1] * 1.0) / diffy
    stepb = (maxcolor[2] - mincolor[2] * 1.0) / diffy
    r,g,b = mincolor
    w, h = (abs(diffx+1),abs(diffy+1))
    tmp = Image.new('RGB', (w,h))
    tmppixels = tmp.load()
    for y in range(h):
        for x in range(w):
            tmppixels[x,y] = int(r), int(g), int(b)
        r+=stepr; g+=stepg; b+=stepb
    pixels = image.load()
    minx, miny = abs(minx), abs(miny)
    for x,y in points:
        try:
        pixels[x,y] = tmppixels[x-minx, y-miny]
    except Exception, e:
            pass

def colors_seq():
   yield (0,255,255)
   c = [(255,0,0),(0,255,0),(0,0,139)]
   i=0
   while True:i%=len(c);yield c[i];i+=1

def colorize(image):
    out = image.copy()
        COLORS = colors_seq()
    counter = 0
    for z in get_zones(image):
        c1 = COLORS.next()
        c2 = (0,0,0) if counter == 0 else (255,255,255)
        if counter % 2 == 1:
            c2, c1 = c1, c2
        apply_gradient(out, c1, c2, list(z))
        counter +=1
    return out

if __name__ == '__main__':
    I = Image.open(sys.argv[-1]).convert('RGB')
    colorize(I).show()

領域を「グラデーション」で塗りつぶし、異なるカラーサイクルを使用することを除いて、CarpetPythonとまったく同じようにしました。

私の最も壮大な色: ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください

私のマシンでの計算時間:

  • イメージ1(中国語のドラゴン):実0m2.862sユーザー0m2.801s sys 0m0.061s

  • 画像2(グリフォン):実数0m0.991sユーザー0m0.963s sys 0m0.029s

  • 画像3(ユニコーンのドラゴン):実0m2.260sユーザー0m2.239s sys 0m0.021s


素敵なグラデーション!最初のループ内に他の何もないforループ内にforループを貼り付ける場合、さらにインデントする必要はありませんか?
オリバーグリフィン

しますよ!それはコピー/ペーストの問題でした
...-ディーター

23

Python 2とPIL:サイケデリックワールド

シンプルなアルゴリズムを使用して、各白っぽい領域をサイクリングパレットの色で塗りつぶしました。結果は非常にカラフルですが、あまりリアルではありません。

これらの写真の「白い」部分は非常に白いものではないことに注意してください。グレーの濃淡もテストする必要があります。

Python 2.7のコード:

import sys
from PIL import Image

WHITE = 200 * 3
cs = [60, 90, 120, 150, 180]
palette = [(199,199,199)] + [(R,G,B) for R in cs for G in cs for B in cs]

def fill(p, color):
    perim = {p}
    while perim:
        p = perim.pop()
        pix[p] = color
        x,y = p
        for u,v in [(x+dx, y+dy) for dx,dy in [(-1,0), (1,0), (0,1), (0,-1)]]:
            if 0 <= u < W and 0 <= v < H and sum(pix[(u,v)]) >= WHITE:
                perim.add((u,v))

for fname in sys.argv[1:]:
    print 'Processing', fname
    im = Image.open(fname)
    W,H = im.size
    pix = im.load()
    colornum = 0
    for y in range(H):
        for x in range(W):
            if sum(pix[(x,y)]) >= WHITE:
                thiscolor = palette[colornum % len(palette)]
                fill((x,y), thiscolor)
                colornum += 1
    im.save('out_' + fname)

サンプル画像:

カラフルなドラゴン

LSDのカボチャ


3
怖いのは、色が実際に機能しているように見えることです。各画像の色付けにどれくらいの時間がかかり、ファイルはどれくらいの大きさでしたか?
-OliverGriffin

1
プログラムは約2秒で各画像に色を付けます。出力画像の寸法は、入力ファイルと同じです。ファイルサイズは、ほとんどの場合、元のファイルサイズよりも10〜40%小さくなっています(おそらく、異なるjpeg圧縮設定が使用されているためです)。
ロジックナイト

3
コードがどれほど短いかに完全に感銘を受けました!また、使用可能な色を効果的に制限し、パレットを固定する方法も気に入っています。私は実際にそれが好きです、それは一種のグランジを与えます(それは正しい言葉ですか?私はアーティストではありません)雰囲気。
オリバーグリフィン

@OliverGriffin、気に入ってくれてうれしいです。私は、明るい色や暗い色のないパレットを目指していましたが、それでもいくらかコントラストがあります。この色の範囲は、最も満足のいく結果が得られたようです。
ロジックナイト

11

Matlab

function [output_image] = m3(input_file_name)
a=imread(input_file_name);
b=im2bw(a,0.85);
c=bwlabel(b);
h=vision.BlobAnalysis;
h.MaximumCount=10000;
ar=power(double(step(h,b)),0.15);
ar=[ar(1:max(max(c))),0];
f=cat(3,mod((ar(c+(c==0))-min(ar(1:end-1)))/ ...
    (max(ar(1:end-1))-min(ar(1:end-1)))*0.9+0.8,1),c*0+1,c*0+1);
g=hsv2rgb(f);
output_image=g.*cat(3,c~=0,c~=0,c~=0);

HSV色空間を使用し、白い領域間の相対的なサイズに基づいて各領域の色相を選択します。最大の領域は青(Hue = 0.7)で、最小の領域は紫(Hue = 0.8)です。これら2つのサイズの間の領域には、範囲内の色相が与えられます0.7 -> 1=0 -> 0.8。範囲の色相は、関数に関して線形に選択されますarea^0.15。彩度と値は、黒以外のピクセルごとに常に1です。

画像に色を付けるのに1秒もかかりません。

アルゴリズムがきちんと機能する閉じた領域を持つ3つの写真:

ドラゴン

別のドラゴン

多分別のドラゴン

そして、残りの画像:

ドラゴン

別のドラゴン

多分別のドラゴン

これらの画像には、理想的には複数の色で色付けされるべき大きな白い連結領域があります(この問題はNathanielのソリューションでうまく解決されました。


きれいな色で調整された結果のための素敵で短いコード!色相を決定するためにエリアを使用した方法が気に入っています。平均的な画像を処理するのにどれくらい時間がかかりましたか?また、いくつかのより詳細な画像で動作しないのはなぜですか?面積が小さすぎましたか?
OliverGriffin

1
@OliverGriffinは私の投稿で回答し、残りの画像を追加しました。
randomra

7

Python 3と枕

コードはこの回答に含めるには少し長いですが、ここにその要点があります。

  1. 入力画像を取得し、アルファチャネルがある場合は、白い背景に合成します。(少なくとも鶏の画像には必要です。画像全体が黒で、透明度によってのみ区別されていたため、単純にアルファをドロップすることは役に立ちませんでした。)
  2. 結果をグレースケールに変換します。圧縮やアンチエイリアシングのアーティファクト、またはグレーではなくグレーの線が混乱することは望ましくありません。
  3. 結果の2レベル(白黒)コピーを作成します。グレーのシェードは、白と画像の最も暗いシェードの間の設定可能なカットオフしきい値に基づいて、黒または白に変換されます。
  4. 画像のすべての白い領域を塗りつぶします。色は、塗りつぶし操作の開始点の位置を考慮した選択可能なパレットを使用して、ランダムに選択されます。
  5. 黒い線を最も近い隣の色で塗りつぶします。これにより、すべての色の領域がぎざぎざの黒で縁取られないようにすることで、アンチエイリアスの再導入に役立ちます。
  6. 手順2のグレースケールイメージを取得し、そこからアルファマスクを作成します。最も暗い色は完全に不透明で、最も明るい色は完全に透明です。
  7. このアルファマスクを使用して、手順5のカラー画像にグレースケール画像を合成します。

残念ながら、これらの最後のいくつかの手順では、暗い色の領域で見られる明るい「ハロー」をまだ除去していませんが、少なくとも顕著な違いは生じています。画像処理は私の研究分野ではありませんでしたので、私がここでやろうとしたことを行うためのより成功した効率的なアルゴリズムがあることを知っています...しかしまあ。

これまでのところ、ステップ4の選択可能なパレットは2つだけです。純粋にランダムなパレットと、上隅に空の色、下隅に草の色、茶色(岩または木材)を割り当てようとする非常に大まかな「自然な」パレットです。 )各側面の中央に色を付け、中央にさまざまな色を付けます。成功は限られています...


使用法:

usage: paint_by_prog.py [-h] [-p PALETTE] [-t THRESHOLD] [-f | -F] [-d]
                        FILE [FILE ...]

Paint one or more line-art images.

positional arguments:
  FILE                  one or more image filenames

optional arguments:
  -h, --help            show this help message and exit
  -p PALETTE, --palette PALETTE
                        a palette from which to choose colours; one of
                        "random" (the default) or "natural"
  -t THRESHOLD, --threshold THRESHOLD
                        the lightness threshold between outlines and paintable
                        areas (a proportion from 0 to 1)
  -f, --proper-fill     fill under black lines with proper nearest-neighbour
                        searching (slow)
  -F, ---no-proper-fill
                        fill under black lines with approximate nearest-
                        neighbour searching (fast)
  -d, --debug           output debugging information

サンプル:

paint_by_prog.py -t 0.7 Gryphon-Lines.png 色付きグリフォン

paint_by_prog.py Dragon-Tattoo-Outline.jpg 着色された漫画のドラゴン

paint_by_prog.py -t 0.85 -p natural The-Pumpkin-Farm-of-Good-old-Days.jpg 色の農場のシーン

paint_by_prog.py -t 0.7 Dragon-OutLine.jpg 色グランジドラゴン

paint_by_prog.py stejar-arbore-schiţă-natura.png 非常に旗のように見える色の木

鶏肉は見た目があまり良くなく、リンク画像の私の最新の結果は最高ではありません。コードの以前のバージョンから来たものは主に淡黄色であり、それについて興味深い砂漠の雰囲気を持っていました...


性能:

各画像は、デフォルトの設定で処理するのに数秒かかります。つまり、ステップ5には近似最近傍アルゴリズムが使用されます。真の最近傍は大幅に遅く、おそらく30分かかります(実際にタイミングを計っていません)。


最初の画像、特にその茶色の目が幻想的に見えます。よくやった。また、緑の草、カボチャの茶色の野原、紫色の雲を手に入れたことを称賛します。
OliverGriffin

3

Java

パレットの選択からランダムな色の選択。

警告:白い領域が異常に小さい場合を除き、領域の検出は現在非常に遅くなっています。

import java.awt.Color;
import java.awt.image.*;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Random;
import java.util.Scanner;
import java.util.function.Supplier;

import javax.imageio.ImageIO;


public class Colorer{
    public static boolean isProbablyWhite(int x,int y){
        Color c=new Color(image.getRGB(x, y));
        if(c.getRed()<240)return false;
        if(c.getBlue()<240)return false;
        if(c.getGreen()<240)return false;
        return true;
    }
    static class Point{
        int x,y;
        public boolean equals(Object o){
            if(o instanceof Point){
                Point p=(Point)o;
                return x==p.x&&y==p.y;
            }
            return false;
        }
        public Point(int x,int y){
            this.x=x;
            this.y=y;
        }
    }
    static BufferedImage image;
    static int W,H;
    public static void check(Point p,List<Point>l1,List<Point>l2,List<Point>l3){
        if(!isProbablyWhite(p.x,p.y))return;
        if(l1.contains(p))return;
        if(l2.contains(p))return;
        if(l3.contains(p))return;
        l1.add(p);
    }
    public static void process(int x,int y,Color c){
        List<Point>plist=new LinkedList<>();
        int rgb=c.getRGB();
        plist.add(new Point(x,y));
        List<Point>l3=new LinkedList<>();
        int k=0;
        for(int i=0;i<W*H;i++){
            System.out.println(k=l3.size());
            List<Point>l2=new LinkedList<>();
            for(Point p:plist){
                int x1=p.x;
                int y1=p.y;
                if(x1>0){
                    check(new Point(x1-1,y1),l2,plist,l3);
                }
                if(y1>0){
                    check(new Point(x1,y1-1),l2,plist,l3);
                }
                if(x1<W-1){
                    check(new Point(x1+1,y1),l2,plist,l3);
                }
                if(y1<H-1){
                    check(new Point(x1,y1+1),l2,plist,l3);
                }
            }
            while(!plist.isEmpty()){
                l3.add(plist.remove(0));
            }
            if(l3.size()==k)break;
            plist=l2;
        }
        plist=l3;
        for(Point p:plist){
            image.setRGB(p.x,p.y,rgb);
        }
    }
    public static void main(String[]args) throws Exception{
        Random rand=new Random();
        List<Supplier<Color>>colgen=new ArrayList<>();
        colgen.add(()->{return new Color(rand.nextInt(20),50+rand.nextInt(200),70+rand.nextInt(180));});
        colgen.add(()->{return new Color(rand.nextInt(20),rand.nextInt(40),70+rand.nextInt(180));});
        colgen.add(()->{return new Color(150+rand.nextInt(90),10+rand.nextInt(120),rand.nextInt(5));});
        colgen.add(()->{int r=rand.nextInt(200);return new Color(r,r,r);});
        colgen.add(()->{return Arrays.asList(new Color(255,0,0),new Color(0,255,0),new Color(0,0,255)).get(rand.nextInt(3));});
        colgen.add(()->{return Arrays.asList(new Color(156,189,15),new Color(140,173,15),new Color(48,98,48),new Color(15,56,15)).get(rand.nextInt(4));});
        Scanner in=new Scanner(System.in);
        image=ImageIO.read(new File(in.nextLine()));
        final Supplier<Color>sup=colgen.get(in.nextInt());
        W=image.getWidth();
        H=image.getHeight();
        for(int x=0;x<W;x++){
            for(int y=0;y<H;y++){
                if(isProbablyWhite(x,y))process(x,y,sup.get());
            }
        }
        ImageIO.write(image,"png",new File("out.png"));
    }
}

ファイル名とパレットIDの2つの入力が必要です。アンチエイリアス補正が含まれますが、透明ピクセルのロジックは含まれません。

現在、次のパレットが認識されています。

0: Blue and greeen
1: Blue
2: Red
3: Greyscale
4: Three-color Red, Green, and Blue
5: Classic Game Boy pallette (four shades of green)

結果:

ドラゴン、ゲームボーイパレット:

ここに画像の説明を入力してください

他のドラゴン、青+緑のパレット:

ここに画像の説明を入力してください

GOLスティルライフモナリザ(このプログラムでレンダリング)、トリコロールパレット:

ここに画像の説明を入力してください


あなたの色のカスタマイズ性のために+1!:)アンチエイリアスの問題を修正できれば、さらに良く見えるでしょう。これらの画像を出力するのにどれくらいかかりましたか?
オリバーグリフィン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.