為什麼對足夠多的相片進行顏色收集,最後拼湊在一起會呈橙色?

Bumgardner 的演算法和結果:

&> Bumgardner』s algorithm averaged the photos by looking at the different red, green, and blue (RGB) components of the pixels of the images. Each color of a photo corresponded to a number, ranging from 0-360 degrees on the color wheel. For instance, one spot on an image might be coded as (10, 67, 111). Bumgardner』s algorithm would take these RGB values, add up the Rs, the Gs, and the Bs, and divide by the number of images used. This would create the composite image with the average color from every spot on each photo. But it wasn』t the algorithm that was off—orange was the result.

&> The theoretical neurobiologist Mark Changizi suggested it might be 「some funny artifact of how images are coded and/or how the averaging is done.」 Dave Chappell, a physicist at the University of La Verne, guessed that Bumgardner might be onto something with the way humans perceive color. Craig Kaplan, a researcher in the Computer Graphics Lab at the University of Waterloo, told me, 「in the years since Bumgardner produced his first bronze shield, I have not yet seen a convincing explanation for emergent orange.」

The Color of Every Photo on the Internet Blended Together is... Orange?


這算什麼啊?還有那麼多答案像模像樣地分析了起來,心理學、相機白平衡演算法、後期技術都出來了...
要我評論為什麼是橙色那就四個字:莫名其妙
1. 用膝蓋想也知道所有圖片平均起來不可能是橙色;
2. 我是很好奇,他是怎麼平均圖片才能得到中間是一個圓餅的結果的?這要說沒有人工篩選過圖片打死我也不相信(原文里寫著是從 Circle Squares 庫里選的,但還不能讓人信服);
3. 又沒公布演算法,又沒公布數據源,這種結論誰信啊?這種牛逼我小侄子都能吹得更好
4. 源地址文章里有一個 youtube 的視頻,我暫時翻不了牆,但從視頻截圖看,似乎是將一堆人臉圖片平均了然後得到橙色——這不是廢話嗎?(歡迎有能翻牆的同學搬運一下或者解說一下)

那麼所有圖片平均起來到底是什麼顏色的?Talk is cheap, show me the code. 好那就開擼
首先得獲得足夠的圖片,google 和百度的圖片搜索是個好來源,不過他們的防爬蟲機制我還沒怎麼搞明白,寫的幾個簡單的腳本輕鬆被他們幹掉了。好吧,換一個,先從我的圖蟲首頁上爬一些圖來看看吧

抓下來了204張圖,然後把他們平均一下。祭出萬能的 matlab!

好了,跑一下看看結果:

蛋蛋的粉紅色!萌萌噠!有木有!好吧其實說起來還是灰白的只是偏一點點粉紅罷了。
那看看別的圖片集吧,人人網的相冊實在很好抓,那就拿人人相冊里的圖來做實驗好了。我從人人網上爬了幾百個相冊,隨便挑幾個來試試
比如有個叫「深呼吸」的相冊:

很明顯這是個風光的相冊,所以平均的結果是綠色的。
再來一個羅曉韻(這也是一位女神級的人物)的自拍的相冊:

這是橙色的,要說為什麼,顯然,這是一個自拍的相冊
再來看一個國家地理的圖片精選相冊:

這次是藍紫色的,尤其是上半部分,容易想到這是因為有很多天空的圖片罷了。看在我上班期間放著一堆 bug 沒有改正事不幹跑來答題還專門寫了代碼這種精神是不是也該給個贊啊...
啊補充一個,建築效果圖的相冊:

很明顯上半部分是藍天下半部分是地面,色調也不一樣


幾點需要說清楚,首先就是演算法,提問者弄錯了人家的演算法(請看題目的也去看看英文原文謝謝),人家是將每個像素的RGB值加在一起再取平均值這麼做出的圖,而不是拼湊在一起,再縮小了看。
其次,關於效果圖,那效果圖是因為人家取的是 squared circle 的圖,那個相冊的圖都是這樣的:

這樣的圖取顏色平均值,不說什麼顏色,有個圈是肯定的。
他自己還寫了這麼個文章:http://jbum.com/papers/EmergentOrange_paper.pdf
其實我覺得……他應該放出源碼讓大家都玩玩……


