本人在学习图像处理时使用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的二值图
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级灰度图
依此类推,将彩色图像转化为不同灰度级图像的编程思想只需要修改上述程序中的灰度级规划部分代码即可。下面给出处理后的图像效果展示:
128级灰度图像