彩色图像转换为灰度图像。
彩色图像转换为灰度图像
彩色转换为灰度使用如下公式
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();
}