反對 @章佳傑的答案,會做個圖像處理演算法也不要這麼秀優越感吧。
本著Talk is cheap, show me the code的精神給作者Jim Bumgardner發了個郵件,沒想到很快收到了郵件和大部分原始代碼。代碼和簡單求RGB通道的平均值有一些細節上的不同。
----------------------------------
太晚了先貼一其中一封佔個坑,明天分享一下代碼。
----------------------------------
8.22更新:來回發了幾封郵件,包括:作者對演算法的基本描述、作者的原始代碼(用Process寫的)以及第二天發給我的python的一個簡易版程序。經徵得作者同意,貼一下作者對演算法的描述的郵件和python的程序的郵件。python程序我放在Gist上了,地址:amalgamTest.py(我自己還沒有試過,求試過的人發表一下效果)
貌似報道被發表之後作者也收到了不少郵件,可能後續還會有更詳細的細節放出。
第一封郵件可以看出,基本的演算法就是大家預想的逐像素對RGB通道分別對所有圖像上的對應值求平均。但有一個被報道忽略的細節是作者對平均後的每個像素的RGB進行了歸一化(normalize):對於所有圖像的同一個位置的像素,不區分RGB,取出最大值和最小值,然後對平均後的RGB都用這個最大值最小值做歸一化。說的不太清楚,細節可以看代碼和郵件。作者也說道橙色效果很大程度上來自歸一化。
關於這個現象的解釋,首先肯定和歸一化的做法有關,作者自己說

Normalizing the image has the effect of increasing the saturation and the contrast, without affecting the hue in an HSL sense.

這個說法我覺得還需要確認一下。 @Albert Young的一個評論給了一些線索:一般藍色都比較少,歸一化中這麼減一個最小值導致藍色的比例降低太多,於是問題就變成了為什麼藍色一般都比較少-_-!。
如果作者的說法正確的話,我個人覺得也不必意外,顏色平均不一定就是純灰色。一般考慮影響照片顏色的主要三個因素:陽光的光譜、物體的反射譜、相機CMOS的接收譜,陽光光譜本身就不是平均分布,在暖色波段就是比較強一點;物體的反射譜各不相同,但從特徵空間的角度來想,自然界中物體的反射譜在反射譜的空間中的分布肯定也不是均勻的,可能就會集中分布在某個子空間區域附近,而這個區域平均起來可能恰好就會呈現某種顏色。(我對光學的了解不太深,如果說的不對還請指出)
作者的郵件還附了幾張他自己生成的圖像:
兩張圖平均:

10張圖平均

10張圖平均和歸一化

100張圖平均和歸一化

Jim Bumgardner
11:04 PM (44 minutes ago)
to me
I"ll
describe the algorithm here (using Processing), since it"s easily
reproduced in your language of choice (if you"d like a Python/PIL
version, I can probably crank one out pretty quickly):
To
avoid floating point rounding issues, I process the pixels in integer
space. For each channel (R,G,B) I create an 1D array of integers (one
integer for each pixel) and initialize them to zero.

smaxPixels = width*height;
srmap = new int[smaxPixels];
sgmap = new int[smaxPixels];
sbmap = new int[smaxPixels];
for (int i = 0; i &< smaxPixels; ++i) { srmap[i] = 0; sgmap[i] = 0; sbmap[i] = 0; }

For each pixel in each image, I add the pixel
value to the sum for the corresponding pixel (in the below code,
"offset" is typically zero).

for (int i = 0; i &< smaxPixels; ++i) { int px = sImage.pixels[i]; srmap[i] += red(px); sgmap[i] += green(px); sbmap[i] += blue(px); }

I then produce a normalized image by finding the minimum and maximum components, and mapping all the pixel sums to that range.

for (int i = 0; i &< smaxPixels; ++i) { minValue = min(minValue, srmap[i]); maxValue = max(maxValue, srmap[i]); minValue = min(minValue, sgmap[i]); maxValue = max(maxValue, sgmap[i]); minValue = min(minValue, sbmap[i]); maxValue = max(maxValue, sbmap[i]); } pg.beginDraw(); // pg is an offscreen Image buffer I am going to draw into... pg.loadPixels(); for (int i = 0; i &< smaxPixels; ++i) { if (maxImagesPerTile == 1) pg.pixels[i] = color(srmap[i],sgmap[i],sbmap[i]); else pg.pixels[i] = color( map(srmap[i],minValue,maxValue,0,255), map(sgmap[i],minValue,maxValue,0,255), map(sbmap[i],minValue,maxValue,0,255)); } pg.updatePixels(); pg.endDraw();

