이미지의 평균 색상 이미지에서 평균 색상을 찾아

이미지의 평균 색상

과학자들은 우주 의 평균 색상 을 결정할 수 있었지만 이미지에서 평균 색상을 몇 바이트로 찾을 수 있습니까?

당신의 작업

입력 한 이미지는 이미지에서 평균 색상을 찾아 16 진수 색상 문자열 ( #??????)을 출력해야하는 단일 이미지입니다 . 이미지는 다음 형식 중 하나 일 수 있습니다.

  • JPEG / JFIF
    • JPEG 2000
  • 사소한 말다툼
  • GIF
  • BMP
  • PNG
  • PNM
    • PPM

입력은 이미지에 대한 URL / URI로도 취할 수 있습니다.

평균을 계산하거나 이미지를 한 번에 샘플링하는 내장 기능 ImageMeasurements은 허용되지 않습니다.

평균을 계산하는 방법과 사용하는 색상 모델에 따라 결과가 약간 다릅니다. 아래 이미지에 RGB 및 LCH (HSV) 값을 추가했습니다.

샘플 1출력 : #53715FRGB, #3B7D3DLCH (HSV) 일 수도 있음


샘플 2출력 : #8B7D41RGB, #96753CLCH (HSV)



답변

Pyth- 23 22 19 18 16 바이트

모든 채널을 얻기 위해 조옮김 한 다음 각 채널을 합산, 나누기 및 16 진수로 변환합니다. 을 연결하고 앞에 붙여서 완료합니다 #.

+\#sm.H/sdldCs'z

stdin에서 이미지 파일 이름 (모든 유형)을 가져 와서 stdout으로 출력합니다. 매우 느리다 .

+               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


답변

배쉬, 46 바이트

ImageMagick은 이미지의 평균 색상을 포함하는 하나의 픽셀로 이미지의 크기를 조정 한 다음 텍스트로 출력합니다.

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


답변

MATLAB-68 바이트

이미지가와에서 읽기 imread와 결합 uigetfile에 부하에 원하는 이미지를 선택하기 위해 GUI를 엽니 다.이 코드 가정은 모든 이미지는 RGB, 그리고 평균 색상을 계산하는 것입니다, 우리는 개별적으로 다음 나누어 각 채널을 통해 요약 RGB 이미지 ( ) 의 총 픽셀 수인 3을 3으로 나눈 한 채널에있는 요소 수 만큼. . 16 진 형식화 문자열 ( ) 과 결합 하여 평균적으로 각 정수 값을 16 진으로 인쇄하는 데 사용됩니다. 그러나 채널의 평균값이 16보다 작 으면 여분의 0이 왼쪽에 채워지도록합니다.numel(I)fixsprintf%x02* .

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

샘플 실행

좋은 점은 imreadURL에서 직접 이미지를 읽을 수 있다는 것입니다. 재현 가능한 예로, 컴퓨터에서 이미지를 다운로드하고 위의 코드를 실행했다고 가정 해 봅시다. 그러나 데모를 위해 Code Golf에서 직접 이미지를 읽겠습니다.

첫 이미지

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

* 참고 : 이는 MATLAB 및 Octave 대화방 에서 StackOverflow 사용자가 수행 한 공동 작업 입니다.


답변

CJam, 27 바이트

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

STDIN에서 PPM 이미지를 읽습니다.

CJam에는 이미지 처리 기능이 내장되어 있지 않기 때문에이 코드는 완전한 24 비트 팔레트 (최대 값 255)와 주석이없는 ASCII Portable PixMap (매직 번호 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.


답변

HTML5 + 자바 스크립트 (ES6), 335 바이트

이것은 이길 수는 없지만 어쨌든 재미있게했습니다.

HTML5 Canvas API를 사용합니다 . 입력은 CORS 가능 이미지 의 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이므로 현재 Firefox 및 Edge에서만 작동합니다.

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] + SciPy, 144 (133) 121

픽셀 데이터를로드하고 각 채널의 합계를 크기 *로 나눕니다. 값은 0으로 반올림됩니다.

* size = width * height * 채널에 3을 곱한 값

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


답변

R, 90 바이트

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

PNG 파일의 경로는 STDIN에서 읽습니다. 패키지 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"