নম্বর দ্বারা আঁকা (প্রোগ্রামিং ব্যবহার করে, সংখ্যা নয়)


56

আপনার কাজটি এমন একটি প্রোগ্রাম তৈরি করা যা একটি কালো-সাদা বর্ণচিহ্নযুক্ত চিত্র নেয় (উদাহরণস্বরূপ চিত্রগুলি নীচে থাকে) এবং এটি রঙ দিয়ে পূর্ণ করে। আপনি প্রতিটি অঞ্চল কীভাবে বিভক্ত করবেন এবং কোন রঙটি পূরণ করবেন তা আপনার উপর নির্ভর করে (আপনি কোনও আরএনজিও ব্যবহার করতে পারেন)।

উদাহরণ স্বরূপ:

উদাহরণস্বরূপ আউটপুট 1

আপনি দেখতে পাচ্ছেন যে এমএস পেইন্টের কথা বলতে গেলে আমি স্পষ্টতই একটি উচ্চতর ক্যালিবারের শিল্পী।


স্কোরিং

এটি একটি জনপ্রিয়তার প্রতিযোগিতা, সুতরাং সর্বাধিক নেট ভোটের সাথে উত্তর জিতল। ভোটারদের দ্বারা উত্তর বিচার করতে উত্সাহিত করা হয়

  • ইনপুট মানদণ্ড: সাদা / হালকা-ধূসর ব্যাকগ্রাউন্ড এবং কালো / গা dark়-ধূসর ধরণের রূপরেখা সমন্বিত যে কোনও চিত্র
  • রঙ করা কত ভাল হয়; অর্থ কয়েকটি বা কোনও অঞ্চল উপরেরটি থেকে ভিন্ন সাদা (যদি আপনি স্পষ্টতই মেঘের জন্য সাদা ব্যবহার করার ইচ্ছা না করেন)
  • নির্দিষ্ট বিভাগে ব্যবহৃত রঙগুলির কাস্টমিবিলিটি
  • বিভিন্ন চিত্রের বিস্তৃতিতে সিস্টেমটি কতটা ভাল কাজ করে (বিবিধ বিবিধ)
  • আপনার প্রোগ্রাম প্রতি চিত্র প্রতি কত সময় নেয় তা পোস্ট করুন। আমরা কোড গল্ফ খেলছি না, তবে সংক্ষিপ্ত, দ্রুত এবং আরও দক্ষ কোডটি আরও ভাল হিসাবে বিবেচনা করা উচিত
  • নতুন চিত্রটি স্ক্রিনে বা কোনও ফাইলে আউটপুট করা উচিত (2MB এর চেয়ে বড় নয় যাতে এটি উত্তরে প্রদর্শিত হতে পারে)
  • আপনি কেন সেই চিত্রের ধরণের আউটপুট বেছে নিয়েছেন এবং আপনার কোডটির কার্যকারিতা ব্যাখ্যা / ব্যাখ্যা করতে দয়া করে তা প্রমাণ করুন
  • এতে আবদ্ধ রঙের প্রাসঙ্গিক আকারটি ব্যবহারযোগ্য (বাস্তববাদী রঙের পরিকল্পনা যেমন ঘাস সবুজ, কাঠের বেড়া বাদামি ইত্যাদি))

    "আমি প্রতিটি অঞ্চল এলোমেলোভাবে রঙিন করতে পারতাম, তবে যদি আমি" বেড়া "চিহ্নিত করতে এবং এটি একই রঙিন করতে পারি তবে এটি এমন কিছু যা উন্নয়নের দাবিদার।" - নাথানমারিল

এটি একটি জনপ্রিয়তার প্রতিযোগিতা হিসাবে দেখে , আপনি বিকল্পভাবে এটি দ্বারা বিচার করতে পারেন:

  • সামগ্রিক আবেদন (চিত্রটি দেখতে ভাল কীভাবে)
  • শৈল্পিক ফ্লেয়ার; আপনি যদি শেডিং বা জলরঙ-স্টাইলের রঙিন ইত্যাদিতে প্রোগ্রাম করতে পারেন

