একটি চিত্রের গড় রঙ


21

একটি চিত্রের গড় রঙ

বিজ্ঞানীরা মহাবিশ্বের গড় রঙ নির্ধারণ করতে সক্ষম হয়েছেন তবে আমরা কতগুলি বাইটে একটি চিত্রের গড় রঙ খুঁজে পেতে পারি?

তোমার কাজ

আপনার ইনপুটটি একটি একক চিত্র হবে যা আপনাকে চিত্রের রংগুলির গড় খুঁজে পেতে এবং একটি হেক্স রঙ-স্ট্রিং ( #??????) আউটপুট করতে হবে । চিত্রটি নিম্নলিখিত যে কোনও বিন্যাস হতে পারে

  • কোন JPEG / JFIF
    • জেপিগ 2000
  • টিফ
  • জিআইএফ
  • বিএমপি
  • পিএনজি
  • PNM
    • পিপিএম

ইনপুটটি চিত্রটিতে ইউআরএল / ইউআরআই হিসাবেও নেওয়া যেতে পারে।

বিল্ড-ইন ফাংশন যা গড় গণনা করে বা একবারে চিত্রটির নমুনা দেয় যেমন ImageMeasurementsঅনুমোদিত নয়।

উদাহরণ

আপনি কীভাবে গড় গণনা করেন এবং কোন রঙের মডেল ব্যবহার করেন তার উপর নির্ভর করে ফলাফলগুলি কিছুটা পৃথক হবে। আমি নীচের চিত্রগুলির জন্য আরজিবি এবং এলসিএইচ (এইচএসভি) মান যুক্ত করেছি।

নমুনা 1আউটপুট: #53715Fআরজিবি, #3B7D3DLCH (এইচএসভি) হতে পারে


নমুনা 2আউটপুট: #8B7D41আরজিবি, #96753Cএলসিএইচ (এইচএসভি)


আমাদের কোন ইমেজ ফর্ম্যাটগুলি পরিচালনা করতে হবে? বিশেষত, আমরা কি কেবল পিপিএম হ্যান্ডেল করতে পারি?
ডেনিস

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

@ মাল্টেসেন আমি একটি 240x140 উদাহরণ যুক্ত করেছি। আশা করি এটি যথেষ্ট ছোট
ডাউঙ্গোট

আমাদের কি সর্বদা গোল হওয়া উচিত? প্রথম উদাহরণে, 95.6...যা আপনি 95নির্দিষ্ট আউটপুটে গোল করেছেন ।
ডেনিস

4
পিএস স্যান্ডবক্সে কোনও প্রশ্ন পোস্ট করার কোনও অর্থ নেই যতক্ষণ না আপনি এটি কমপক্ষে ২৪ ঘন্টার জন্য রেখে যাচ্ছেন , যাতে অন্য সময় অঞ্চলের লোকেরা এটি দেখতে পারে এবং বাস্তবতার জন্য আপনাকে এটি hours২ ঘন্টা দেওয়া দরকার কারণ প্রত্যেকে পরীক্ষা করে না স্যান্ডবক্স অবসেসিভলি।
পিটার টেলর

উত্তর:


19

পাইথ - 23 22 19 18 16 বাইট

সমস্ত চ্যানেল পাওয়ার জন্য স্থানান্তরিত করে, তারপরে অঙ্কগুলি, ভাগ করে এবং হেক্সিফাই করে। একত্রীকরণ এবং প্রিপেন্ডিং দ্বারা সমাপ্ত a #

+\#sm.H/sdldCs'z

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

+               String concat
 \#             "#"
 s              String concat all channels
 m              Map
  .H            Hex string
    /  ld       Divided by length of channel
     sd         Sum of channel
  C             Transpose to separate into channels
   s            Concatenate all rows
    'z          Read image with filename input

নমুনা রান

>>>pyth avg.pyth 
V5VAR.jpg
#8b7d41

আপনি যদি ইমেজের ধরণটি নির্দিষ্ট করতে চান তবে কিছু হতে পারে।
isaacg

1
@ আইস্যাক ভাল পয়েন্ট এটি কিছু লাগে।
মালটিসেন

এটি কীভাবে কিছু নেয়, এটি জেপেইগটিকে বিটম্যাপে ডিকোড করে না?
অ্যালেক টেলি

3
@ অ্যালকিটিল ডকুমেন্টেশন অনুসারে পাইথ ফাইলটি কোনও চিত্র কিনা তা পরীক্ষা করে এবং স্বয়ংক্রিয়ভাবে এটিকে বিটম্যাপে রূপান্তর করে। গিটহাব সংগ্রহস্থলটি অনুসন্ধান করা দেখে মনে হচ্ছে এটি PILচিত্রগুলি পরিচালনা করতে লাইব্রেরিটি ব্যবহার করে । সঠিক উত্স জন্য এখানে দেখুন ।
বাকুরিউ

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

22

বাশ, 46 বাইট

ইমেজম্যাগিক চিত্রটিকে এক পিক্সেলে স্কেল করে যা চিত্রের গড় রং ধারণ করে তবে এটি পাঠ্য হিসাবে আউটপুট করে।

convert $1 -scale 1x1\! txt:-|egrep -o '#\w+'

4
যে স্মার্ট! +1
মাল্টেসেন

10

ম্যাটল্যাব - 68 বাইট

আপনি যে চিত্রটি লোড করতে চান তা চয়ন করার জন্য একটি জিইউআই খুলতে imreadসম্মিলিতভাবে চিত্রটি পড়া হয় uigetfilethis এই কোডটির সাথে অনুমানটি হ'ল সমস্ত চিত্র আরজিবি, এবং গড় রঙ গণনা করার জন্য, আমরা প্রতিটি চ্যানেলের উপর পৃথকভাবে বিভাজন করি একটি চ্যানেলে যতগুলি উপাদান রয়েছে তার দ্বারা, যা আরজিবি চিত্রের মোট পিক্সেল সংখ্যা 3 ) দ্বারা বিভক্ত হয়েছে কারণ গড় সম্ভবত ভাসমান পয়েন্টের মান তৈরি করতে পারে, তাই শূন্যের দিকে সংখ্যাটি গোল করার জন্য একটি কল করতে হবে । হেক্সাডেসিমাল ফর্ম্যাটিং স্ট্রিং ( ) এর সাথে একত্রে প্রতিটি পূর্ণসংখ্যার মানকে তার হেক্স সমতুল্য হিসাবে গড়তে মুদ্রণ করতে ব্যবহৃত হয়। তবে, যে কোনও চ্যানেলের গড় মান 16 এর চেয়ে কম হওয়া উচিত বামে একটি অতিরিক্ত 0 প্যাড করা হয়েছে তা নিশ্চিত করার ব্যবস্থা রয়েছেnumel(I)fixsprintf%x02*

I=imread(uigetfile);
['#' sprintf('%02x',fix(sum(sum(I))*3/numel(I)))]

নমুনা রান

সুন্দর জিনিসটি imreadহ'ল আপনি URL থেকে সরাসরি চিত্রগুলিতে পড়তে পারেন। পুনরুত্পাদনযোগ্য উদাহরণ হিসাবে, ধরে নেওয়া যাক আপনি আপনার কম্পিউটারে চিত্রগুলি ডাউনলোড করেছেন এবং উপরের কোডটি চালিয়েছেন ... তবে প্রদর্শনের জন্য, আমি সরাসরি কোড গল্ফ থেকে ছবিগুলি পড়ব:

প্রথম চিত্র

>> I=imread('http://i.stack.imgur.com/dkShg.jpg');
>> ['#' sprintf('%02x',fix(sum(sum(I))*3/numel(I)))]

ans =

#53715f

দ্বিতীয় চিত্র

>> I=imread('http://i.stack.imgur.com/V5VAR.jpg');
>> ['#' sprintf('%02x',fix(sum(sum(I))*3/numel(I)))]

ans =

#8b7d41

* দ্রষ্টব্য: এটি স্ট্যাটওভারফ্লো ব্যবহারকারীরা ম্যাটল্যাব এবং অক্টাভা চ্যাট রুমে করা একটি সহযোগিতামূলক প্রচেষ্টা ছিল ।


7

সিজেম, 27 বাইট

'#[q~]5>3/_:.+\,f/"%02X"fe%

এটি STDIN এর একটি পিপিএম চিত্র পড়ে read

সিজেমের কোনও অন্তর্নির্মিত চিত্র প্রক্রিয়াকরণ নেই, সুতরাং এই কোডটি একটি 24 এস-বিটি প্যালেট (সর্বাধিক মান 255) সহ কোনও ASCII পোর্টেবল পিক্স্যাপ (যাদু নম্বর P3) এবং কোনও মন্তব্য করার প্রত্যাশা করে।

টেস্ট রান

$ cjam avg.cjam < dkShg.ppm 
#53715F

কিভাবে এটা কাজ করে

'#     e# Push that character.
[q~]   e# Evaluate the input and collect the results in an array.
5>     e# Discard the first first results (Pi, 3, width, height, range).
3/     e# Split into chunks of length 3 (RGB).
_:.+   e# Push a copy and add across the columns (RGB).
\,f/   e# Divide each sum by the length of the array (number of pixels).
"%02X" e# Push that format string (hexadecimal integer, zero-pad to two digits).
fe%    e# Format each integer, using the format string.

7

HTML5 + জাভাস্ক্রিপ্ট (ES6), 335 বাইট

এটি জিততে যাচ্ছে না তবে যাইহোক আমি এটি করতে মজা পেয়েছি।

HTML5 এর ব্যবহার ক্যানভাস এপিআই । ইনপুটটি একটি কর্স-সক্ষম চিত্রটির একটি URL ।

f=(u,i=new Image)=>{i.crossOrigin='';i.src=u;i.onload=e=>{x=(c=document.createElement('canvas')).getContext('2d');a=w=c.width=i.width;a*=h=c.height=i.height;x.drawImage(i,0,0);for(d=x.getImageData(m=0,0,w,h).data,r=[0,0,0];m<d.length;m+=4){r[0]+=d[m];r[1]+=d[m+1];r[2]+=d[m+2]}console.log('#'+r.map(v=>(~~(v/a)).toString(16)).join``)}}

ডেমো

এটি ES6 হিসাবে এটি বর্তমানে কেবল ফায়ারফক্স এবং এজে কাজ করে।

f = (u,i = new Image) => {
  i.crossOrigin = '';
  i.src = u;
  i.onload = e => {
    x = (c = document.createElement('canvas')).getContext('2d');
    a = w = c.width = i.width;
    a *= h = c.height = i.height;
    x.drawImage(i, 0, 0);
    for (d = x.getImageData(m = 0, 0, w, h).data, r = [0, 0, 0]; m < d.length; m += 4) {
      r[0] += d[m]
      r[1] += d[m + 1];
      r[2] += d[m + 2];
    }
    console.log('#' + r.map(v => (~~(v/a)).toString(16)).join``)
  }
}

// Snippet stuff
console.log = x => document.body.innerHTML += x + '<br>';

f('http://crossorigin.me/https://i.stack.imgur.com/dkShg.jpg');

f('http://crossorigin.me/https://i.stack.imgur.com/V5VAR.jpg');


3
আরে, আমি পছন্দ করি যে এটি সরাসরি আপনার উত্তরে চালানো যায় কারণ এটি HTML + জেএস :) +1 :)
রায়রিং - মনিকা

