이미지의 평균 색상
과학자들은 우주 의 평균 색상 을 결정할 수 있었지만 이미지에서 평균 색상을 몇 바이트로 찾을 수 있습니까?
당신의 작업
입력 한 이미지는 이미지에서 평균 색상을 찾아 16 진수 색상 문자열 ( #??????
)을 출력해야하는 단일 이미지입니다 . 이미지는 다음 형식 중 하나 일 수 있습니다.
- JPEG / JFIF
- JPEG 2000
- 사소한 말다툼
- GIF
- BMP
- PNG
- PNM
- PPM
입력은 이미지에 대한 URL / URI로도 취할 수 있습니다.
평균을 계산하거나 이미지를 한 번에 샘플링하는 내장 기능 ImageMeasurements
은 허용되지 않습니다.
예
평균을 계산하는 방법과 사용하는 색상 모델에 따라 결과가 약간 다릅니다. 아래 이미지에 RGB 및 LCH (HSV) 값을 추가했습니다.
출력 : #53715F
RGB, #3B7D3D
LCH (HSV) 일 수도 있음
출력 : #8B7D41
RGB, #96753C
LCH (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)
fix
sprintf
%x
02
* .
I=imread(uigetfile);
['#' sprintf('%02x',fix(sum(sum(I))*3/numel(I)))]
샘플 실행
좋은 점은 imread
URL에서 직접 이미지를 읽을 수 있다는 것입니다. 재현 가능한 예로, 컴퓨터에서 이미지를 다운로드하고 위의 코드를 실행했다고 가정 해 봅시다. 그러나 데모를 위해 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"