সাধারণভাবে, দ্রুততম প্রোগ্রামের সাথে সর্বোচ্চ মানের সর্বকনিষ্ঠ আউটপুটযুক্ত চিত্র (ফাইলের আকার) এবং সর্বোচ্চ জনগণের ভোট বিজয়ী হবে।

আপনার যদি বিবেচনা করার মতো অন্যান্য স্পেসিফিকেশন থাকে যা আপনার মনে হয় ব্যবহার করা উচিত তবে দয়া করে তাদের এই পোস্টের মন্তব্যে সুপারিশ করুন।


উদাহরণ

আমার নিজের কিছুই নাই; সমস্ত উদাহরণ চিত্রগুলি সৃজনশীল কমন্স লাইসেন্সের।

উদাহরণস্বরূপ কালো / সাদা 1 সূত্র: https://pixabay.com/ro/stejar-arbore-schi%C5%A3%C4%83-natura-303890/ উদাহরণস্বরূপ 2 কালো / সাদা উত্স: http://www.freestockphotos.biz/stockphoto/10665 উদাহরণস্বরূপ 3 কালো / সাদা উত্স: 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 / আর্ট / ড্রাগন-আউটলাইন -৩৩১74৪৮ Source6 উদাহরণস্বরূপ 6 কালো / সাদা উত্স: http://electric-meat.deviantart.com/art/A-Heroes-Farewell-280271639 উদাহরণস্বরূপ 7 কালো / সাদা উত্স: http://movillefacepalmplz.deviantart.com/art/Background-The- কুমড়া -Farm অফ গুড বয়সী দিন-342865938


সম্পাদনা: অন-কালো / সাদা পিক্সেল এবং কালো / সাদা পরিবর্তে ধূসর রঙের কিছু চিত্র থাকতে পারে এমন লাইনগুলিতে অ্যান্টি-এলিয়াসিংয়ের কারণে, আপনি এটি মোকাবেলা করার চেষ্টা করতে পারেন। এটি আমার মতে যথেষ্ট সহজ হওয়া উচিত।


4
সকলের কাছে: দয়া করে এটিকে "শিল্প প্রতিযোগিতা" হিসাবে নিম্নোক্ত করা / বন্ধ করবেন না - এর আরও কিছু আছে
edc65

16
পিপিসিজিতে আপনাকে স্বাগতম! আপনার প্রথম পোস্টটি কেবল একটি চ্যালেঞ্জই নয়, কেবল পপ-কন চ্যালেঞ্জই নয়, সর্বোপরি একটি শৈল্পিক চ্যালেঞ্জই হওয়ার সাহস থাকার জন্য আমি আপনাকে সাধুবাদ জানাই। শুভকামনা, আমি আপনাকে শুভ কামনা করি, এবং আপনি যদি আশেপাশে থাকেন তবে আমি মনে করি আপনি এখানে চলে যাবেন।
অ্যাডমবর্কবর্ক

4
অলিভারগ্রিফিন আমি ক্লোজিংয়ের বিরুদ্ধে ভোট দিচ্ছি এবং আপনার জন্য যুক্ত ছবিগুলিতে আমি যুক্ত করেছি। আপনি চাইলে মন্তব্যগুলি সরাতে পারেন।
অ্যাডিসন ক্রম্প

2
অবশেষে আমি এমন একটি পন্থা পেয়েছি যা সম্ভবত ওভারফ্লো স্ট্যাক করবে না, তবে এখন এটি ধীরে ধীরে চলছে।
সুপারজেডি ২২৪

4
আমি আপনার প্রশ্নটি পুনরায় খোলার পক্ষে ভোট দিয়েছি এবং আমার -1 টি একটি +1 এ পরিবর্তন করেছি। ভাল কাজের সম্পাদনা এবং অতিরিক্ত তথ্য যুক্ত করা। এছাড়াও, আমি আপনাকে সম্প্রদায় সমালোচনার জন্য এতটা গ্রহণযোগ্য বলে প্রশংসা করি। পিপিসিজিতে আপনাকে স্বাগতম! আপনি এটা উপভোগ করেন.
জাচ গেটস

