这次的内容很简单啦,是量化,反正学过数字图像处理的都应该知道这些都是必做的,本来一张灰度图像的灰度级是256,我们现在把灰度级设的更低,然后看图片的效果,还是跟以前一样,先看效果。
当然和以前一样,还是baby的图片。右边为量化为8个灰度级的效果。
当然,首先还是添加按钮:
这个过程很简单,不会的朋友看我前面的博客就应该很清楚了。
然后为这几个按钮添加事件响应函数,也和前面的过程一样,我就不再多说了。那么,主要的我就来说一下量化的过程吧。
举个例子,如果需要的灰度级是4的话,那么自然的想到为0,1,2,3,我的算法是原先的灰度级/3,然后得到原来的灰度级相对应的,比如1对应的为85,那么在(85-85/2,85+85/2]的区间,灰度级都应该是1,所以我以这个为例,贴出下列代码:
void ChangeColor::Quantization_4()
{
int i, j;
int nRowBytes = GetPitch();//图像每一行的字节数,注意这个值一般是负数
int nWidth = GetWidth();
int nHeight = GetHeight();
int nClrs = GetBPP() / 8;
LPBYTE p = (LPBYTE)GetBits();
for (i = 0; i < nHeight; i++) //第i行
{
for (j = 0; j < nWidth; j++) //第j列
{
p[i*nRowBytes + j*nClrs + 0] = (int)((double)p[i*nRowBytes + j*nClrs + 0] / 85.0 + 0.5) * 85;
p[i*nRowBytes + j*nClrs + 1] = (int)((double)p[i*nRowBytes + j*nClrs + 1] / 85.0 + 0.5) * 85;
p[i*nRowBytes + j*nClrs + 2] = (int)((double)p[i*nRowBytes + j*nClrs + 2] / 85.0 + 0.5) * 85;
}
}
}
上述代码很清楚的解决了变为灰度级为4的图像,其他的灰度级类似像这样处理即可。