OpenCV简单的图像灰度化

来源:互联网 发布:手机淘宝几天到货 编辑:程序博客网 时间:2024/06/03 22:58

OpenCV简单的图像灰度化

图像灰度化算是数字图像处理中很简单的操作了,这里使用OpenCV简单尝试一下。

简单粗暴的方法:
最简单粗暴的方法只需要一行代码,如下:

Mat mat = imread("Image.jpg", IMREAD_GRAYSCALE);

其中,第一个为图像文件的储存路径,第二个为打开图像的模式。模式总共有以下几种:

enum ImreadModes {       IMREAD_UNCHANGED            = -1,//啥都不做,该咋样咋样       IMREAD_GRAYSCALE            = 0,//转换成灰度图       IMREAD_COLOR                = 1, //转换成3通道RGB颜色       IMREAD_ANYDEPTH             = 2,//       IMREAD_ANYCOLOR             = 4,//加载所有支持的格式,不转换       IMREAD_LOAD_GDAL            = 8,       IMREAD_REDUCED_GRAYSCALE_2  = 16,        IMREAD_REDUCED_COLOR_2      = 17,       IMREAD_REDUCED_GRAYSCALE_4  = 32,        IMREAD_REDUCED_COLOR_4      = 33,        IMREAD_REDUCED_GRAYSCALE_8  = 64,        IMREAD_REDUCED_COLOR_8      = 65,       IMREAD_IGNORE_ORIENTATION   = 128     };

其中,IMREAD_UNCHANGED代表啥都不做,该咋样咋样,IMREAD_GRAYSCALE代表转换成灰度图,IMREAD_COLOR代表转换成3通道RGB颜色图,IMREAD_ANYDEPTH代表如果图像是16/32位的,则原样输出,否则转换为8位灰度图,IMREAD_ANYCOLOR代表加载所有支持的格式,不转换。
因此,只要选择灰度模式,OpenCV就会自动将图片转换为单通道的灰度图,我们就可以直接使用啦~
不过使用OpenCV提供好的代码有点Low,还是自己写吧~


自食其力的方法:
首先要确定RBG通道转换成灰度值的公式:

Gray = (11 * B + 59 * G + 30 * R + 50) / 100;

使用这一公式避免了小数计算,速度比较快。接下来,就可以逐个像素的修改颜色了。首先需要建立一个和原图像大小相等的灰度图像,并且该图像的通道是8位的:

Mat matGray(mat.rows, mat.cols, CV_8UC1);

然后一行行修改,使用ptr()方法获取每一行的头指针:

for (size_t idx = 0; idx < mat.rows; idx++){    uchar *ptr = mat.ptr<uchar>(idx);    uchar *newPtr = matGray.ptr<uchar>(idx);    for (size_t subIdx = 0; subIdx < mat.cols; subIdx++)    {        newPtr[subIdx] = (11 * ptr[subIdx * 3] + 59 * ptr[subIdx * 3 + 1]                            + 30 * ptr[subIdx * 3 + 2] + 50) / 100;    }}

至此灰度化就搞定啦,效果还是不错的~虽说灰度化很简单,但毕竟是数字图像处理入门的第一步嘛~
以此纪念我在数字图像处理上的第一篇文章~

0 0
原创粉丝点击