শীত মৌসুমে বরফ অবতার চিত্রগুলি তৈরি করুন


29

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

ইনপুট

এই চ্যালেঞ্জটিতে জমা দেওয়ার ইনপুটটি একটি চিত্র (হিমায়িত করার জন্য চিত্র) এবং একটি সংখ্যা হওয়া উচিত (প্রান্তিককরণ, যা পরে ব্যাখ্যা করা হবে)।

আপনি যে কোনও উপায়ে চিত্রটি ইনপুট করতে পারেন আপনার ভাষা তাদের সমর্থন করে (কোনও ফাইল পাথ বা ইউআরএলকে একটি আর্গুমেন্ট হিসাবে, এটি ক্লিপবোর্ড থেকে নেওয়া, একটি ছবি টেনে এনে ফেলে দেওয়া ইত্যাদি) এবং এখানে তালিকাভুক্ত যে কোনও ফর্ম্যাটে আরজিবিতে রঙ প্রকাশ করে (আপনি আপনার আপনি চাইলে আরজিবিএ সমর্থন / প্রয়োজন করতে পারেন তবে এটি কোনও প্রয়োজন নয়)।

আপনার প্রোগ্রামটিতে হার্ডকোডিং ব্যতীত আপনি (কমান্ড লাইন আর্গুমেন্ট, এসটিডিআইএন, ইনপুট ডায়ালগ, ইত্যাদি) কোনওভাবেই নম্বরটি ইনপুট করতে পারেন (উদাঃ n=10)। আপনি যদি চিত্রটির জন্য কোনও ফাইল পাথ / URL ব্যবহার করেন তবে এটি অবশ্যই এই পদ্ধতিতে ইনপুট হওয়া উচিত।

আউটপুট

প্রোগ্রামটি অবশ্যই নীচের বর্ণনানুসারে চিত্রটি প্রসেস করবে এবং তারপরে আপনার পছন্দ মতো কোনও পদ্ধতিতে এটি আউটপুট করা উচিত (কোনও ফাইলের কাছে, এটি স্ক্রিনে দেখানো, ক্লিপবোর্ডে রেখে দেওয়া ইত্যাদি)।

বিবরণ

জমা দেওয়ার জন্য নিম্নলিখিত তিনটি পদক্ষেপ সহ চিত্রটি প্রক্রিয়া করা উচিত। nআপনার প্রোগ্রামটি চিত্রের সাথে ইনপুট হিসাবে প্রাপ্ত নম্বরটিকে বোঝায়।

  1. ব্যাসার্ধ একটি দাগ প্রয়োগ nগড় আর, জি, এবং একটি মধ্যে সব পিক্সেল বি মান প্রতিটি পিক্সেল এর আর, জি, এবং B মান প্রতিস্থাপন করার মাধ্যমে ইনপুট চিত্রে ম্যানহাটন দূরত্ব এর n, পিক্সেল সব আউট-অফ-সীমা স্থানাঙ্ক উপেক্ষা। (অর্থাত্ সমস্ত পিক্সেল যেখানে এক্স এর পার্থক্যের যোগফল এবং ওয়াইয়ের পার্থক্যের সমষ্টি কম বা সমান n))

    (দ্রষ্টব্য: আমি উপরের চিত্রগুলির জন্য একটি গাউসিয়ান ব্লার ব্যবহার করেছি কারণ এটির জন্য একটি সুবিধাজনক অন্তর্নির্মিত কার্য ছিল, তাই আপনার চিত্রগুলি কিছুটা অন্যরকম লাগবে))

  2. প্রতিটি পিক্সেলকে পিক্সেলের দূরত্বের মধ্যে এলোমেলো পিক্সেলে সেট করুন n/2("দূরত্ব" পূর্ববর্তী ধাপের মতো একইভাবে সংজ্ঞায়িত করা হয়েছে)।

    এটি চিত্রের মধ্য দিয়ে লুপিং করে এবং প্রতিটি পিক্সেলটিকে এই রেঞ্জের এলোমেলো পিক্সেলের সাথে সেট করে করা উচিত, যাতে কিছু পিক্সেল পুরোপুরি অদৃশ্য হয়ে যায় এবং কিছুটিকে নকল করা যেতে পারে।

    সমস্ত পরিবর্তন একই সাথে প্রয়োগ করতে হবে। অন্য কথায়, পিক্সেলের পুরানো মানগুলি ব্যবহার করুন (প্রথম ধাপের পরে তবে এই ধাপের আগে), এলোমেলো পিক্সেল সেট করার পরে নতুন মানগুলি নয়।

  3. প্রতিটি পিক্সেলের "নীল" আরজিবি মানকে 1.5 দ্বারা গুন করুন, এটি 255 এ কেপ করুন (বা পিক্সেলের ব্যান্ডের সর্বাধিক মান যাই হোক না কেন) এবং বৃত্তাকার হয়ে যায়।

