C++实现将彩色BMP格式图转化为不同灰度级图

  本人在学习图像处理时使用vs2017中MFC框架编写了相关的图像处理程序,使用的编程语言是c++,而且没有使用Openvc。
  接着上一篇博文(图像降质)今天写一下将图像转化为不同灰度级的图像。关于在MFC上如何新建菜单选项、修改ID以及添加消息处理函数的步骤请参看上一篇文章,而关于将一副彩色图像转化为不同灰度级的图的思想,其实很简单,就是先将彩色图转化为256级灰度图,然后再对他进行灰度分级即可,下面给出具体代码和实现效果展示。
 1.将彩色图转化为二值图
		```
		//2级灰度图像
		void CImage_ProcessingView::OnLevel2()
		{
			// TODO: 在此添加命令处理程序代码
			if (m_Image.IsNull()) return;//判断图像是否为空,如果对空图像进行操作会出现未知的错误
			int w = m_Image.GetWidth();
			int h = m_Image.GetHeight();
			int gray,level;                   
			for (int j = 0; j<h; j++)
			{
				for (int k = 0; k<w; k++)
				{//彩色图像转化为灰度图像的算法有几种,下面选用的是Matlab中的算法。如果用RGB值平均来代替灰度值也可以。
					gray = static_cast<int>( m_Image.m_pBits[0][j][k]*0.114+ m_Image.m_pBits[1][j][k]*0.587 + m_Image.m_pBits[2][j][k]*0.2989);//彩色图转化为灰度图
					level = static_cast<int>(gray / 128);          //灰度除以灰度间隔得到一个整数,该整数乘以灰度间隔就得到了相应的灰度等级
		
					m_Image.m_pBits[0][j][k] =level*255;
					m_Image.m_pBits[1][j][k] = level * 255;
					m_Image.m_pBits[2][j][k] = level * 255;
					
				}
			}
			Invalidate(1); //强制调用ONDRAW函数,ONDRAW会绘制图像
		}
		```

处理效果展示:
lenna原图
Lenna原图
Lenna的二值图
Lenna的二值图
2.彩色图像转化为4级灰度图像

//4级灰度图像
void CImage_ProcessingView::OnLevel4()
{
	// TODO: 在此添加命令处理程序代码
	if (m_Image.IsNull()) return;//判断图像是否为空,如果对空图像进行操作会出现未知的错误
	int w = m_Image.GetWidth();
	int h = m_Image.GetHeight();
	int gray,level;
	for (int j = 0; j<h; j++)
	{
		for (int k = 0; k<w; k++)
		{
			gray =static_cast<int> (m_Image.m_pBits[0][j][k] * 0.114 + m_Image.m_pBits[1][j][k] * 0.587 + m_Image.m_pBits[2][j][k] * 0.2989);
			level = static_cast<int>(gray / 64);
			m_Image.m_pBits[0][j][k] = level * 64;
			m_Image.m_pBits[1][j][k] = level * 64;
			m_Image.m_pBits[2][j][k] = level * 64;
		}
	}
	Invalidate(1); //强制调用ONDRAW函数,ONDRAW会绘制图像
}

编程思想和1中一样,只是灰度级规划不同而已。
程序处理效果展示:
4级灰度图
4级灰度图
依此类推,将彩色图像转化为不同灰度级图像的编程思想只需要修改上述程序中的灰度级规划部分代码即可。下面给出处理后的图像效果展示:
16级灰度图像
128级灰度图像
128级灰度图像

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值