উত্তর:


30

বর্ণালী এয়ার ব্রাশিং (পাইথন, পিআইএল, স্কিপি)

রঙিন আজেবাজে উত্পাদন করতে এটি একটি পরিশীলিত গাণিতিক অ্যালগরিদম ব্যবহার করে। অ্যালগরিদম গুগলের পেজর্যাঙ্ক অ্যালগরিদমের সাথে সম্পর্কিত তবে ওয়েব পৃষ্ঠাগুলির পরিবর্তে পিক্সেলের জন্য।

আমি এই পদ্ধতিটি গ্রহণ করেছি কারণ আমি ভেবেছিলাম যে বন্যা ভরাট ভিত্তিক পদ্ধতির বিপরীতে এটি মুরগী ​​এবং গাছের মতো চিত্রগুলি মোকাবেলা করতে সক্ষম হতে পারে যেখানে এমন আকার রয়েছে যা পুরোপুরি কৃষ্ণ রেখায় আবদ্ধ নয়। আপনি দেখতে পাচ্ছেন, এটি বিভিন্ন ধরণের কাজ করে, যদিও এটি আকাশের বিভিন্ন অংশে বিভিন্ন রঙে রঙ ধারণ করে

গাণিতিকভাবে মনের জন্য: এটি যা করছে তা হ'ল চিত্রের পিক্সেলগুলির সংলগ্ন গ্রাফটি তৈরি করা, তারপরে গ্রাফ ল্যাপ্লেসিয়ার শীর্ষ 25 আইজেনভেেক্টরগুলি সন্ধান করা। (এটি সম্পূর্ণরূপে নয়, কারণ আমরা গা dark় পিক্সেলগুলি অন্তর্ভুক্ত করি, আমরা কেবল তাদের সংযোগগুলিকে একটি কম ওজন দিয়ে থাকি anti এটি এন্টিএলিয়াজিংয়ের সাথে আচরণে সহায়তা করে এবং সাধারণভাবে আরও ভাল ফলাফল দেবে বলে মনে হয়)) ইগেনভেেক্টর খুঁজে পেয়ে এটি তৈরি করে আউটপুট চিত্রের আরজিবি উপাদান গঠনের জন্য এগুলির এলোমেলো রৈখিক সংমিশ্রণ, তাদের বিপরীত ইগেনভ্যালুগুলি দ্বারা ভারিত।

গণনা সময়ের স্বার্থে, এই সমস্ত কিছু করার আগে চিত্রটি ছোট করে দেওয়া হবে, আবার আবার ছোট করে ব্যাক আপ করা হবে এবং তারপরে মূল চিত্রটি দিয়ে গুণিত করা হবে। তবুও, এটি দ্রুত চালিত হয় না, ইনপুট চিত্রের উপর নির্ভর করে আমার মেশিনে প্রায় 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
এটি সত্যিই দুর্দান্ত। সম্ভবত এখনও আমার প্রিয় এক। আপনি অ্যান্টিয়ালিজিং এবং খোলা সমাপ্ত অঞ্চলগুলি পরিচালনা করার জন্য দুর্দান্ত কাজ করেছেন এবং শেষ পর্যন্ত লিঙ্কে রঙিন কেউ! (তার জন্য অপেক্ষা করছিলেন :- পি ডেস্কটপে সেট সেভ করুন ) আমি আশ্চর্য হই যে আমার প্রাচীন ইংরেজী শিক্ষক স্থির চিত্র হিসাবে সে সম্পর্কে কী বলতেন ... "এটি তার হৃদয়ের দুই দিক দেখায়, একদিকে শান্তি রয়েছে এবং অন্য যে শান্তি পেতে প্রয়োজনীয় লড়াই আছে "। লেজেন্ড অব জেলদা গেমগুলির প্রতি আমার ভালবাসা সম্পর্কে যথেষ্ট ... এটি সত্যিই লজ্জার বিষয় যে এটি এত দিন নেয়। ফলাফল ফাইলগুলি কত বড় ছিল? পিএস লাভের চিত্রগুলি 4 এবং 5
অলিভারগ্রিফিন