বিধি

  • আপনি নিজের ভাষায় নির্মিত চিত্র লাইব্রেরি / চিত্র প্রক্রিয়াকরণ সম্পর্কিত ফাংশন ব্যবহার করতে পারেন; তবে, আপনি বর্ণনায় উল্লিখিত তিনটি প্রধান কাজের একটি সম্পাদন করে এমন কোনও ফাংশন ব্যবহার করতে পারবেন না। উদাহরণস্বরূপ, আপনি একটি blurফাংশন ব্যবহার করতে পারবেন না , তবে একটি getPixelফাংশন ভাল।

  • এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী!


1
ধাপ 1 এর দুটি পয়েন্ট রয়েছে যার স্পষ্টকরণ দরকার। প্রথমত, কোন মেট্রিক? আপনি ম্যানহাটন (L-1) বলুন এবং এল-ইনফিনিটির বর্ণনা দিন। দ্বিতীয়ত, কীভাবে চিত্রের সীমানা পরিচালনা করা উচিত: কোন মোড়ক নেই, ডিনোমিনেটরকে সীমানার অভ্যন্তরে কেবল পিক্সেলের উপরে গড় করতে হবে? দ্বিতীয় ধাপের একটি পয়েন্ট রয়েছে যার স্পষ্ট করে বলা দরকার: পদক্ষেপ 1 এর পরে চিত্রের অনুলিপি থেকে নমুনা নেওয়া, বা দ্বিতীয় ধাপের প্রথম থেকে পরিবর্তিত হতে পারে? পদক্ষেপ 3 এর জন্য, 255-এ ক্যাপ করা কেবল 24-বিট রঙের মডেলটিতে উপযুক্ত এবং প্রশ্নটি কোথাও এর প্রয়োজন হয় না।
পিটার টেলর

@ পিটারটেলর আমি প্রথমটি বাদ দিয়ে এই সমস্ত পয়েন্টটি পরিষ্কার করার চেষ্টা করেছি। আমি যা বলছি তা সত্যি বুঝতে পারছি না; dx <= n && dy <= nম্যানহাটনের দূরত্বের সঠিক প্রতিনিধিত্ব, তাই না?
ডুরকনব

না, ম্যানহাটনের দূরত্ব | ডিএক্স | + | ডাই | <= এন।
পিটার টেলর 23

@ পিটারটেলর ঠিক আছে, ধন্যবাদ, আমি এটিও ঠিক করেছি।
ডুরকনব

1
@ স্টটাস্টিক আমি মনে করি "এন / 2 পিক্সেলের দূরত্বে" একটি মোটামুটি বৈধ বিবৃতি যা মোটামুটি এন / 2 বৃত্তাকার / ফ্লোরিং ছাড়াই (এত কার্যকরভাবে, "তলিত", আমি মনে করি)।
মার্টিন এেন্ডার

উত্তর:


14

পাইথন 2 - 326 339 358

ব্যবহারকারীর কাছ থেকে ইনপুট নেয়। প্রথমে ফাইল, তারপর n

from PIL.Image import*;from random import*
a,N=input()
i=open(a)
d=list(i.getdata())
x,y=i.size
R=range(x*y)
m=lambda p,n,r:[p[i]for i in R if abs(n%x-i%x)+abs(n/y-i/y)<=r]
k=d[:]
for p in R:t=map(lambda x:sum(x)/len(x),zip(*m(k,p,N)));d[p]=t[0],t[1],min(255,t[2]*3/2)
i.putdata([choice(m(d,p,N/2))for p in R])
i.save('t.png')

এটি সম্ভবত আরও বেশি গল্ফ করা যেতে পারে: গল্ফ ধারণার জন্য @ এসপি 3000 কে ধন্যবাদ!

নমুনা ইনপুট: (উইন্ডোজ)

"C:/Silly/Optimizer/Trix/Are/For/Kids.png",7

সম্পাদনা করুন : বাগ ঠিক করা হয়েছে যেখানে নীল প্রচার করা হচ্ছিল (মার্টিন এন = 20 সহ আর কোনও নদী নয়; _;)

মার্টিন এন = 2 সহ:

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

