[問題] 圖像的RGB修色問題

看板C_and_CPP作者 (15357)時間11年前 (2013/10/25 14:57), 編輯推噓7(7018)
留言25則, 6人參與, 最新討論串1/2 (看更多)
小弟最近接了一個要做修色軟體的工作 但前幾天老闆跟我說我的RGB修色功能有問題 他拿我寫的軟體把某張照片的Blue增加, 老闆說我的軟體會把圖片的白色也一併增加 這樣會造成白的不白,黑的不黑 我跟老闆解釋說因為我是把圖片的每一個像素都進行處理,才會這樣 而且這樣不是很正常嗎 這時老闆打開了他目前再用的修色軟體,他的修色軟體再增加Blue的時候 白的依然很白,黑的依然很黑,但其他的顏色都會正常的增加Blue 可是當Blue調整的幅度越來越大時,白與黑也都會漸漸得變成不是原來的顏色 也會有淺淺的藍色在上面,老闆要求我的修正也要跟他那套軟體一樣 可是我不懂圖像色彩,老闆給的提示實在是讓我不知道該怎麼去解決這問題 老闆猜說『我有用Photoshop的色彩平衡研究過, 我再猜應該就是你的程式沒有「保留明度」的關係, 然後我在想我現在用的軟體,應該是修改的顏色只有一點點的話, 那些白色跟黑色都不會動,或者是動的幅度很少, 只有當修改的顏色很大時幅度才會增加的明顯』 色彩平衡,保留明度的圖:http://ppt.cc/7XmV 我的問題好像有點籠統.... 不知道懂圖像的人能不能給我點提示,告訴我修色的功能是缺了什麼部分 我有查過『保留明度』這功能,可是查到的都是HSL的L 可是這跟修改RGB感覺又沒關係... 謝謝各位 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.218.10.18

10/25 23:02, , 1F
明度就是光強度 可以用rgb的加權平均評估
10/25 23:02, 1F
請問RGB加權平均是說把整個圖像的r、g、b都個別加起來在平均嗎?

10/25 23:02, , 2F
就轉過去 然後亮度/明度不要調 調其他的 調完再轉回RGB
10/25 23:02, 2F
可是HSL的H是0~360的顏色調整,用那個調整感覺好像會跑到別的顏色去耶@@

10/25 23:02, , 3F
所以你要做的事情就是 增加b的比重 但是不要影響光強度
10/25 23:02, 3F

10/25 23:03, , 4F
(我猜的 我沒弄過)
10/25 23:03, 4F

10/25 23:43, , 5F
等我修完DIP再跟你說......
10/25 23:43, 5F
好的,謝謝你

10/26 00:00, , 6F
有沒有 "原圖"、"你的圖"、"老闆的圖" 參考一下?
10/26 00:00, 6F
那時沒想到要把圖帶回來,而老闆那套軟體又只能在他那台電腦執行 因為程式會去檢查某台機器是否是開機狀態,是的話才能執行...不好意思

10/26 00:01, , 7F
你是怎麼增加 B 的? 用加法 B += offset 嗎?
10/26 00:01, 7F
就如果使用者把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並貼在指定的座標上 }

10/26 00:01, , 8F
您是不是要找: Gamma correction
10/26 00:01, 8F
好的我查查看,謝謝唷 ※ 編輯: googled 來自: 180.218.10.18 (10/26 00:10)

10/26 00:13, , 9F
感覺這樣有點陽春欸,要不要用histogram equlization
10/26 00:13, 9F

10/26 00:15, , 10F
單純在RGB Domain來做好像不會太好
10/26 00:15, 10F

10/26 00:18, , 11F
果然全部直接加, 那當然會變藍...
10/26 00:18, 11F

10/26 00:18, , 12F
你需要的只是在 blue channel 做 gamma correction 而已
10/26 00:18, 12F

10/26 00:19, , 13F
下一章才要學色彩XD
10/26 00:19, 13F

10/26 00:26, , 14F
Digital Image Processing 是一門好課啊 XD
10/26 00:26, 14F
請問一下S大,請問你說的方式是什麼意思? 我剛剛上網查Gamma correction都是在介紹伽瑪的東西, 然後我補上C++或者是RGB當關鍵字也找不太到例子@@ ※ 編輯: googled 來自: 180.218.10.18 (10/26 00:48)

10/26 01:19, , 15F
keyword : Gamma校正的快速算法及其C语言实现.pdf
10/26 01:19, 15F

10/26 06:48, , 16F
大概有兩種作法
10/26 06:48, 16F

10/26 06:49, , 17F
1.轉成 YUV 色空間,把像素值向藍色平移,移完再轉回 RGB
10/26 06:49, 17F

10/26 06:51, , 18F
2.由於一般 RGB 會有一個 Gamma 值,使得數值與光強度
10/26 06:51, 18F

10/26 06:52, , 19F
不為正比,因此需要先行將數值轉為線性空間的值,才能算
10/26 06:52, 19F

10/26 06:53, , 20F
通常是從 Gamma 2.2 (sRGB) 轉成 1.0 (線性)
10/26 06:53, 20F

10/26 06:55, , 21F
轉到線性以後把藍色值乘上一個 scale,而非加 offset
10/26 06:55, 21F

10/26 06:57, , 22F
最後再轉回來。須要注意 8-bit 的時候會有肉眼可見的誤差
10/26 06:57, 22F
感謝你的回覆,其實第二種方法我看不太懂... 而第一種方法我上網去查轉換的公式 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)

10/27 22:50, , 23F
要把顏色調向偏藍就把 U 加一個 offset
10/27 22:50, 23F

10/27 22:51, , 24F
10/27 22:51, 24F

10/27 22:53, , 25F
C linear 就是線性空間的值,而 C srgb 則是 gamma 2.2
10/27 22:53, 25F
文章代碼(AID): #1IQeRFTg (C_and_CPP)
文章代碼(AID): #1IQeRFTg (C_and_CPP)