图像处理/opencv/C++:三种灰度化

37 篇文章 4 订阅
34 篇文章 4 订阅
#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)
{
	//@ stride 这个参数可以去掉,没有用到
	int ret = 0;
	int i, j, gray, offset;
	offset = stride - width * 3;//这个参数没有用到
	unsigned char* pSrc = srcData;
	switch (mode)
	{
	case 0://mean gray method
		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;
			}
			//pSrc += offset;
		}
		break;
	case 1://classic gray method
		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;
			}
			//pSrc += offset;
		}
		break;
	case 2://photoshop gray method
		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;
			}
			//pSrc += offset;
		}
		break;
	default:
		break;
	}
	return ret;
};

int main()
{
	Mat img_src = imread("test.jpg", IMREAD_COLOR);
	//namedWindow("img_src", CV_WINDOW_NORMAL);
	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);
	//namedWindow("img_dst", CV_WINDOW_NORMAL);
	imshow("img_dst", img_dst);
	waitKey();
	return 0;
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值