মার্টিন এন = 10 সহ:

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

মার্টিন এন = 20 সহ:

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


3

পাইথন 2 - 617 বাইট

সম্পাদনা: কিছু গল্ফ করেছে, দেখে মনে হচ্ছে FryAmTheEggMan যদিও আমাকে বীট করেছে :)

from PIL import Image
import sys,random
j,i,n=sys.argv
n=int(n)
i=Image.open(i)
w,h=i.size
o=Image.new("RGB",(w,h))
D=list(i.getdata())
D=[D[i*w:i*w+w] for i in range(h)]
O=[]
d=n/2
z=range(-n,n+1)
M=lambda n:[[x,y] for x in z for y in z if abs(x)+abs(y)<=n]
m=M(n)
L=w*h
for i in range(L):
 y,x=i/w,i%w;c=r=g=b=0
 for q in m:
  try:C=D[y+q[1]][x+q[0]];r+=C[0];g+=C[1];b+=C[2];c+=1
  except:pass
 r/=c;g/=c;b/=c
 O.append((r,g,min(b*3/2,255)))
R=lambda:random.randint(-d,d)
for i in range(L):
 x,y=i%w,i/w;u=R();v=R()
 while not(0<x+u<w and 0<y+v<h):u=R();v=R()
 O[y*w+x]=O[(y+v)*w+(x+u)]
o.putdata(O)
o.save("b.png")

3

জাভা - 1009 বাইট

হ্যাঁ, আমি ভেবেছিলাম আমি এর থেকে আরও ভাল করতে পারি ...

import java.awt.*;import java.io.*;import java.util.*;import javax.imageio.*;class r{public static void main(String[]v)throws Exception{java.awt.image.BufferedImage i=ImageIO.read(new File("y.png"));int n=Byte.valueOf(v[0]),w=i.getWidth(),h=i.getHeight();for(int z=0;z<w*h;z++){int x=z/h,y=z%h,r=0,g=0,b=0,c=0,x2,y2,k;for(x2=x-n;x2<=x+n;x2++){for(y2=y-n;y2<=y+n;y2++){if(Math.abs(x2-x)+Math.abs(y2-y)<=n&&x2>=0&&x2<w&&y2>=0&&y2<h){k=i.getRGB(x2,y2); r+=(k>>16)&0xFF;g+=(k>>8)&0xFF;b+=k&0xFF;c++;}}}i.setRGB(x,y,new Color(r/c,g/c,b/c).getRGB());}int[]t=new int[w*h];for(int z=0;z<h*w;z++){int x=z/h,y=z%h,x2,y2;ArrayList<Integer>e=new ArrayList<>();for(x2=x-n;x2<=x+n;x2++){for(y2=y-n;y2<=y+n;y2++){if(Math.abs(x2-x)+Math.abs(y2-y)<=n/2&&x2>=0&&y2>=0&&x2<w&&y2<h)e.add(i.getRGB(x2,y2));}}int p=e.get((int)(Math.random()*e.size())),b=(int)((p&0xFF)*1.5);t[x*h+y]=new Color((p>>16)&0xFF,(p>>8)&0xFF,b>255?255:b).getRGB();}for(int d=0;d<w*h;d++){i.setRGB(d/h,d%h,t[d]);}ImageIO.write(i,"PNG",new File("n.png"));}}

import java.awt.*;
import java.io.*;
import java.util.*;
import javax.imageio.*;
class IceBlur{
    public static void main(String[]v)throws Exception{
        java.awt.image.BufferedImage i=ImageIO.read(new File("blah.png"));
        int n=Byte.valueOf(v[0]),w=i.getWidth(),h=i.getHeight();
        for(int z=0;z<w*h;z++){
            int x=z/h,y=z%h,r=0,g=0,b=0,c=0,x2,y2,k;
            for(x2=x-n;x2<=x+n;x2++){
                for(y2=y-n;y2<=y+n;y2++){
                    if(Math.abs(x2-x)+Math.abs(y2-y)<=n&&x2>=0&&x2<w&&y2>=0&&y2<h){
                        k=i.getRGB(x2,y2);
                        r+=(k>>16)&0xFF;
                        g+=(k>>8)&0xFF;
                        b+=k&0xFF;
                        c++;}}}i.setRGB(x,y,new Color(r/c,g/c,b/c).getRGB());}
        int[]t=new int[w*h];
        for(int z=0;z<h*w;z++){
            int x=z/h,y=z%h,x2,y2;
            ArrayList<Integer>e=new ArrayList<>();
            for(x2=x-n;x2<=x+n;x2++){
                for(y2=y-n;y2<=y+n;y2++){
                    if(Math.abs(x2-x)+Math.abs(y2-y)<=n/2&&x2>=0&&y2>=0&&x2<w&&y2<h)e.add(i.getRGB(x2, y2));}}
            int p=e.get((int)(Math.random()*e.size())),b=(int)((p&0xFF)*1.5);
            t[x*h+y]=new Color((p>>16)&0xFF,(p>>8)&0xFF,b>255?255:b).getRGB();}
        for(int d=0;d<w*h;d++){i.setRGB(d/h, d%h, t[d]);}
        ImageIO.write(i,"PNG",new File("blah2.png"));}}

