24位图到4位、2位、1位图之间的转换算法是怎么样的?希望大侠们赐教!

解决方案 »

  1.   

    4bits,2bits,1bit?只能是灰度位图吧。
    根据RGB求得对应点的亮度,再转换成4bits,2bits or 1bit.
      

  2.   

    根据每个像素的rbg值求出亮度值,重采样成4bits,2bits,1bit.
    这样的图片作图像识别?
      

  3.   

    DentistryDoctor:
    当然不仅仅是灰度图了。
    Do you see microsoft's painter, it can save a 24bit image to 16colors(4bit) image, but we can find the image isn't gray scale image.
    I think the way you offered just convert a image to gray scale, it isn't my need.
      

  4.   

    位图其实很简单:x*y*h,长*宽*像素深度。所以写程序的话就是对每个象素处理,如果是24位,rgb -> yuv,有好几个经验公式,转出来y是灰度,8位的,左移4位就是4位的了,呵呵。当然,怎么转是你自己定。
      

  5.   

    那就是 调色板 技术了...   4bit 2bit 就不是灰度,而是调色板的索引。调色板里是RGB[16]这个意思,是什么RGB就看算法和需求了。
      

  6.   

    楼上有位兄弟说的,1. 先确定16个RGB,方法可以是统计图像,得到最多的16个RGB,或者你用最小二乘什么的,得到16个RGB。
    2. 对于每个象素,确定其靠近哪个 RGB(上面的16个),就是这个象素的索引。靠近就是三维的距离等等。如何?
      

  7.   

    还有一种感觉是 模式识别里面的分类分16类 4类 2类,每类的RGB取平均或者最小均方。怎么分就记不得了,好像贝叶斯、神经网络什么的。理论,so 强大
      

  8.   

    1bit不就是二值图.只能用颜色索引格式.不然得不到色彩.
      

  9.   

    楼上的,如果是1bit,用不了颜色索引格式吧
      

  10.   

    1. 先确定16个RGB,方法可以是统计图像,得到最多的16个RGB,或者你用最小二乘什么的,得到16个RGB。
    2. 对于每个象素,确定其靠近哪个 RGB(上面的16个),就是这个象素的索引。靠近就是三维的距离等等。差不多就是这样,不过24位位图转过来的话,颜色信息会丢失得很严重,就不要指望能有什么好的效果了。
      

  11.   

    <<programing windows>>中有源码.
      

  12.   

    http://www-scf.usc.edu/~flv/ipbook/chap05.htm
    这个是真彩色转256的
    他用的是最小平方误差来取近似颜色
    //其余的颜色依据最小平方误差近似为前256中最接近的一种     if (PalCounts > 256){              for (i = 256; i < PalCounts; i++){                     //ColorError1记录最小平方误差,一开始赋一个很大的值                     ColorError1=1000000000;//由12位索引值得到R,G,B的最高4位值                     Blue = (long)((ColorIndex[i] & 0xf00) >> 4);                     Green = (long)((ColorIndex[i] & 0x0f0));                     Red = (long)((ColorIndex[i] & 0x00f) << 4);                     ClrIndex = 0;                     for (j = 0; j < 256; j++){                            //ColorError2计算当前的平方误差                            ColorError2=(long)(Blue-pPal->palPalEntry[j].peBlue)*(Blue-pPal->palPalEntry[j].peBlue)+ (long)(Green-pPal->palPalEntry[j].peGreen)*(Green-pPal->palPalEntry[j].peGreen)+                                  (long)(Red-pPal->palPalEntry[j].peRed)*(Red-pPal->palPalEntry[j].peRed); if (ColorError2 < ColorError1){ //找到更小的了                                   ColorError1 = ColorError2;                                   ClrIndex = j; //记录对应的调色板的索引值                  }                     }