初学数字图像识别与处理——题目:C++ 编程将一幅256灰度级的灰度图像分解为不同灰度的分辨率(128,64,32,16,8,4,2)的图像

初学数字图像识别与处理——题目:C++ 编程将一幅256灰度级的灰度图像分解为不同灰度的分辨率(128,64,32,16,8,4,2)的图像

20210509

题目:编程将一幅256灰度级的灰度图像分解为不同灰度的分辨率(128,64,32,16,8,4,2)的图像

1.概念分析

灰度级:即画面灰度级(Picture Grayscale),指传统绘画、CG绘画、摄影作品或其他视觉作品等画面中每个颜色与自身色光对应的明度值,包括纯白、纯黑和其间的无数级灰度。灰度也就是所谓的色阶或灰阶,是指亮度的明暗程度。也称中间色调(Half-tone)主要用于传送图片,分别有16级、32级、64级三种方式,它采用矩阵处理方式将文件的像素处理成16、32、64级层次,使传送的图片更清晰。(来自百度百科)

灰度图像:是一种具有从黑到白256级灰度色阶或等级的单色图像。该图像中的每个像素用8位数据表示,因此像素点值介于黑白间的256种灰度中的一种。现在的灰度分为256级,类似于黑白电视的明暗图像,灰度级别越高,图像越暗,表示的地理位置就不同,当然光线也有区别。(来自百度百科)

2.题目分析

彩色图像怎样转灰度图像?
对于图像由彩色图转化为灰度图有三种方法分别为 加权法 均值法 最大值法。
加权法就是 GRAY=0.3R+0.59G+0.11*B
均值法就是 GRAY=(R+G+B)/3
最大值法就是 max(R,G,B)
但是我用的是Gamma校正得出的灰度值
公式为
在这里插入图片描述
得到了当前的灰度值,那么如何从一个灰度级降到另外的灰度级呢?
借鉴 博主weixin_34129145的思想(原文:https://blog.csdn.net/weixin_34129145/article/details/86464767)
就是将原灰度值进行分区,使其符合目标灰度级的分区。然后将原灰度值与所在区域中的中值进行比较,大于中值时,将改区域最大值赋予灰度值,反之将上一个区域的最大值赋值与灰度值,最后将RGB讲个元素的值都赋予变换后灰度值即可。
如:如果想将256灰度级的灰度图像将至2灰度级的灰度图像,则需要将原0-255的灰度值分成0-127和128-255两个区域。假设某点Q的GBR分别为120,120,120,则120在区域0-127,比较中值(63.5),120>63.5,所以点Q的灰度值将会变化成该区域最大值127,即该点GBR为127,127,127。

代码如下:

void CImage_ProcessingView::On2562()
{
    if (m_Image.IsNull()) return;//判断图像是否为空,如果对空图像进行操作会出现未知的错误
    int w = m_Image.GetWidth();
    int h = m_Image.GetHeight();
    for (int j = 0; j<h; j++)
    {
        for (int k = 0; k<w; k++)
        {
            double R = m_Image.m_pBits[2][j][k]; double G = m_Image.m_pBits[1][j][k]; double B = m_Image.m_pBits[0][j][k];
            //将三元素分别赋值于R、G、B
            double gray = pow((pow(R, 2.2) + pow(1.5*G, 2.2) + pow(0.6*B, 2.2)) / (1 + pow(1.5, 2.2) + pow(0.6, 2.2)), 1 / 2.2);
            //Gamma校正得出的灰度值
            
            int jiange = 128;//每个区域128个数值
            int qu = gray / jiange;//计算出有多少区域(0区,1区…..)
            if (gray >double(jiange*qu + (jiange*(qu + 1) - 1)) / 2)//判断256灰度值在区域中与区域中值比较。如果大于中值取区域最大值,如果小于,则取上一个区域最大值
                gray = jiange*(qu + 1) - 1;//本区最大值
            else
            {
                if (qu == 0)
                {
                    gray = 0;//如果一开始就在0区,且小于中值,直接等于0
                }
                else
                {
                    gray = jiange * qu - 1;//上一个区域最大值
                }
            } //每个区域128个数值的范围

            m_Image.m_pBits[0][j][k] = gray;
            m_Image.m_pBits[1][j][k] = gray;
            m_Image.m_pBits[2][j][k] = gray;
            //某像素的灰度值是将三原色设置成同一值
        }
    }//输出2灰度级的图像
    Invalidate(1); //ONDRAW会绘制图像
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值