মার্টিন এন = 5 সহ:

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

এন = 20:

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

আমার সাথে 10:

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


আমি যখন জবা'র কিছুক্ষণ হয়ে গেলাম, কিন্তু তুমি কি করতে পারো না k&0xFF00? তদুপরি, 255আপনি কি জায়গায় ব্যবহার করতে পারবেন না 0xFF?
FryAmTheEggman

3

সি, 429 (পতাকা সংজ্ঞার জন্য 391 + 38)

i,R,G,B,q;char*c,t[99];main(r,a,b,k,z,p){scanf("%*[^ ]%d%*6s%d%[^N]%*[^R]R\n",&a,&b,t);int j=a*b,d[j],e[j];F(c=d;c<d+j;*c++=getchar());F(;i<j;e[i++]=X<<24|B/q<<16|G/q<<8|R/q,R=G=B=q=0)F(k=0;k<j;)p=d[k++],D<r&&(++q,R+=p&X,G+=p>>8&X,B+=p>>16&X);F(i=!printf("P7\nWIDTH %d\nHEIGHT %d%sNDHDR\n",a,b,t);i<j;d[i++]=e[k])F(;k=rand()%j,D>r/2;);F(c=d;q<j*4;i=(q%4-2?2:3)*c[q]/2,putchar(i>X?X:i),++q);}

ছক পূরণ করা: pam কোনও মন্তব্য নেই বা শিরোনামে অতিরিক্ত শ্বেত স্পেস নেই, এসটিডিআইএন দিয়ে প্রেরিত সামগ্রী file

n যুক্তি প্রয়োজনীয় (তারা কিছু হতে পারে)।

আউটপুট ফরমেট: pam STDOUT এ ফাইল।

সংকলন করতে:

gcc -DX=255 -DF=for "-DD=z=abs(k-i),z/b+z%a" -Wl,--stack,33554432 -funsigned-char icyavatars.c -o icyavatars

-Wl,--stack,33554432স্ট্যাকের আকার বাড়ায়; প্রক্রিয়াধীন ছবির আকারের উপর নির্ভর করে এটি পরিবর্তন বা সরানো হতে পারে (প্রোগ্রামটির জন্য পিক্সেল বারের চেয়ে 4 বারের চেয়ে দ্বিগুণ পরিমাণের স্ট্যাকের আকার প্রয়োজন)।

-funsigned-charজিসিসি ব্যবহার আছে unsigned charপরিবর্তে signed charজন্য char। সি স্ট্যান্ডার্ডগুলি এই বিকল্পগুলির যে কোনওটির জন্য মঞ্জুরি দেয় এবং এই বিকল্পটি কেবল এখানে প্রয়োজন কারণ জিসিসি ব্যবহার করেsigned char ডিফল্টরূপে করে।

চালাতে (এন = 5):

./icyavatars random argument here fourth fifth < image.pam > output.pam

দ্রষ্টব্য: যদি উইন্ডোজে সংকলন করা হয় stdio.h, fcntl.hএবং io.hঅবশ্যই এতে অন্তর্ভুক্ত থাকতে হবে এবং main()STDIN / STDOUT কে বাইনারি হিসাবে পাঠ্য / লেখার জন্য প্রোগ্রামটি শুরু করার জন্য নিম্নলিখিত কোডটি যুক্ত করা হয়েছে , পাঠ্য নয়, স্ট্রিমগুলি (এটি লিনাক্সের ক্ষেত্রে অপ্রাসঙ্গিক, তবে পাঠ্য স্ট্রিমের \r\nপরিবর্তে উইন্ডোজ ব্যবহার করে \n)।

setmode(fileno(stdin), _O_BINARY);
setmode(fileno(stdout), _O_BINARY);

মন্তব্য করা সংস্করণ

