灰度化
代码如下(示例):
#include<iostream>
#include<Windows.h>
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;
#define MIN2(a, b) ((a) < (b) ? (a) : (b))
#define MAX2(a, b) ((a) > (b) ? (a) : (b))
#define CLIP3(x, a, b) MIN2(MAX2(a,x), b)
int f_Gray(unsigned char* srcData, int width, int height, int stride, int mode)
{
int ret = 0;
int i, j, gray, offset;
offset = stride - width * 3;
unsigned char* pSrc = srcData;
switch (mode)
{
case 0://平均值灰度化
for (j = 0; j < height; j++)
{
for (i = 0; i < width; i++)
{
gray = (pSrc[0] + pSrc[1] + pSrc[2]) / 3;
pSrc[0] = gray;
pSrc[1] = gray;
pSrc[2] = gray;
pSrc += 3;
}
}
break;
case 1://加权平均值灰度化
for (j = 0; j < height; j++)
{
for (i = 0; i < width; i++)
{
gray = (299 * pSrc[2] + 587 * pSrc[1] + 114 * pSrc[0]) / 100;
pSrc[0] = gray;
pSrc[1] = gray;
pSrc[2] = gray;
pSrc += 3;
}
}
break;
case 2://最大值灰度化
for (j = 0; j < height; j++)
{
for (i = 0; i < width; i++)
{
gray = (MAX2(pSrc[0], MAX2(pSrc[1], pSrc[2])) + MIN2(pSrc[0], MIN2(pSrc[1], pSrc[2]))) / 2;
pSrc[0] = gray;
pSrc[1] = gray;
pSrc[2] = gray;
pSrc += 3;
}
}
break;
default:
break;
}
return ret;
};
int main()
{
Mat img_src = imread("D:\\Images\\test1.png", IMREAD_COLOR);
imshow("img_src", img_src);
unsigned char* data = (unsigned char*)malloc(sizeof(unsigned char) * img_src.cols * img_src.rows * img_src.channels());
memcpy(data, img_src.data, sizeof(unsigned char) * img_src.cols * img_src.rows * img_src.channels());
int flag = f_Gray(data, img_src.cols, img_src.rows, 3, 0);
Mat img_dst(img_src.rows, img_src.cols, CV_8UC3, data);
imshow("img_dst", img_dst);
waitKey();
return 0;
}