2
@ ডনব্রাইট তৃতীয় গ্রেড যিনি ইগেনভেেক্টর বুঝতে পারতেন সত্যই খুব উজ্জ্বল বাচ্চা হবেন - আমি নিশ্চিত নই যে আমার পক্ষে সেই স্তরের অ্যালগরিদমটি ব্যাখ্যা করা সম্ভব। তবে আমাকে যাইহোক চেষ্টা করতে দিন: কল্পনা করুন যে আমরা ধাতুর একটি শক্ত শীটে ছবিটি মুদ্রণ করব। তারপরে আমরা সাবধানে সমস্ত কালো রেখা কেটে ফেলেছি এবং এটিকে আরও নমনীয় কিছু, যেমন স্থিতিস্থাপক with তাই সাদা অংশগুলি ধাতব প্লেট এবং কালো অংশগুলি নমনীয় ফ্যাব্রিক। এরপরে আমরা স্ট্রিং থেকে পুরো জিনিসটি বাতাসে ঝুলিয়ে রাখি, তাই এটি স্থানান্তরিত হয়। এখন আমরা যদি ধাতব প্লেটগুলি ট্যাপ করি তবে সেগুলি স্পন্দিত হবে ...
নাথানিয়েল

2
@ ডনব্রাইট (অব্যাহত) ... আপনি কীভাবে ধাতব প্লেটটি আঘাত করেছেন তার উপর নির্ভর করে এটি বিভিন্ন উপায়ে স্পন্দিত হবে। হতে পারে কখনও কখনও ধাতব অংশগুলির মধ্যে একটি মাত্র স্পন্দিত হবে এবং অন্যগুলি নয়, তবে অন্য সময় (কারণ তারা স্থিতিস্থাপক দ্বারা সংযুক্ত), একটি প্লেটকে আঘাত করলে অন্যটি চলতে শুরু করবে। এই কম্পনের বিভিন্ন উপায়কে কম্পনীয় মোডগুলি বলা হয় । এই প্রোগ্রামটি এই ধাতব প্লেটের কিছু কম্পনীয় মোডগুলির অনুকরণ করে তবে শব্দ উত্পন্ন করার পরিবর্তে এটি কোন রঙটি আঁকতে পারে তা কাজে লাগাতে তাদের ব্যবহার করে।
নাথানিয়েল

2
@donbright আপনি তাও দেখতে পারেন এখানে ধাতু প্লেট কম্পন visualizing সম্পর্কে আরো জানার জন্য।
নাথানিয়েল

2
@ ডনব্রাইট (এটি আরও প্রযুক্তিগত ব্যাখ্যা আপনাকে কিছুটা হারাতে পারে, তবে এই ব্যাখ্যাটি কাজ করে কারণ একটি প্লেটের কম্পনের মোডগুলি একটি ইগেনভেেক্টর গণনা ব্যবহার করেও গণনা করা হয় Though যদিও এটি সম্ভব যে এটি আমার কোডের মতো একই গণনা নয় - আমি সত্যিই নিশ্চিত নয়))
নাথানিয়েল

25

পাইথন 2 + পিআইএলও, আমার প্রথম রঙিন বই

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

আমি কার্পেট পাইথনের মতো বেশ কিছুটা করেছি, আমি অঞ্চলটি 'গ্রেডিয়েন্টস' দিয়ে পূরণ করি এবং একটি ভিন্ন বর্ণচক্র ব্যবহার করি।

আমার সবচেয়ে দুর্দান্ত রঙ: এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

