彩色图像处理之灰度和底片处理

彩色图像转换为灰度图像。

彩色图像转换为灰度图像

彩色转换为灰度使用如下公式

Gray = R * 0.299 + G * 0.587 + B * 0.114

为了提高运算速度,将这个公式转换为整数运算:

Gray = (R * 229 + G * 587 + B * 114 + 500) / 1000

为了提高运算速度的方法还有很多,这里作为演示,不再详述。

彩色图片转化成底片效果

底片效果使用如下公式:

R = 0xFF - GetRValue(pMem[i]);

G = 0xFF - GetGValue(pMem[i]);

B = 0xFF - GetBValue(pMem[i]);

完整代码如下:

/
// 程序名称:彩色图片转换
// 编译环境:VC 6.0 / VS 2013,EasyX 2017-9-19
// 作    者:鼠瓜
// 最后修改:2018-12-9
//
#include <graphics.h>
#include <conio.h>

// 底片效果
void ColorInvert(IMAGE *pimg)
{
	// 获取指向显存的指针
	DWORD* pMem = GetImageBuffer(pimg);

	// 直接对显存赋值
	for (int i = pimg->getwidth() * pimg->getheight() - 1; i >= 0; i--)
		pMem[i] = (~pMem[i]) & 0x00FFFFFF;
}
// 彩色图像转换为灰度图像
void  ColorToGray(IMAGE *pimg)
{
	DWORD *p = GetImageBuffer(pimg);
	COLORREF c;

	// 逐个像素点读取计算
	for (int i = pimg->getwidth() * pimg->getheight() - 1; i >= 0; i--)
	{
		c = BGR(p[i]);
		c = (GetRValue(c) * 299 + GetGValue(c) * 587 + GetBValue(c) * 114 + 500) / 1000;
		p[i] = RGB(c, c, c);	// 由于是灰度值,无需再执行 BGR 转换
	}
}


// 主函数
void main()
{
	// 初始化绘图环境
	initgraph(640, 480);

	// 获取图像
	IMAGE img;
	loadimage(&img, _T("..\\test.jpg"));

	// 显示原始图像
	putimage(0, 0, &img);

	// 按任意键转换为灰度图像
	_getch();

	//两者自行切换注释

	// 处理图像为灰度
//	ColorToGray(&img);		

	// 底片效果
	ColorInvert(&img);

	// 显示处理后的图像
	putimage(0, 0, &img);

	// 关闭绘图环境 
	_getch();
	closegraph();
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@Hwang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值