彩色圖片是通過何種演算法變成黑白圖片?
我來補充一個當年二師兄 @盧策吾 的一篇非常有趣的作品:Contrast Preserving Decolorization,已被收錄進OpenCV 3.0及之後的版本中。
簡單來說,目前市面上絕大多數的彩色轉黑白都是通過一個確定的函數Gray=f(R,G,B)將彩色空間映射到灰度空間。然而很容易想到的是,對於任何一個『事先確定好』的映射,我們總是能找到一些『壞』的數據,使得原先還算正常的彩圖變成『很糟糕』的灰度圖。例如:
那麼如果我們換一個思路:這個映射函數本身是根據輸入圖像動態計算出來的。換句話說,對於不同的圖,這個映射函數可以是不一樣的!即使是同一個顏色,在不同的圖像中也可能被映射成不同的灰度。這聽起來似乎有點奇怪,但其實也合理——為什麼非得一樣呢?
於是我們回到問題的源頭來思考:彩色轉黑白的目的是什麼?比如相當常見的一種情況就是印刷。如果產生灰度圖最終的目的是給人(或者某些演算法)來看的話,人們關心的未必是『不同圖片里的同一種顏色必須要映射成同一級灰度』。更多的時候,是『原來彩圖裡的東西(物體、結構)轉換成黑白也要能看得清』。
因此,二師兄這篇文章的重點在於,在轉化映射函數的過程中盡量『保持圖像的對比度不變』。原文的關鍵是一個最高不超過二次的多項式模型,以及一套用來保持對比度的optimization方法,不過我不打算在這裡展開數學細節,大家可以自己慢慢讀文章理解,但保持對比度的這個思路我覺得是相當有意思的。貼幾張效果圖感受一下:彩色圖片,有很多種,不同的顏色空間 RGB/HSI/CMYK/YUV/YCbCr,偽彩色假彩色等;黑白圖片,也有很多種,灰度圖、二值圖、單通道、深度圖。題主的描述是不準確的。這裡只能簡單說一下 」RGB 圖像「轉換為」灰度圖像「的方法。
I = rgb2gray(RGB)
rgb2gray RGB values to grayscale values by forming a weighted sum of the R, G, and B components:
Gray = 0.2989 * R + 0.5870 * G + 0.1140 * B
RGB 按照 0.2989 R,0.5870 G 和 0.1140 B 的比例構成像素灰度值。
OpenCV 中 cv::CvtColor 函數可以轉換 RGB 圖像到灰度圖像。其實 TA 可以轉換各種色彩空間和色彩相關的圖像格式。cvtColor(src, bwsrc, cv::COLOR_RGB2GRAY);
Transformations within RGB space like adding/removing the alpha channel, reversing the channel order, conversion to/from 16-bit RGB color (R5:G6:B5 or R5:G5:B5), as well as conversion to/from grayscale using:
RGB[A] to Gray:Y←0.299?R+0.587?G+0.114?B
RGB 按照 0.299 R, 0.587 G 和 0.114 B 的比例構成像素灰度值。
可以看到不論是學術界還是工業界,對於 RGB 圖像向灰度圖像轉換都是採用近似的經驗公式。該經驗公式主要是根據人眼中三種不同的感光細胞的感光強度比例分配的。
PS. 如果彩色圖像是 YUV 或者 YCbCr 格式,直接提取亮度信號就是灰度圖像。假定你指的是普通的RGB圖片.RGB都是0~255的整數.
彩色變灰度其實就是找一個函數F(R,G,B),值域是灰度,也就是0~255一般的做法就是加權平均,找三個權重r,g,b,然後寫F就是,這裡權重全憑經驗,一般來說g最大,b最小,比如0.3,0.6,0.1當然線性疊加從數學上是沒有什麼科學性可言的,只是憑經驗覺得這樣看起來差不多而已,有的軟體給的RGB轉灰度就不是線性疊加,而是,所以說不同的工具弄出來的灰度圖有可能會不一樣.用大津閾值法,我實現的是二直圖像。你可以看看我寫的效果:用canvas+js寫的,http://www.hongrunhui.cf/photoSplice
float gray = dot( color, float3(0.2989, 0.5870, 0.1140));
彩色圖變灰度圖只需要。。把每個像素的RGB值設置同樣大小即可。。灰度圖邊變二值圖只需要去除灰度圖RGB任意兩個通道。保留一個通道即可。就是說最簡單的黑白圖只需要一個比特位告訴是黑點還是白點就可以了。
其實最重要的沒說,就是閾值的選取。就是說,灰度圖中把RGB設置為怎樣的一個值比較合理?二值圖設置多大的值為黑白分割線,當然最簡單的是(0-255)大於128設置為白點,小於設置為黑點。。但是這種最簡單的方法在處理複雜的圖片是就力不從心了,會丟失很多重要數據。比如遙感圖像識別,航拍圖像,B超X光透視什麼的,還有黑白印表機列印圖片。
簡單來說,把彩圖處理成黑白圖像知道了原理就非常簡單,根本就不需要什麼演算法。
但是確實有很多圖像處理的演算法呀?他們是做什麼的呢,答案就是用於選取閾值。就是說處理成黑白圖片沒什麼技術含量,處理出一張優質的黑白圖像就需要演算法了。把顏色映射成灰度
先放圖 占坑,風塵僕僕的先去擼串。一會回來答。
哦,剛看清,我先說說方法吧。作為一個通信專業的對計算機演算法不是很了解的小學生,我其實就會幾種方法啦,
1:超級簡單的:Word工具, 選中其中一個圖右擊---》找到設置圖片格式-----》圖片-----》顏色-----》灰度2:MATLAB 中的 rgb2gray (彩色to灰度) 函數 具體代碼:(這是hough變換中其中一個小模塊) clc clear close BW=imread("2.jpg"); BW=rgb2gray(BW); thresh=[0.01,0.17];sigma=2;%定義高斯參數
f = edge(double(BW),"canny",thresh,sigma); figure(1),imshow(BW,[]); % title("canny 邊緣檢測"); 3:還有就是opencvMat garyImage ;
cvtColor(src,grayImage,CV_RGB2Gray);
4:PS 4.1因此對於圖像灰度化可以分成matlab矢量化運算如下:
&>&> data = imread("2.jpg");
&>&> Rdata = data(:,:,1); &>&> Gdata = data(:,:,2); &>&> Bdata = data(:,:,3);BW=graydata =0.3*Rdata + 0.59*Gdata + 0.11*Bdata;
imshow(BW );
通過不同灰度值的大小,就可以定義灰度色階的大小,進而描繪出灰度圖像MATLAB中將彩色的圖像轉化為灰度圖像 這個連接有對rgb2gray程序的解讀推薦一款專門把彩圖變為黑白的專業軟體 BLACK WHITE Projects 3 Elements — 不僅僅是黑白單色照片編輯BLACK WHITE Projects 3 Elements 提供了87種微調處理技巧預設,74種專業級濾鏡效果以及37種模擬效果,幫您合成處理獨一無二的擁有完整的16位超高品質的高端黑白單色照片。人性化的界面設計,快捷方便的參數調整,即時預覽合成調整效果,其專業開發的插件亦可用於Adobe Photoshop。(轉換前後對比)正版中國最近在做限免,感興趣的小夥伴可以戳下面的鏈接BLACKWHITE Projects 3 Elements-打造完美的黑白照片【正版中國】
這是用ps處理的,肯定不是簡單的處理一下而已
MATLAB裡面就有一個函數吧,reb2gray(),將R,G,B按照一定權重轉化為gray level,這個權重你也可以自己設定咯,看你想把圖片變成什麼樣的黑白圖片了,因為在不同的應用領域所需要的肯定是不一樣的,具體可以看看那本書,叫啥來著?《Digital Image Process》?只記得裡面那張圖片的舉手。
推薦閱讀:
※用OpenCV處理圖圖片,只顯示圖片中的黃色乒乓球,其他區域為黑色?
※我目前是研一的計算機視覺學生,我的課題是醫學圖像的分割,但我在matlab opencv itk徘徊?
※NUFFT的計算難點在哪裡?
※為什麼用圖像二維傅里葉變換的相位譜進行反變換,能夠大致得到原圖的形狀,而幅度譜則不行呢?