আমার মেশিনে গণনার সময়:

  • চিত্র 1 (চাইনিজ ড্রাগন): আসল 0 মি 2.862 এর ব্যবহারকারী 0 এম 2.801 এস সিস 0 এম0.061 এস

  • চিত্র 2 (গ্রিফন): আসল 0m0.991s ব্যবহারকারী 0m0.963 s ss 0m0.029s

  • চিত্র 3 (ইউনিকর্নিশ ড্রাগন): আসল 0 এম 2.260 এর ব্যবহারকারী 0 এম 2.239 এস সিস 0 এম0.021 এস


দুর্দান্ত গ্রেডিয়েন্টস! যখন আপনি প্রথমটির ভিতরে কিছুই না রেখে একটি লুপের জন্য লুপের জন্য আটকে থাকেন, তখন আপনাকে আরও ইনডেন্টের প্রয়োজন হবে না?
অলিভারগ্রিফিন

সত্যি তুমি পারবে ! এটি অনুলিপি / পেস্ট ইস্যু ছিল ...
ডাইটার

23

পাইথন 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)

উদাহরণ চিত্রসমূহ:

একটি বর্ণিল ড্রাগন

এলএসডিতে কুমড়ো


3
ভীতিজনক অংশটি হ'ল রঙগুলি আসলে কাজ করে বলে মনে হচ্ছে। প্রতিটি চিত্রের রঙিন হতে আপনাকে কতক্ষণ সময় লাগবে এবং ফাইলগুলি কত বড় ছিল?
অলিভারগ্রিফিন

1
প্রোগ্রামটি প্রায় 2 সেকেন্ডের মধ্যে প্রতিটি চিত্র রঙ করে। আউটপুট চিত্রের মাত্রা ইনপুট ফাইলগুলির মতো। ফাইলের আকারগুলি মূল থেকে 10% থেকে 40% ছোট (সম্ভবত বিভিন্ন জেপিইগ সংক্ষেপণ সেটিংস ব্যবহৃত হয়)।
লজিক নাইট

3
কোডটি কত সংক্ষিপ্ত তা আমি পুরোপুরি মুগ্ধ! আমি আরও পছন্দ করি যে আপনি কীভাবে কার্যকরভাবে ব্যবহারের জন্য উপলভ্য রঙগুলি সীমাবদ্ধ করেন, এইভাবে সেট প্যালেটে রেখে। আমি আসলে এটি পছন্দ করি, এটি এক ধরনের গ্রঞ্জ দেয় (এটি কি সঠিক শব্দ? আমি শিল্পী নই) ভাইব
অলিভারগ্রিফিন

অলিভারগ্রিফিন, আপনি এটি পছন্দ করেছেন বলে আমি আনন্দিত। আমি উজ্জ্বল বা গা dark় রঙ ছাড়া প্যালেটটির জন্য লক্ষ্য রেখেছিলাম, তবে এখনও কিছু বিপরীতে রয়েছে। এই রঙের পরিসীমাটিতে সর্বাধিক আনন্দদায়ক ফলাফল রয়েছে বলে মনে হয়েছে।
লজিক নাইট

11

মতলব

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

আমরা এইচএসভি কালারস্পেস ব্যবহার করি এবং সাদা অঞ্চলগুলির মধ্যে এটির তুলনামূলক আকারের ভিত্তিতে প্রতিটি অঞ্চল হিউ চয়ন করি। বৃহত্তম অঞ্চলটি নীল ( Hue = 0.7) এবং সবচেয়ে ছোট অঞ্চলটি বেগুনি ( Hue = 0.8) হবে। এই দুটি আকারের অঞ্চলগুলিকে পরিসরে হিউজ দেওয়া হয় 0.7 -> 1=0 -> 0.8। পরিসীমাটির ক্ষেত্রে হিউ অন রেঞ্জটি রৈখিকভাবে নির্বাচিত area^0.15। স্যাচুরেশন এবং মান প্রতিটি অ-কালো পিক্সেলের জন্য সর্বদা 1।

কোনও চিত্র রঙ করতে এটি 1 সেকেন্ডের চেয়ে কম সময় নেয়।