int i,R,G,B,q;
char *c,t[99];
main(r,a,b,k,z,p){
    // read all of header
    // save a large chunk to t, save width to a, save height to b
    scanf("%*[^ ]%d%*6s%d%[^N]%*[^R]R\n", &a, &b, t);
    // create arrays for holding the pixels
    int j = a * b, d[j], e[j];
    // each pixel is 4 bytes, so we just read byte by byte to the int arrays
    for(c = d; c < d + j; ++c)
        *c=getchar();

    // calculating average rgb
    for(i = 0; i < j; ++i){
        // check every pixel; add r/g/b values to R/G/B if manhattan distance < r-1
        for(k = 0; k < j; ++k){
            // pixel being checked
            p = d[k];
            // manhattan distance
            z = abs(k - i)/b + abs(k - i)%a;
            if(z < r){
                // extract components and add
                ++q;
                R += p & 255;
                G += p >> 8 & 255;
                B += p >> 16 & 255;
            }
        }
        // set pixel in e (not d) to average RGB and 255 alpha
        e[i]= 255<<24 | B/q<<16 | G/q<<8 | R/q;
        // clear temporary variables
        R = G = B = q = 0;      
    }

    // print header
    printf("P7\nWIDTH %d\nHEIGHT %d%sNDHDR\n",a,b,t);
    // choose random pixels
    for(i = 0; i < j; ++i){
        // loop until randomly generated integer represents a pixel that is close enough
        do{
            k = rand() % j;
            // manhattan distance
            z = abs(k - i)/b + abs(k - i)%a;
        }while(z > r/2);
        // set d to the new pixel value
        d[i] = e[k];
    }
    // apply blue scaling and output
    for(c = d, q = 0; q < j * 4; ++q){
        // 3/2 if blue component, 1 otherwise
        i = (q % 4 - 2 ? 2 : 3)*c[q]/2;
        // cap components at 255
        putchar(i > 255 ? 255 : i);
    }
}

মার্টিন এন = 10 সহ:

মার্টিন এন = 10 দিয়ে

মার্টিন এন = 20 সহ:

মার্টিন এন = 20 সহ

মার্টিন এন = 100 সহ:

মার্টিন এন = 100 দিয়ে


1

আর, 440 অক্ষর

f=function(n,p){a=png::readPNG(p);b=a;N=nrow(a);M=ncol(a);r=row(a[,,1]);c=col(a[,,1]);for(i in 1:N)for(j in 1:M)b[i,j,]=apply(a,3,function(x)mean(x[abs(r-i)+abs(c-j)<=n]));for(i in 1:N)for(j in 1:M){g=which(abs(r-i)+abs(c-j)<=n/2,arr.ind=T);o=sample(1:nrow(g),1);b[i,j,]=b[g[o,1],g[o,2],]};b[,,3]=b[,,3]*1.5;b[b>1]=1;png(w=M,h=N);par(mar=rep(0,4));plot(0,t="n",xli=c(1,M),yli=c(1,N),xaxs="i",yaxs="i",ax=F);rasterImage(b,1,1,M,N);dev.off()}

সুস্পষ্টতার জন্য লাইন বিরতি সহ:

f=function(n,p){
    a=png::readPNG(p) #use readPNG from package png
    b=a
    N=nrow(a)
    M=ncol(a)
    r=row(a[,,1])
    c=col(a[,,1])
    for(i in 1:N){ #braces can be deleted if all is contained in one line
        for(j in 1:M){
            b[i,j,]=apply(a,3,function(x)mean(x[abs(r-i)+abs(c-j)<=n]))
            }
        }
    for(i in 1:N){ #i'm sure this loop could be shortened
        for(j in 1:M){
            g=which(abs(r-i)+abs(c-j)<=n/2,arr.ind=T)
            o=sample(1:nrow(g),1)
            b[i,j,]=b[g[o,1],g[o,2],]
            }
        }
    b[,,3]=b[,,3]*1.5 #readPNG gives RGB values on a [0,1] range, so no need to round
    b[b>1]=1
    png(w=M,h=N)
    par(mar=rep(0,4))
    plot(0,t="n",xli=c(1,M),yli=c(1,N),xaxs="i",yaxs="i",ax=F)
    rasterImage(b,1,1,M,N)
    dev.off()
    }

নমুনা ইনপুট: f(2,"avatar.png")

N = 2 সহ ফলাফল

আমার অবতারটি এন = 2 দিয়ে

... এন = 10 সহ

এন = 10 সহ

... এন = 20 সহ

এন = 20 সহ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.