本系列文章由 @yhl_leo 出品,转载请注明出处。 文章链接: http://blog.csdn.net/yhl_leo/article/details/55270873
使用了很久OpenCV和Matlab中的图像灰度化操作,因为是非常基础的操作又很常见,也就没怎么思考过,直到这些灰度化遇到了一些问题:
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}系数。作者的解法也挺巧妙,值得一看~