最近在做一個作業是要處理圖片讓他變成互補色
根據維基百科的說法:
互補色(對比色)是成對的顏色,當組合時,相互抵消。這意味著當組合時,它們會產生灰階色彩,如白色或黑色。當彼此相鄰放置時,它們會為這兩種特定顏色創造最強烈的對比度。由於這種顯著的顏色衝突,對比色或相反色等術語通常被認為比「互補色」更合適。
概念懂,但是實作又發現完全不懂,到底怎麼樣得到互補色?
然後找到了這篇
https://www.coder.work/article/1253704
我不確定這是不是對的,然後也不知道他的運作原理...
總之...求解
其實你已經講出了答案:
https://www.coder.work/article/1253704
作法更細緻,它不使用0~255 or 256,而是使用原圖的min/max為範圍:
# 對每個像素每個顏色通道計算最大值/最小值
lo = np.amin(in_data, axis=2, keepdims=True)
hi = np.amax(in_data, axis=2, keepdims=True)
out_data = (lo + hi) - in_data
效果還不錯喔,完整程式:
import numpy as np
from PIL import Image
def complement_image(iname, oname):
print('Loading', iname)
img = Image.open(iname)
#img.show()
in_data = np.asarray(img)
#print(in_data.shape)
# 對每個像素每個顏色通道計算最大值/最小值
print('Complementing...')
lo = np.amin(in_data, axis=2, keepdims=True)
hi = np.amax(in_data, axis=2, keepdims=True)
out_data = (lo + hi) - in_data
out_img = Image.fromarray(out_data)
#out_img.show()
out_img.save(oname)
print('Saved to', oname)
complement_image('./bird.jpg', './bird_complement.jpg')
from IPython.display import Image
Image('./bird_complement.jpg', width=500)
原圖片:
互補圖片:
那...為什麼(lo + hi) - in_data就會是互補
axis=2 是指圖片的RGB通道嗎
np.amin(in_data, axis=2, keepdims=True)
這行要怎麼解釋 想要更細一點的解析
注意看這兩張圖黑色的部分還是黑色
至於這種調整方式算不算是互補我就不知道了
也許這種算法在 HSV 那種色彩空間剛好能把 hue 轉 180 度
amin的計算看的出來是圖片每個pixel的位置他rgb裡面取min值
最後的疑問就是 為什麼min+max-img可以變成那樣
效果我是蠻喜歡的,可能有奇用,但是還是想知道為什麼
參考:HSL、HSV色彩空間
由於 S,L(或 S,V)只跟 max, min 有關
所以保持 max 跟 min 時,這兩個值不會變
再研究一下色相(Hue)的部分
可以推導出上面的轉換式是讓色相轉180度
(過程很難用打字表達,所以省略)
這跟相反色不同的地方是,相反色的亮度會反轉
而這種轉換方式不反轉亮度
好的 謝謝解說
我再研究一下,可能要多寫一些小lab,了解他們之間的關係才能理解
好複雜><