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