iT邦幫忙

0

如何讓圖片變成互補色

最近在做一個作業是要處理圖片讓他變成互補色
根據維基百科的說法:
互補色(對比色)是成對的顏色,當組合時,相互抵消。這意味著當組合時,它們會產生灰階色彩,如白色或黑色。當彼此相鄰放置時,它們會為這兩種特定顏色創造最強烈的對比度。由於這種顯著的顏色衝突,對比色或相反色等術語通常被認為比「互補色」更合適。

概念懂,但是實作又發現完全不懂,到底怎麼樣得到互補色?

然後找到了這篇
https://www.coder.work/article/1253704

我不確定這是不是對的,然後也不知道他的運作原理...
總之...求解

看更多先前的討論...收起先前的討論...
淺水員 iT邦研究生 2 級 ‧ 2021-04-09 00:50:35 檢舉
有指定使用哪個套件處理嗎?還是禁用套件從頭自己寫?

有套件用的話先看該套件的說明文件

自己寫的話很麻煩,因為每種圖檔格式都不一樣,要讀取每個像素的顏色,轉換後再放回去,作業量很可怕...
tp655998 iT邦新手 5 級 ‧ 2021-04-09 00:55:37 檢舉
沒限制,不過需要知道他在做什麼
tp655998 iT邦新手 5 級 ‧ 2021-04-09 01:09:03 檢舉
處理成互補色是直接對每個RGB值去做(255-value)的運算就好嗎?
還是什麼...

類似這種?
https://www.includehelp.com/python/find-complementary-image-of-the-rgb-image.aspx
淺水員 iT邦研究生 2 級 ‧ 2021-04-09 01:11:44 檢舉
你給的連結,他轉換顏色的函式寫在 def complement(r, g, b) 那邊
不過他的算法跟你要的不一樣
你需要的只是把每個顏色值用 255 去減就可
淺水員 iT邦研究生 2 級 ‧ 2021-04-09 01:12:15 檢舉
是的,直接 255-value 就可以了
RGB xor FFFFFF
ARGB xor FFFFFFFF
在各種語言裡取點改色的方法不盡相同,也有GDI+的方法可以直接做圖片處理(反相),但這可能會超過你課程的學習要求就....自行參考了
http://www.vcskicks.com/image-invert.php

1 個回答

2
I code so I am
iT邦研究生 2 級 ‧ 2021-04-09 16:47:04
最佳解答

其實你已經講出了答案:

  1. 白色RGB:(255, 255, 255)
    原圖片+互補圖片=255
  2. 黑色RGB:(0, 0, 0)
    原圖片+互補圖片=256
  3. 灰階RGB:255
    原圖片+互補圖片=255

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)    

原圖片:
https://ithelp.ithome.com.tw/upload/images/20210409/20001976faSnr0mFdB.jpg
互補圖片:
https://ithelp.ithome.com.tw/upload/images/20210409/20001976Fjq7OUKAWE.jpg

看更多先前的回應...收起先前的回應...
tp655998 iT邦新手 5 級 ‧ 2021-04-09 19:22:34 檢舉

那...為什麼(lo + hi) - in_data就會是互補
axis=2 是指圖片的RGB通道嗎

np.amin(in_data, axis=2, keepdims=True)
這行要怎麼解釋 想要更細一點的解析

淺水員 iT邦研究生 2 級 ‧ 2021-04-09 19:52:40 檢舉

注意看這兩張圖黑色的部分還是黑色
至於這種調整方式算不算是互補我就不知道了
也許這種算法在 HSV 那種色彩空間剛好能把 hue 轉 180 度

tp655998 iT邦新手 5 級 ‧ 2021-04-09 20:43:18 檢舉

amin的計算看的出來是圖片每個pixel的位置他rgb裡面取min值
https://ithelp.ithome.com.tw/upload/images/20210409/20128767iB2Ng1BpJS.jpg

最後的疑問就是 為什麼min+max-img可以變成那樣
效果我是蠻喜歡的,可能有奇用,但是還是想知道為什麼

淺水員 iT邦研究生 2 級 ‧ 2021-04-10 14:27:34 檢舉

參考:HSL、HSV色彩空間
由於 S,L(或 S,V)只跟 max, min 有關
所以保持 max 跟 min 時,這兩個值不會變
再研究一下色相(Hue)的部分
可以推導出上面的轉換式是讓色相轉180度
(過程很難用打字表達,所以省略)

這跟相反色不同的地方是,相反色的亮度會反轉
而這種轉換方式不反轉亮度

tp655998 iT邦新手 5 級 ‧ 2021-04-10 16:15:05 檢舉

好的 謝謝解說
我再研究一下,可能要多寫一些小lab,了解他們之間的關係才能理解
好複雜><

我要發表回答

立即登入回答