আপনি কি new Imageসাথে প্রতিস্থাপন করতে পারবেন না Image()?
ইসমাইল মিগুয়েল

@ TypeError: Constructor Image requires 'new'
ইসমাইল

বিষ্ঠা। তবে আপনি তৈরি W='width'এবং H='height'ব্যবহার করতে পারেন i[H]বাi[W]
ইসমা

1
@ ইসমাইলমিগুয়েল যা আরও অক্ষর ব্যবহার করে
rink.attendant.6

6

পাইথন [3] + সায়পি, 144 133 121

পিক্সেল ডেটা লোড করে, প্রতিটি চ্যানেলের জন্য অঙ্কগুলি, আকার *, ফর্ম্যাট দ্বারা ভাগ করে। মানগুলি শূন্যের দিকে বৃত্তাকার।

* আকার = প্রস্থ * উচ্চতা * চ্যানেলগুলি, এভাবে 3 দ্বারা গুণিত হয়

from scipy import misc,sum
i=misc.imread(input())
print('#'+(3*'{:2x}').format(*sum(i.astype(int),axis=(0,1))*3//i.size))

1
input()পথ নেওয়ার জন্য কেন ব্যবহার করবেন না ? এটি আপনাকে 20 বাইট সংরক্ষণ করবে।
কেড

ধন্যবাদ! আমি যদিও 11 বাইট সংরক্ষণ করতে পেরেছি।
ত্রাং ওউল

আপনার কেবলমাত্র একটি আমদানি দরকার import scipy। পরিবর্তন m.imreadকরুন misc.imread
কেড

বিবিধ আমদানি না করে কাজ করে না NameError: name 'misc' is not defined,। চেষ্টা করা হয়েছে from scipy import*, কাজ করে না।
ট্রাং ওউল

2
@TrangOul কি from scipy import sum, misc as m? আপনি যখন যোগফলটি ব্যবহার করেন তখন সংরক্ষণ করুন।
মাতসয়জাই

3

আর, 90 বাইট

rgb(matrix(apply(png::readPNG(scan(,"")),3,function(x)sum(x*255)%/%length(x)),nc=3),m=255)

পিএনজি ফাইলের পথে এসটিডিআইএন থেকে পঠিত হয়। প্যাকেজ pngইনস্টল করা প্রয়োজন।

ধাপে ধাপে:

#Reads path from stdin and feeds it to function readPNG from package png
p = png::readPNG(scan(,""))
#The result is a 3d matrix (1 layer for each color channel) filled with [0,1] values
#So next step, we compute the mean on each layer using apply(X,3,FUN)
#after moving the value to range [0,255] and keeping it as an integer.
a = apply(p,3,function(x)sum(x*255)%/%length(x))
#The result is then moved to a matrix of 3 columns:
m = matrix(a, nc=3)
#Which we feed to function rgb, while specifying that we're working on range [0,255]
rgb(m, m=255)

# Example:
rgb(matrix(apply(png::readPNG(scan(,"")),3,function(x)sum(x*255)%/%length(x)),nc=3),m=255)
# 1: ~/Desktop/dkShg.png
# 2: 
# Read 1 item
# [1] "#53715F"

2

সি, 259 বাইট

কোনও মন্তব্য ছাড়াই একটি পিপিএম ফাইল নেয় ।

double*f,r,g,b;x,y,z,i;char*s="%d %d %d";main(a,_){(a-2)?(feof(f)?0:(fscanf(f,s,&x,&y,&z),r+=(x-r)/i,g+=(y-g)/i,b+=(z-b)/i++,main(0,0))):(f=fopen(((char**)_)[1],"r"),fscanf(f,"%*s%*d%*d%*d"),r=g=b=0.,i=1,main(0,0),printf(s,(int)r,(int)g,(int)b),fclose(f));}

প্রক্রিয়া

প্রাথমিক কোড:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    FILE *f = fopen(argv[1],"r");
    int w,h,d,x,y,z,i;
    double r,g,b;
    fscanf(f,"%*s %d %d %d",&w,&h,&d);//get width, height, depth, ignore P6
    r = g = b = 0.0; //zero r, g, and b totals
    for (i=1; i<=w*h; ++i) {
        fscanf(f,"%d %d %d",&x,&y,&z);//get next pixel
        r+=(x-r)/i;//update averages
        g+=(y-g)/i;
        b+=(z-b)/i;
    }
    printf("%d %d %d",(int)r,(int)g,(int)b);//print result
    fclose(f);
    return 0;
}

ভেরিয়েবলগুলি ছাঁটাই এবং লুপ সরান:

double r,g,b;
FILE *f;
int i;
int main(int argc, char *argv[])
{
    if (argc==2) { // {./me} {file.ppm}
        f = fopen(argv[1],"r");
        fscanf(f,"%*s%*d%*d%*d");//drop info
        r = g = b = 0.0;
        i = 1;
        main(0,0);//begin load loop
        printf("%d %d %d",(int)r,(int)g,(int)b);
        fclose(f)
    } else {
        if (feof(f)) return 0;
        fscanf(f,"%d%d%d",&x,&y,&z);
        r+=(x-r)/i;
        g+=(y-g)/i;
        b+=(z-b)/i;
        i++;
        main(0,0);
    }
    return 0;
}

সেখান থেকে আমি বিভিন্ন বিবৃতি একক রিটার্ন বিবৃতিতে সংযুক্ত করেছি। এটি এবং অন্য কোনও বহিরাগত ধরণের তথ্য সরিয়ে, ভেরিয়েবলগুলির নাম পরিবর্তন করে এবং সাদা স্থানটি কাটা।


2

কোবরা - 371

@ref 'System.Numerics'
use System.Drawing
use System.Numerics
class P
    def main
        i,d=Bitmap(Console.readLine?''),BigInteger
        r,g,b,c=d(),d(),d(),d()
        for x in i.width,for y in i.height,r,g,b,c=for n in 4 get BigInteger.add([r,g,b,c][n],d([(p=i.getPixel(x,y)).r,p.g,p.b,1][n]))
        print'#'+(for k in[r,g,b]get Convert.toString(BigInteger.divide(k,c)to int,16)).join('')

2

জাভা, 449 447 446 430 426 বাইট

import java.awt.*;interface A{static void main(String[]a)throws Exception{java.awt.image.BufferedImage i=javax.imageio.ImageIO.read(new java.io.File(new java.util.Scanner(System.in).nextLine()));int r=0,g=0,b=0,k=0,x,y;for(x=0;x<i.getWidth();x++)for(y=0;y<i.getHeight();k++){Color c=new Color(i.getRGB(x,y++));r+=c.getRed();g+=c.getGreen();b+=c.getBlue();}System.out.printf("#%06X",0xFFFFFF&new Color(r/k,g/k,b/k).getRGB());}}

কৌশলটির জন্য স্ট্যাক ওভারফ্লোতে এই উত্তরের জন্য ধন্যবাদ String.format

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