That"s
the essence of it. The bright "orange" is a normalization effect.
Note that if I were to simply "average" the images without the
normalization step, the resulting color is generally a dirt-brown.
Normalizing the image has the effect of increasing the saturation and
the contrast, without affecting the hue in an HSL sense. I discuss this
in my paper, although the Atlantic article omitted this important
point.
This
will work with any sufficiently large collection of uncorrelated images
of the same size. See the following youtube movie to see the layering
in action.
https://www.youtube.com/watch?v=9JMcOa0M_CI
Attached
is a Processing script (ImageAveragingTest) that processes a collection
of images and has options for trying other color spaces, this was the
script used to produce the frames for the movie. I worked with a
collection of 10,000 Flickr thumbnails.
- Jim

Jim Bumgardner
11:35 PM (10 minutes ago)
to me
You
can repost this - I also posted it in a Hacker News discussion list.
I"ve had a few similar requests since the Atlantic article came out,
and I"d like to put together a more straightforward example using Python
that includes a sample image set. I"ll try to get that done this week -
the challenge is making the image set small enough so it won"t kill my
server.
Jim


你不覺得這是皮膚的顏色嗎? Flickr里大多是人物照吧。這只是我的想法,非專業,僅供參考。


謝邀!
很有意思的研究, 初步的感覺應該和相機cmos成像的白平衡演算法,還有色溫曲線的非平均分布有關。
出差中,手頭沒有更多資料,就先佔個坑吧。


謝邀

看了下鏈接里這個人的演算法

Bumgardner』s algorithm averaged the photos by looking at the different red, green, and blue (RGB) components of the pixels of the images. Each color of a photo corresponded to a number, ranging from 0-360 degrees on the color wheel. For instance, one spot on an image might be coded as (10, 67, 111). Bumgardner』s algorithm would take these RGB values, add up the Rs, the Gs, and the Bs, and divide by the number of images used. This would create the composite image with the average color from every spot on each photo. But it wasn』t the algorithm that was off—orange was the result.

大概就是求了一張圖裡每個像素點的RGB,然後按照比例把這顏色平均地混在一起,做出一張新的-代表原照片的單色照片(並非直接把照片混起來)

說白了就是這裡面所有照片平均RGB過後,最接近橙色而已(假設正確)。
橙=紅+黃,黃=紅+綠
也就是說這些照片里紅綠色比較多。

大概就是日常中我們看到的顏色,紅綠的比例比較大導致的。

  1. 陽光:很顯然,陽光就和橙色有很直觀的聯繫(也包括一部分燈光)
  2. 濾鏡:包括很流行的lomo,日系,老照片風格等等。似乎都很流行加高黃綠色,這大概也是原因之一。(尤其是考慮到大部分社交網路大概都是手機直發。不少人手機都喜歡做個效果,而且手機也沒法做到高曝光補償等提高亮度/飽和度的做法)
  3. 膚色:這個我倒是覺得不算很嚴重。首先人物照片並非那麼大比重(別忘了還有衣服呢!),作者也談到了裡面有好多天空照片,不過結果還是橙色的。相比陽光的反射什麼的,直觀上覺得沒有那麼大影響

