首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于32位图片格式进行二值化的有关问题

2013-10-22 
关于32位图片格式进行二值化的问题你们好,我现在遇到一个很大的技术瓶颈。我现在的工作是做一个XPS的驱动程

关于32位图片格式进行二值化的问题
   你们好,我现在遇到一个很大的技术瓶颈。我现在的工作是做一个XPS的驱动程序,通过XPS提供的光栅化服务将XPS固定页的内容光栅化成为图片。这个步骤微软已经给出一个很好的实例:XPS Rasterization Filter Service Sample;

    我的问题是:当光栅化之后,微软提供的光栅化接口RasterizePage输出的是32位带透明度通道的图片格式
GUID_WICPixelFormat32bppPBGRA;由于公司的某种因素,我需要将此格式的图片进行二值化,也就是黑白图片。我查了很多资料,都是关于第三方的库或软件之类的,不太适合我解决问题。这种格式的图片如果我改为没有透明度的格式后,打出来的图片就是黑色的背景,微软资料说关于透明通道会默认使用黑色进行替换,这让我很是郁闷啊,微软提供的实例是光栅化为TIFF格式的图片。


    请有这方面经验的老师给我指点迷津吧,我现在很困惑,我跟无头苍蝇一样飞很长时间了。帮帮我吧~



                                                                  谢谢 图片 32位 实例 tiff
[解决办法]
32位4个字节是这样排列
透明度 蓝色 绿色 红色
转黑白完全可以抛弃透明通道,而只对rgb三个字节进行处理
[解决办法]
 我也是菜鸟 不是要用windows的API把图片的数据读入一个数组吗 在通过存储操作宽带和高度
把r g b 透明度取出来 之后你想改颜色自己处理下啊 你得知道图片是怎么存储的 手动处理下像素的
二进制  这个东西需要调试的 
 BYTE *img_data_ptr=Bits;
    for( unsigned int i=0; i<m_nheight; i++ )
    {
for( unsigned int j=0; j<m_nwidth; j++)
        {
tex_data_ptr[i*m_textures.GetLockedPitch()+j*4+0]=img_data_ptr[(m_nheight-1-i)*m_nwidth*4+j*4+0];
tex_data_ptr[i*m_textures.GetLockedPitch()+j*4+1]=img_data_ptr[(m_nheight-1-i)*m_nwidth*4+j*4+1];
tex_data_ptr[i*m_textures.GetLockedPitch()+j*4+2]=img_data_ptr[(m_nheight-1-i)*m_nwidth*4+j*4+2];
tex_data_ptr[i*m_textures.GetLockedPitch()+j*4+3]=img_data_ptr[(m_nheight-1-i)*m_nwidth*4+j*4+3];
        }    
    }

[解决办法]
 或者参考学习Opencv 这本书 opencv是超级强大的 一定可以找到方法的 
[解决办法]
参考PhotoShop对32位图片先灰度化,再二值化的对话框内容。

[解决办法]
你需要亮度公式,这个公式是数字图像处理方面的。图片黑白化生成结果不是固定的,需要先用亮度公式将彩色转成单色灰度图,然后根据你们实际需要转成黑白图。可变的部分就是从灰度到黑白的算法,一种是直接根据像素灰度大小,你自己提供一个阀值,超过就白,没超过就黑。这样出来的图,灰色部分的信息会完全丢失掉。另一种就没这么简单了但是可以保留一部分灰色信息,就是利用抖动的方法,将源灰度图片叠加图案化或者做随机白噪声抖动处理再做阀值黑白,更复杂的还有参入邻域概率统计算法的,总之这样处理出来的黑白图,原来灰色部分会变成黑白麻点,麻点区域中黑点越多的整体效果就越“灰”。
至于alpha通道,觉得也不能这么简单的忽略掉。这个通道是和底色混合的时候用的。有些图片为了方便于和文字或者别的图片进行不规则的版面排列而加入的alpha通道,这样本来一张矩形图片就会因为alpha通道的存在而变得更像一张不规则图片。比如一张工业产品图,产品外观之外、阴影等部分带了alpha通道,当贴到其他图片或者文章上的时候就不会有白边,看起来和整版融合一体而不是那种贴纸的效果。所以带alpha通道的图片结合背景的其他内容一起处理才是有意义的,单独的、简单的忽略掉或者只是假设一个背景颜色并不合适。
[解决办法]
至于微软说的默认黑色,其实不应该理解成“黑底色”,而说的是当图片单独存在时,背景其实是没有数据的。而当一个像素的值为0时对应的是黑色,0xff对应的是白色(8位通道色的图片中),alpha为0则对应的是全透明。背景数据和前景数据混合是按增量混合,所以“默认黑色”为没有混合的情况,而如果做减量混合就应该默认为白色了。
目前采用的算法都是增量混合的算法:
tar_new = (src * alpha + tar_original * (alpha_max - alpha)) / alpha_max

[解决办法]
公式里的数据都是针对某个像素:
src为图片忽略alpha通道的色彩/灰度数值;alpha为图片(而不是背景)的alpha数值;alpha_max为代表“完全不透明”时的alpha数值;tar_original为没有你这张图片时的背景该像素的色彩/灰度数值,tar_new为合成后的结果。
注意:背景、合成目标均是不带alpha通道的。alpha通道只有图片混合期间才有意义。如果多张带alpha通道的数据都混合在一个区域,应按从背景到最上面一张图的叠加顺序依次计算最后得到的才是该区域各像素的合成结果数值
[解决办法]
RGB彩色图转灰度图:
Gray = R*0.299 + G*0.587 + B*0.114
灰度图转二值图的选项:
50%阈值
图案仿色
扩散仿色
半调网屏
自定图案

热点排行