বদ্ধ অঞ্চলগুলির সাথে 3 টি চিত্র যেখানে অ্যালগরিদম শালীনভাবে কাজ করে:

ঘুড়ি বিশেষ

অন্য ড্রাগন

হতে পারে অন্য ড্রাগন

এবং বাকি চিত্রগুলি:

ঘুড়ি বিশেষ

অন্য ড্রাগন

হতে পারে অন্য ড্রাগন

এই চিত্রগুলিতে বড় সাদা সংযুক্ত অঞ্চল রয়েছে যা একাধিক রঙের দ্বারা আদর্শভাবে রঙ হওয়া উচিত ( নাথানিয়েলের সমাধানে এই সমস্যাটি সুন্দরভাবে সমাধান করা হয়েছিল) ।


কিছু সুন্দর রঙ সমন্বিত ফলাফলের জন্য দুর্দান্ত এবং শর্ট কোড! আমি পছন্দ করি আপনি কীভাবে রঙটি নির্ধারণ করতে সহায়তা করতে অঞ্চলটি ব্যবহার করেছিলেন। গড় চিত্রটি প্রসেস করতে কতক্ষণ সময় লেগেছিল এবং কেন এটি আরও বিশদ চিত্রগুলিতে কাজ করে না? অঞ্চলগুলি কি খুব ছোট ছিল?
অলিভারগ্রিফিন

1
অলিভারগ্রিফিন আমার পোস্টে উত্তর দিয়েছেন এবং বাকি চিত্রগুলি যুক্ত করেছেন।
এলোমেলো

7

বালিশ সহ পাইথন 3

কোডটি এই উত্তরে অন্তর্ভুক্ত করার জন্য কিছুটা দীর্ঘ, তবে এখানে এটির সংক্ষেপণ

  1. ইনপুট চিত্রটি ধরুন এবং এর যদি আলফা চ্যানেল থাকে তবে একটি সাদা পটভূমিতে এটি মিশ্রণ করুন। (কমপক্ষে মুরগির চিত্রের জন্য প্রয়োজনীয়, কারণ পুরো চিত্রটি কালো ছিল, কেবল স্বচ্ছতার দ্বারা আলাদা করা হয়েছিল, তাই কেবল আলফা বাদ দেওয়া কার্যকর ছিল না))
  2. ফলাফলটিকে গ্রেস্কেলে রূপান্তর করুন; আমাদের গণ্ডগোল করতে আমরা সংকোচনের বা অ্যান্টি-এলিয়জিং শিল্পকর্মগুলি বা ধূসর-রেখাগুলি-যা-বেশ-ধূসর নয়, চাই না।
  3. ফলাফলের দ্বি-স্তরের (কালো এবং সাদা) অনুলিপি তৈরি করুন। ইমেজের সাদা এবং গা dark় ছায়ার মধ্যে কনফিগারযোগ্য কাটফোর প্রান্তের উপর ভিত্তি করে ধূসর রঙের শেডগুলি কালো বা সাদা রূপান্তরিত হয়।
  4. চিত্রের প্রতিটি সাদা অঞ্চল বন্যায় ভরাট করুন। রঙগুলি এলোমেলোভাবে বেছে নেওয়া হয়, একটি নির্বাচনযোগ্য প্যালেট ব্যবহার করে বন্যা-পূরণের ক্রিয়াকলাপের জন্য সূচনা পয়েন্টের অবস্থান বিবেচনা করে।
  5. তাদের নিকটতম-প্রতিবেশী রঙগুলির সাথে কালো লাইনগুলি পূরণ করুন। প্রতিটি রঙিন অঞ্চলকে জেগি কালোতে বাঁধা থেকে বাঁচিয়ে আমাদের এন্টি-এলিয়াসিং পুনঃপ্রবর্তন করতে সহায়তা করে।
  6. দ্বিতীয় ধাপের থেকে গ্রেস্কেল চিত্রটি নিন এবং এটি থেকে একটি আলফা মাস্ক তৈরি করুন: গা the় রঙটি সম্পূর্ণরূপে অস্বচ্ছ, হালকা রঙ সম্পূর্ণ স্বচ্ছ।
  7. এই আলফা মাস্কটি ব্যবহার করে ধাপ ৫ থেকে রঙিন চিত্রের উপরে গ্রেস্কেল চিত্রটি মিশ্রিত করুন।