- - -
更新:看了樓下 @章佳傑 的答案,感覺算是終結了包括我的各種yy
不懂matlab,不知道演算法的概念是不是:抓取一張圖裡每個像素的RGB,加起來,按照得出數字的顏色比例做出一張新的-代表原照片的單色照片。(但那為什麼會有上藍下綠的情況呢?

- - -

更新:章的實驗演算法是疊加後再求平均,在我的理解里這和Bumgardner的演算法並不一樣(而且會受解析度的影響)

- - -

更新:讀了下Bumgardner的paper:

For example, given 25 images, the red component of pixel[x,y] would be
produced by averaging the red components of each of the 25 pixels in the same
position in each of the 25 images

Publications by Jim Bumgardner


步驟和 @章佳傑 的近乎一樣:平均每一個像素點上所有照片的RGB——這也解釋了為什麼會有環形出現(因為squared circle系列圖片都是一堆圓環)

最開始我理解為:抓一張圖裡所有像素點的RGB,加起來再除以像素個數,做成單色圖片,然後拼貼(實際上對於普通的隨機照片來說,結果是一樣的——都是幾個顏色不同的像素點RGB相加然後平均而已。不過對於squared circle這樣的統一圓環狀照片來說就形成不了那個圈,但是顏色依舊是橙色,假設抓去演算法正確的話)

這裡放一張Bumgardner paper裡面隨機照片生成的結果對比

而Bumgardner和章的區別是


1. 解析度

Bumgardner用的都是同等解析度的圖片:這樣就避免了出現抽取自拍相冊的時候發生的中心部分有很多素材而周邊部分沒有。

不過這沒關係,我們可以只看中心部分


2. 數量

Bumgardner得到的「全橙」圖片是疊了625張照片才做到的。而章只用了204張(第一張圖)——而且可以看到除了「深呼吸」相冊以外,中心部分都有點發橙——至少有粉紅的傾向,而Bumgardner只疊了25張的時候橙色也不怎麼明顯。

至於為什麼「深呼吸」相冊全是綠的,大概就是因為裡面的原圖全是綠的。。

反之,Bumgardner的圖的場景是各色的。


3. 調色

沒什麼可說的——他調了飽和度


看了一樓的答案有幾點不得不說

首先的確通過一個圖庫就說明所有圖片的確不太對,但所有圖片的平均是橙色也不是不可能

從理論上來說,如果全世界圖片是顏色均勻分布的,那麼rgb的平均值就是128、128、128了. 那麼就是灰色!

但是!圖片往往來自於對美的需求,所以所有圖片不會完全平均的分布在每個rgb上,而後期做過都知道,大部分圖片暖色調或者說偏紅色的色調會讓圖片更有味道,就比如大家比較喜歡lomo效果一個道理. 那麼最後平均出來是橙色也不是沒可能的

不過那只是一個比方,並不是要以偏概全的意思,只是說明下研究結論的某個可能性而已

所以可能時代技術和時代審美都會影響當時的平均色,就像彩色照片出來之前,平均一定是灰色大家都沒意見一樣~

另外一樓的演算法與po主的明顯也不一樣哇


猜想:因為色溫高一些的圖更讓人們喜歡。


照片顏色加在一起不會是橙色而是隨機顏色吧


說明你的樣本里借著自然光或類自然光拍的照片比較多嘛。


這個顏色么,就是 rgb(90%,60%,50%)
按照他的演算法是每個像素的顏色值和的平均數。
就是說在這個相冊內 RGB 三色的比例就是如此。


很簡單,一般鏡頭的濾膜或濾鏡會過濾掉一些紫外線和藍色(懂攝影的都知道),在單位化時就會偏向暖色。相反的有特殊濾膜或濾鏡會過濾紅外線,有能力的可以做實驗試試


人的膚色、陽光、暖光都接近橙色

此外,顏料里所有顏色放在一起混合,最終得出 咖啡色→褐色→黑色,顯示器里恰恰相反,RGB混合後接近 灰色→白色。


把無限個純黃色的圖片拼起來,不是橙色。
把無限個純黑色的圖片平起來, 是黑色
把無限個純黃色和純藍色混勻了,是綠色
把無限個純黑色和純白色混勻了,是灰色
這個是橙色,我認為,是照片單位中,黃色和紅色基數的顏色佔比例高的結果。
按顏料調色原理猜測的。摺疊我把。


我是建築師。邀請我的問題有演算法,我能說我只會logo語言么?


謝邀。即使完全是個門外漢,第一次被邀請怎麼也要憋出一個相對合理的答案。
在解決這個問題之前,我們需要確定這樣一個事實,大量相片的拼接不是自然界顏色的均勻混合,而是人類所喜好的圖像中主要顏色的混合。換句話說,所有照片都是人拍出來的,而不是在自然界隨機抓取的。所以這其中包含了大量人類的主流審美和主觀選擇因素,而並不是一個合格的自然樣本。所以造成題中實驗結果的原因基本可以推測為:

人類偏好暖色。

而恰巧暖色的均勻混合就是橙色偏黃。


聽說通過鏡頭照出來的相片本來就偏橙色,這原因??


推薦閱讀:

為什麼嘴吸iphone充電口會有菠蘿的味道?
牛頓提出三大定律的時候真的被蘋果砸了么?如果沒有這個說法有何典故么
有哪些有趣的物理定理?

TAG:顏色 | 物理學 | 相片 |