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( 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(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原图
C++实现将彩色BMP格式图转化为不同灰度级图_第1张图片
Lenna的二值图
C++实现将彩色BMP格式图转化为不同灰度级图_第2张图片
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 (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(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级灰度图
C++实现将彩色BMP格式图转化为不同灰度级图_第3张图片
依此类推,将彩色图像转化为不同灰度级图像的编程思想只需要修改上述程序中的灰度级规划部分代码即可。下面给出处理后的图像效果展示:
C++实现将彩色BMP格式图转化为不同灰度级图_第4张图片
128级灰度图像
C++实现将彩色BMP格式图转化为不同灰度级图_第5张图片

你可能感兴趣的:(数字图像处理,数字图像处理)