本系列文章由 @yhl_leo 出品,轉載請注明出處。 文章鏈接: http://blog.csdn.net/yhl_leo/article/details/55270873
使用了很久OpenCV和Matlab中的圖像灰度化操作,因為是非?;A的操作又很常見,也就沒怎么思考過,直到這些灰度化遇到了一些問題:
| Original Image | Color2Gray |
 |  |
 |  |
OpenCV和Matlab中灰度化的方法都非常簡單:
| Y=0.2989×R+0.5870×G+0.1140×B |
很明顯,這種線性灰度化方法用于解決這一非線性問題,有些時候會導致圖像對比度嚴重損失。
看到OpenCV3.x中集成了新的灰度化方法decolor:
void decolor(InputArray src, OutputArray grayscale, OutputArray color_boost)用法很簡單:#include <opencv2/opencv.hpp>using namespace cv;int main(){ Mat src = imread("test.png"); Mat grayScale, color_boost; decolor(src, grayScale, color_boost); imshow("test", grayScale); waitKey(0); return 0;}差異立竿見影!
找到原論文:Contrast PReserving Decolorization, ICCP 2012,方法也很簡單,相比于簡單的使用R/G/B線性組合,作者構造了更為復雜的多項式擬合,向量空間的基底為:[r,g,b,rg,rb,gb,r2,g2,b2],核心就是求取灰度化函數:
f(r,g,b;w)=∑iwimi
其中mi是向量空間的第i個基底,于是灰度化問題就轉化為求解9個{w}系數。作者的解法也挺巧妙,值得一看~