দুর্ভাগ্যক্রমে, শেষ কয়েকটি পদক্ষেপগুলি এখনও হালকা "হালস" বাদ দেয়নি যা গাer় বর্ণের অঞ্চলে দৃশ্যমান, তবে তারা একটি লক্ষণীয় পার্থক্য করেছে, কমপক্ষে। চিত্র প্রক্রিয়াকরণ আমার পড়াশোনার ক্ষেত্র কখনও ছিল না, তাই আমি জানি যে আমি এখানে যা করার চেষ্টা করেছি তা করার জন্য আরও সফল এবং আরও দক্ষ অ্যালগরিদম রয়েছে ... তবে ওহ ভাল well

এখনও অবধি, চতুর্থ ধাপের জন্য দুটি মাত্র নির্বাচনযোগ্য প্যালেট রয়েছে: একটি সম্পূর্ণরূপে এলোমেলো একটি এবং খুব রুক্ষ "প্রাকৃতিক" একটি, যা উপরের কোণগুলিতে আকাশের রঙগুলি, নীচের কোণে ঘাসের বর্ণগুলি নির্ধারণ করার চেষ্টা করে, বাদামী (শিলা বা কাঠ) ) প্রতিটি পাশের মাঝখানে রঙ এবং কেন্দ্রের নীচে বিচিত্র রঙ colors সাফল্য সীমিত হয়েছে ...


ব্যবহার:

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 ধাপের জন্য ব্যবহৃত হয় সত্যিকারের নিকটতম-প্রতিবেশী উল্লেখযোগ্যভাবে ধীর হয়, সম্ভবত আধা মিনিট সময় নেয় (আমি আসলে এটি টাইম করি নি)।


প্রথম চিত্রটি দুর্দান্ত দেখাচ্ছে, বিশেষত সেই বাদামী চোখ। সাবাশ. আমি সবুজ ঘাস, কুমড়ো এবং বাদামী মেঘের বাদামী ক্ষেতগুলি পেয়ে আপনাকে সাধুবাদ জানাই।
অলিভারগ্রিফিন

3

জাভা

আপনার প্যালেটের পছন্দ থেকে র্যান্ডম রঙ নির্বাচন।

সতর্কতা: সাদা অঞ্চলগুলি অস্বাভাবিকভাবে ছোট না হলে অঞ্চলটি বর্তমানে খুব ধীর সন্ধান করছে।

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

দুটি ইনপুট দরকার: ফাইলের নাম এবং প্যালেট আইডি। কিছু অ্যানালিয়ালাইজিং সংশোধন অন্তর্ভুক্ত করে তবে স্বচ্ছ পিক্সেলের জন্য যুক্তি অন্তর্ভুক্ত করে না।

নিম্নলিখিত প্যালেটগুলি বর্তমানে স্বীকৃত:

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)

ফলাফল:

ড্রাগন, গেম বয় প্যালেট:

এখানে চিত্র বর্ণনা লিখুন

অন্য ড্রাগন, নীল + সবুজ প্যালেট:

এখানে চিত্র বর্ণনা লিখুন

জিওএল স্টিল লাইফ মোনা লিসা (যেমনটি এই প্রোগ্রামটি দ্বারা রেন্ডার করা হয়েছে ), ত্রিভুজ প্যালেট:

এখানে চিত্র বর্ণনা লিখুন


আপনার রঙ অনুকূলিতকরণের জন্য +1! :) আপনি যদি অ্যান্টিআলাইজিং ইস্যুটি ঠিক করতে পারেন তবে এটি আরও ভাল দেখায়। এই চিত্রগুলি আউটপুট করতে আপনার কতক্ষণ সময় নিয়েছে?
অলিভারগ্রিফিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.