看板 C_and_CPP 關於我們 聯絡資訊
小弟最近接了一個要做修色軟體的工作 但前幾天老闆跟我說我的RGB修色功能有問題 他拿我寫的軟體把某張照片的Blue增加, 老闆說我的軟體會把圖片的白色也一併增加 這樣會造成白的不白,黑的不黑 我跟老闆解釋說因為我是把圖片的每一個像素都進行處理,才會這樣 而且這樣不是很正常嗎 這時老闆打開了他目前再用的修色軟體,他的修色軟體再增加Blue的時候 白的依然很白,黑的依然很黑,但其他的顏色都會正常的增加Blue 可是當Blue調整的幅度越來越大時,白與黑也都會漸漸得變成不是原來的顏色 也會有淺淺的藍色在上面,老闆要求我的修正也要跟他那套軟體一樣 可是我不懂圖像色彩,老闆給的提示實在是讓我不知道該怎麼去解決這問題 老闆猜說『我有用Photoshop的色彩平衡研究過, 我再猜應該就是你的程式沒有「保留明度」的關係, 然後我在想我現在用的軟體,應該是修改的顏色只有一點點的話, 那些白色跟黑色都不會動,或者是動的幅度很少, 只有當修改的顏色很大時幅度才會增加的明顯』 色彩平衡,保留明度的圖:http://ppt.cc/7XmV 我的問題好像有點籠統.... 不知道懂圖像的人能不能給我點提示,告訴我修色的功能是缺了什麼部分 我有查過『保留明度』這功能,可是查到的都是HSL的L 可是這跟修改RGB感覺又沒關係... 謝謝各位 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.218.10.18
elfkiller:明度就是光強度 可以用rgb的加權平均評估 10/25 23:02
請問RGB加權平均是說把整個圖像的r、g、b都個別加起來在平均嗎?
bdvstg:就轉過去 然後亮度/明度不要調 調其他的 調完再轉回RGB 10/25 23:02
可是HSL的H是0~360的顏色調整,用那個調整感覺好像會跑到別的顏色去耶@@
elfkiller:所以你要做的事情就是 增加b的比重 但是不要影響光強度 10/25 23:02
bdvstg:(我猜的 我沒弄過) 10/25 23:03
Windancecat:等我修完DIP再跟你說...... 10/25 23:43
好的,謝謝你
EdisonX:有沒有 "原圖"、"你的圖"、"老闆的圖" 參考一下? 10/26 00:00
那時沒想到要把圖帶回來,而老闆那套軟體又只能在他那台電腦執行 因為程式會去檢查某台機器是否是開機狀態,是的話才能執行...不好意思
Schottky:你是怎麼增加 B 的? 用加法 B += offset 嗎? 10/26 00:01
就如果使用者把B增加10,以下是我程式做法 for( int i=0; i<img.width(); ++i) for( int j=0 ; j<img.height(); ++j){ QColor c = img.pixel(i,j); //將指定的座標轉成QColor int valueB = c.blue() + 10; // 取出c的blue並+10 if( valueB > 255 ) //檢察valueB是否有再合理範圍 valueB = 255; else if( valueB <0) valueB = 0; img.setPixel(i,j,c.rgb()); //將c轉成rgb並貼在指定的座標上 }
Schottky:您是不是要找: Gamma correction 10/26 00:01
好的我查查看,謝謝唷 ※ 編輯: googled 來自: 180.218.10.18 (10/26 00:10)
Windancecat:感覺這樣有點陽春欸,要不要用histogram equlization 10/26 00:13
Windancecat:單純在RGB Domain來做好像不會太好 10/26 00:15
Schottky:果然全部直接加, 那當然會變藍... 10/26 00:18
Schottky:你需要的只是在 blue channel 做 gamma correction 而已 10/26 00:18
Windancecat:下一章才要學色彩XD 10/26 00:19
Schottky:Digital Image Processing 是一門好課啊 XD 10/26 00:26
請問一下S大,請問你說的方式是什麼意思? 我剛剛上網查Gamma correction都是在介紹伽瑪的東西, 然後我補上C++或者是RGB當關鍵字也找不太到例子@@ ※ 編輯: googled 來自: 180.218.10.18 (10/26 00:48)
EdisonX:keyword : Gamma校正的快速算法及其C语言实现.pdf 10/26 01:19
linotwo:大概有兩種作法 10/26 06:48
linotwo:1.轉成 YUV 色空間,把像素值向藍色平移,移完再轉回 RGB 10/26 06:49
linotwo:2.由於一般 RGB 會有一個 Gamma 值,使得數值與光強度 10/26 06:51
linotwo:不為正比,因此需要先行將數值轉為線性空間的值,才能算 10/26 06:52
linotwo:通常是從 Gamma 2.2 (sRGB) 轉成 1.0 (線性) 10/26 06:53
linotwo:轉到線性以後把藍色值乘上一個 scale,而非加 offset 10/26 06:55
linotwo:最後再轉回來。須要注意 8-bit 的時候會有肉眼可見的誤差 10/26 06:57
感謝你的回覆,其實第二種方法我看不太懂... 而第一種方法我上網去查轉換的公式 Y=R*0.299+G*0.587+B*0.114; U=R*-0.169+G*-0.332+B*0.5+128; V=R*0.5+G*-0.419+B*0.0813+128; 我不太懂得是既然Y、U、V的轉換都會需要R、G、B 那所謂的把藍色平移是什麼意思@@? 謝謝你 ※ 編輯: googled 來自: 180.218.10.18 (10/27 22:04)
linotwo:要把顏色調向偏藍就把 U 加一個 offset 10/27 22:50
linotwo:參照 http://en.wikipedia.org/wiki/SRGB 10/27 22:51
linotwo:C linear 就是線性空間的值,而 C srgb 則是 gamma 2.2 10/27 22:53