精华内容
下载资源
问答
  • 此函数是使用 Floyd 和 Steinberg 权重的标准误差扩散算法的实现。
  • 将秘密图像隐藏在一幅基于点扩散或误差扩散的半色调图像中,实现基于点扩散和误差扩散的半色调自隐藏算法;以基于点扩散的双向共轭信息隐藏算法为基础实现基于点扩散的灰度半色调自隐藏算法,将该算法扩展到基于误差...
  • 在多值量化情况下,因量化误差为白噪声的理想条件无法满足,故实施误差扩散处理时仅单纯地进行高通滤波(误差蓝化)将损害图像固有的低频特性.误差扩散算法中较为理想的误差滤波器应在高频域具有较大增益,而在低频域具有...
  • 对灰度图像使用标准 Floyd-Steinberg 算法的简单误差扩散半色调实现,同时提供光栅和蛇形解析。 图像文件首先从 sRGB 转换为线性 RGB 值,这一步是可选的。 作者:台湾国立交通大学的 Zong Qin (qinzong.wnlo@gmail...
  • 误差扩散算法最早是由FloydSteinberg提出,并在当时成为处理效果最好的算法之一。它可以输出视觉效果良好的半色调图像,因而得到了广泛的推广。为改善该传统误差扩散算法均易在中频区域产生结构性纹理现象,提出了...
  • 针对交流等离子体显示器中的常规误差扩散方法因误差扩散系数固定导致反映图像细节轮廓损失的 问题,提出了一种基于边缘检测的动态误差扩散方法 .该方法在对每个像素的误差扩散处理过程中,先沿误 差扩散方向进行边缘...
  • 基于FPGA的改进误差扩散加网算法实现.pdf
  • 双线插值C语言 图形处理源码 图片任意比例缩放 这个是点C文件 用在打印机驱动里面实现任意比例缩放 误差扩散 是图形半色调灰度处理图片的算法 做驱动开发的时候自己写的
  • 基于边缘和误差扩散的半色调图像水印算法
  • 使用熵约束阈值调制的结构感知误差扩散方法
  • 误差扩散原理

    千次阅读 2014-09-02 17:58:28
    误差扩散法在数据处理中经常碰到, 尤其是用于图象处理中, 降低色彩的深度. 下面三张图, 图1 是 256 级灰度过度, 图 2 是简单的将图一按就近原则, 转换成了 16 级灰度. (直接把 8bit 灰度的后 4bit 砍掉) 图3 是将图 ...

    误差扩散法在数据处理中经常碰到, 尤其是用于图象处理中, 降低色彩的深度. 下面三张图, 图1 是 256 级灰度过度, 图 2 是简单的将图一按就近原则, 转换成了 16 级灰度. (直接把 8bit 灰度的后 4bit 砍掉) 图3 是将图 1 用误差扩散的方法转换成 16 级灰度.

    801 字节646 字节2539 字节
    图一图二图三
    很明显, 同是 16 色, 但是图三的效果明显好于图二. 其原因是使用的误差扩散算法. 顾名思义, 误差扩散, 就是将色彩深度降低时, 将像素颜色的变化误差, 扩散开去. 这使得肉眼在观察图片的时候, 相邻的像素点集合整体的误差变小. 下面举一例来说明要容易理解的多:

    在原256 级灰度图象上有一个点, 灰度值是 120 (0~255), 如果我们要将这张图转换成 16 级灰度, 最简单的方法是将每个像素点除以 16. 那么转换后的值就是 120/16=7.5 保留整数位后就是 7 . 这样转换后的值就有了 0.5 的误差. 最简单的误差扩散方法是将这 0.5 的误差放到这个点右边/下边的点上, 我们可以按 3:2:3 的比例把它分配到右边, 右下, 下边的点上. 即, 我们把右边和下边的点加上 (0.5*16)*3/8=3, 把右下的点加上 (0.5*16)*2/8=2. 这样处理完整个图形, 要比直接截尾的效果要好的多. 实际上, 3:2:3 的误差分配方案并不算好. 你还可以试试 7:3:5:1 的分法:

     X7
    351
    或者 42 分:
      X84
    24842
    12421
    当然也不一定复杂的 Filter 就一定效果更好, 还是要视图象而定.

    我觉得这个方法很容易理解, 就不多写了, 可以将其很容易的扩展到彩色图象的处理. (只需要将颜色分成 R G B 三色素) 另外, 不光是图象处理, 这个算法在别的一些数据处理中也常用到.

    来自 http://www.codingnow.com/2000/frame.htm?http://www.codingnow.com/2000/gamedev/tips/errordif

    http://www.codingnow.com/2000/gamedev.htm?special

    参考 http://blog.csdn.net/grimraider/article/details/7449278

     

    展开全文
  • bmp转c数组(误差扩散)

    2017-04-26 17:06:04
    仅支持24位/16位BMP图片,支持误差扩散算法
  • FPGA的矢量误差扩散算法和IP核的自适应优化设计。
  • 针对多次曝光法制作集成衍射光学元件时存在的加工制作复杂,会引入较大的对位误差等问题,基于计算全息中的误差扩散编码原理及部分相干光成像理论,提出采用误差扩散编码方法来设计用于制作浮雕结构集成元件的编码掩模...
  • 基于霍夫变换的基本原理,针对其在进行直线检测中存在的不足,利用误差扩散理论分析了在霍夫变换过程中的误差,研究了影响误差的因素.分析表明,直线的参数估计不仅和图像噪声有关,而且与直线的位置有关,直线到...
  • 三维传感系统中 ,二元误差扩散编码光栅可应用于产生质量较好的正弦结构光场 。针对光场对比度下降问题 ,本文提出一种改善方法 。计算机仿真实验表明 ,系统点扩散函数为椭圆对称高斯函数时 ,应用二元误差扩散编码光栅...
  • 误差扩散算法

    千次阅读 2012-08-06 10:55:13
    误差扩散算法(Error diffusion) Error diffusion is a type of halftoning in which the quantization residual is distributed to neighboring pixels that have not yet been processed. Its main use is to ...
    误差扩散算法(Error diffusion)
    
    Error diffusion is a type of halftoning in which the quantization residual is distributed to neighboring pixels that have not yet been processed. Its main use is to convert a multi-level image into a binary image, though it has other applications
    .
    简单例子:
    在原256 级灰度图象上有一个点, 灰度值是 120 (0~255), 如果我们要将这张图转换成 16 级灰度, 最简单的方法是将每个像素点除以 16. 那么转换后的值就是 120/16=7.5 保留整数位后就是 7 . 这样转换后的值就有了 0.5 的误差. 最简单的误差扩散方法是将这 0.5 的误差放到这个点右边/下边的点上, 我们可以按 3:2:3 的比例把它分配到右边, 右下, 下边的点上. 即, 我们把右边和下边的点加上 (0.5*16)*3/8=3, 把右下的点加上 (0.5*16)*2/8=2. 这样处理完整个图形, 要比直接截尾的效果要好的多.
    链接:
    http://en.wikipedia.org/wiki/Error_diffusion
    http://www.codingnow.com/text/errordif.htm
    http://blog.csdn.net/housisong/article/details/2316924
    http://blog.csdn.net/housisong/article/details/2320688
    http://blog.csdn.net/housisong/article/details/5138874
    展开全文
  • 基于Mailbox的图像误差扩散并行算法的 SOPC实现
  • Floyd-Steinberg Dithering算法误差扩散非对称性研究,陈波,熊义可,本文基于离焦投影三维测量原理,结合相移法,分析了Floyd-Steinberg Dithering算法误差扩散非对称性对离焦正弦结构光投影误差的影响。...
  • 提出了一种彩色矢量最小距离误差扩散算法。较常规误差扩散算法而言,可更好地处理编织过程中将彩色图像分解成由已给定颜色组成的离散图像的问题。该算法将每个像素点的RGB值作为一个矢量,采用矢量误差扩散系数矩阵...
  • 该PPT介绍了误差扩散的基本原理与应用时所需注意的问题,希望对大家有帮助。
  • 为使水印具有不可见性,提出了一种基于图像边缘和误差扩散的数字半色调图像水印算法。Canny算子去噪能力强,在边缘检测和噪声间能取得较好的平衡。先对灰度图像进行Canny边缘检测,得到灰度图像的边缘,然后将灰度图像的...
  • 提出了一种基于小波包变换和误差扩散的打印扫描图像水印算法。首先对图像进行三层小波包分解,并将其作为水印嵌入到分解后的高频分量的低频子带,然后进行小波包重构得到嵌入水印的图像,再运用改进的噪声平衡误差...
  • 基于vs2010的数字加网图像处理算法C++实现代码,包括有序抖动算法:bayers算法、halftone算法;误差扩散算法:Stucki算法、Jarvis算法、Floyd-Steinberg算法。
  • 【图像处理算法】图像处理之误差扩散(抖动)算法 一、算法简介 误差扩撒法在数据处理中经常碰到,尤其是用于图像处理中,降低色彩的深度。下面有三张图,【图一】256级(8bit)灰度过度 【图二】将图一转换成16级...

              【图像处理算法】图像处理之误差扩散(抖动)算法

    一、算法简介

    误差扩撒法在数据处理中经常碰到,尤其是用于图像处理中,降低色彩的深度。下面有三张图,【图一】256级(8bit)灰度过度      【图二】将图一转换成16级(8bit)灰度(高4位不变,低4位置0)       【图三】将图一用误差扩散法转换成16级灰度。(256级灰度指共256种灰度值,16级灰度指共16种灰度值)

    801 字节         646 字节           2539 字节

    【图一】                     【图二】                        【图三】

    很明显,同是16级灰度,但是【图三】的效果明显好于【图二】,其原因是【图二】使用的是误差扩撒算法。

    顾名思义,误差扩撒,就是色彩深度降低时,将像素的变化的误差扩撒开去,使得肉眼在观察图片的时候,相邻的像素点集合整体的误差变小,就比如:人在下楼梯时,如果台阶过高,容易扯着蛋;要是同样的高度能多有几个台阶,那么台阶之间的距离变小了,那么扯蛋效应就会减小甚至消失(不好意思,我称之为扯蛋效应)。

    二、具体过程

    1、如果我们要将这一张256级灰度的图片转换成16级灰度,最简单的办法就是将每个像素的后四位置0。例如256级灰度值是120,转换成16级灰度值则有:120/16=7.5,7*16=112,即16级灰度值为112,那么存在120-112=8(即0.5*16=8)的像素差值,这就是误差。如果不利用这个误差信息,则就是【图二】的效果。

    256级灰度转化16级灰度方法:即把256级灰度平均分成16等分,转化的时候,只需要判断256级灰度在16等分中的哪一个区间,然后用该区间的最小值作为16级灰度的灰度值。即:

    if((x>0) && (x<=16))
    	Grayscale_value = 0=16;
    else if((x > 16)&&( x<=32))
    	Grayscale_value = 32;
    else if((x > 32)&&( x<=48))
    	Grayscale_value = 48;
    else if((x > 48)&&( x<=64))
    	Grayscale_value = 64;
    else if((x > 64)&&( x<=80))
    	Grayscale_value = 80;
    else if((x > 80)&&( x<=96))
    	Grayscale_value = 96;
    else if((x > 96)&&( x<=112))
    	Grayscale_value = 112;
    else if((x > 112)&&( x<=128))
    	Grayscale_value = 128;
    else if((x > 128)&&( x<=144))
    	Grayscale_value = 144;
    else if((x > 144)&&( x<=160))
    	Grayscale_value = 160;
    else if((x > 160)&&( x<=176))
    	Grayscale_value = 176;
    else if((x > 176)&&( x<=182))
    	Grayscale_value = 182;
    else if((x > 182)&&( x<=198))
    	Grayscale_value = 198;
    else if((x > 198)&&( x<=214))
    	Grayscale_value = 214;
    else if((x > 214)&&( x<=230))
    	Grayscale_value = 230;
    else if((x > 230)&&( x<=246))
    	Grayscale_value = 246;
    else if((x > 246))
    	Grayscale_value = 255;

    也可以像原作者那样直接按照公式计算。
    2、误差扩散(抖动),为了解决【图二】的现象,我们来利用这个误差,即将这个误差扩散到该像素点的周围,而不是由该像素完全承担这个误差。这样从视觉方面来看,就会更平缓,更容易接受。我们按照3:2:3的比例将8这个误差分批到该像素点的右边,右下,下边这些周围的像素点上,即右边像素=右边像素+3,右下像素=右下像素+2,下边像素=下边像素+3,如此一来,处理完整个图像的每个像素点,是不是比直接截尾的效果要好很多呢?

    在上述说明中这个误差8的举例有点特殊,误差是13,则按3:2:3得分配的误差为2,1,2(或者四舍五入的3,2,3)。

    事实上,3:2:3的效果也不是最好的分配误差法案,你还可以试一试下面的分法(也可以自己构造):

     

    其中X指的是要转换的像素点,周围的瓜分误差的比例。

    ok,这个算法还是比较有用的,由于比较简单,就不给出代码了,可以自己实现一下。
    ————————————————
    版权声明:本文为CSDN博主「hujingshuang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/hujingshuang/article/details/45716445

    展开全文
  • 计算了喷墨绘图仪喷头的实际灰度,并基于这个实际灰度,改进了误差扩散方法和半色调技术。采用改进的方法后,输出图像的灰度和色彩很逼真,效果良好。
  • 这些是图像处理中半色调算法的一部分基本算法。
  • 图形图像处理-之-误差扩散 中篇  HouSisong@GMail.com 2008.04.22 (2010.01.05 文章由2篇变成3篇,对误差扩散的速度和质量作进一步探讨!  代码也有一些更新,容纳到我的图像处理建议框架内,并提供源代码下载!...

      图形图像处理-之-误差扩散 中篇
                          
    HouSisong@GMail.com    2008.04.22


    (2010.01.05 文章由2篇变成3篇,对误差扩散的速度和质量作进一步探讨!
      代码也有一些更新,容纳到我的图像处理建议框架内,并提供源代码下载!
      测试环境也有了变动;由AMD64x2 4200+(2.37G)DDR2 677(双通道) 升级为i7-920 DDR3 1333(三通道) )

    (2008.12.01 修正一处bug,颜色误差多累加了一次; 该错误由QueQuan发现,表示感谢! )

     
    tag: 误差扩散,真彩色到高彩色转换,色阶,减色,半色调 
       
    摘要: 在图像的颜色转换过程中,由于颜色值域的不同,转换过程中可能会产生误差;
    误差扩散算法通过将误差传递到周围像素而减轻其造成的视觉误差。
    上篇:简单实现; 中篇:简单的速度优化; 下篇: 更快的速度或更好的效果.

     

    (测试源代码下载: http://cid-10fa89dec380323f.skydrive.live.com/self.aspx/.Public/ErrorDiffuse.zip )

     

    正文:
      代码使用C++,编译器:VC2005
      测试平台:(CPU:i7-920(3.44G); 内存:DDR3 1333(三通道); 编译器:VC2005)
       
    (请先参看文章的上篇)
      
      
    E: 将误差扩散的浮点实现改写为一个整数的定点数实现:


     struct  TErrorColor{
             long  dR;
             long  dG;
             long  dB;
        };
        inline  long  getBestRGB16_555Color( const   long  wantColor){
             const   long  rMax = ( 1 << 5 ) - 1 ;
             if  (wantColor <= 0 ) 
                 return   0 ;
             else   if  (wantColor >= (rMax << 3 ))
                 return  rMax;
             else
                 return  wantColor >> 3 ;
        }
        inline  long  getC8Color( const   long  rColor){
             return  rColor*(255*(1<<16)/((1<<5)-1)) >>16; // rColor*255/((1<<5)-1);
        }
         void  CvsPic32To16_ErrorDiffuse_Line_1(UInt16 *  pDst, const  Color32 *  pSrc, long  width,TErrorColor *  PHLineErr){
            TErrorColor HErr;
            HErr.dR = 0 ; HErr.dG = 0 ; HErr.dB = 0 ;
            PHLineErr[ - 1 ].dB = 0 ; PHLineErr[ - 1 ].dG = 0 ; PHLineErr[ - 1 ].dR = 0 ; 
             for  ( long  x = 0 ;x < width; ++ x)
            {
                 long  cB = (pSrc[x].b + HErr.dB*2  + PHLineErr[x].dB );
                 long  cG = (pSrc[x].g + HErr.dG*2  + PHLineErr[x].dG );
                 long  cR = (pSrc[x].r + HErr.dR*2  + PHLineErr[x].dR );
                 long  rB = getBestRGB16_555Color(cB);
                 long  rG = getBestRGB16_555Color(cG);
                 long  rR = getBestRGB16_555Color(cR);
                pDst[x] =  rB | (rG << 5 ) | (rR << 10 );
                HErr.dB = (cB - getC8Color(rB)) >> 2 ;
                HErr.dG = (cG - getC8Color(rG)) >> 2 ;
                HErr.dR = (cR - getC8Color(rR)) >> 2 ;
                PHLineErr[x - 1 ].dB += HErr.dB;
                PHLineErr[x - 1 ].dG += HErr.dG;
                PHLineErr[x - 1 ].dR += HErr.dR;
                PHLineErr[x] = HErr;
            }
        }
    void  CvsPic32To16_ErrorDiffuse_1( const  TPicRegion_RGB16_555 &  dst, const  TPixels32Ref &  src){
        UInt16 *  pDst = (UInt16 * )dst.pdata;
         const  Color32 *  pSrc = src.pdata;
         const   long  width = src.width;
        TErrorColor *  _HLineErr = new  TErrorColor[width + 2 ]; 
         for  ( long  x = 0 ;x < width + 2 ; ++ x){
            _HLineErr[x].dR = 0 ;
            _HLineErr[x].dG = 0 ;
            _HLineErr[x].dB = 0 ;
        }
        TErrorColor *  HLineErr =& _HLineErr[ 1 ];
         for  ( long  y = 0 ;y < src.height; ++ y){
            CvsPic32To16_ErrorDiffuse_Line_1(pDst,pSrc,width,HLineErr);
            (UInt8 *& )pDst += dst.byte_width;
            (UInt8 *& )pSrc += src.byte_width;
        }
        delete[]_HLineErr;
    }


    速度测试:
    //
    //CvsPic32To16_ErrorDiffuse_1     283.77  FPS
    //
     
    F:继续优化
     getBestRGB16_555Color函数有条件分支,建立一个查找表来代替,完整的实现如下:


         static  UInt8 _BestRGB16_555Color_Table[ 256 * 5 ];
         const  UInt8 *  BestRGB16_555Color_Table =& _BestRGB16_555Color_Table[ 256 * 2 ];
         struct  _TAutoInit_BestRGB16_555Color_Table{
            _TAutoInit_BestRGB16_555Color_Table(){
                 for  ( long  i = 0 ;i < 256 * 5 ; ++ i){
                    _BestRGB16_555Color_Table[i] = getBestRGB16_555Color(i - 256 * 2 );
                }
            }
        };
         static  _TAutoInit_BestRGB16_555Color_Table _AutoInit_BestRGB16_555Color_Table;
      //实际代码中建议预先生成_BestRGB16_555Color_Table的数据,从而避免初始化顺序依赖的问题
         void  CvsPic32To16_ErrorDiffuse_Line_2(UInt16 *  pDst, const  Color32 *  pSrc, long  width,TErrorColor *  PHLineErr){
            TErrorColor HErr;
            HErr.dR = 0 ; HErr.dG = 0 ; HErr.dB = 0 ;
            PHLineErr[ - 1 ].dB = 0 ; PHLineErr[ - 1 ].dG = 0 ; PHLineErr[ - 1 ].dR = 0 ; 
             for  ( long  x = 0 ;x < width; ++ x)
            {
                 long  cB = (pSrc[x].b + HErr.dB*2  + PHLineErr[x].dB );
                 long  cG = (pSrc[x].g + HErr.dG*2  + PHLineErr[x].dG );
                 long  cR = (pSrc[x].r + HErr.dR*2  + PHLineErr[x].dR );
                 long  rB = BestRGB16_555Color_Table[cB];
                 long  rG = BestRGB16_555Color_Table[cG];
                 long  rR = BestRGB16_555Color_Table[cR];
                pDst[x] =  rB | (rG << 5 ) | (rR << 10 );
       //做乘法比较慢的cpu体系下可以尝试把getC8Color也做成一个数组表 
                HErr.dB = (cB - getC8Color(rB)) >> 2 ;
                HErr.dG = (cG - getC8Color(rG)) >> 2 ;
                HErr.dR = (cR - getC8Color(rR)) >> 2 ;
                PHLineErr[x - 1 ].dB += HErr.dB;
                PHLineErr[x - 1 ].dG += HErr.dG;
                PHLineErr[x - 1 ].dR += HErr.dR;
                PHLineErr[x] = HErr;
            }
        }
     
    void  CvsPic32To16_ErrorDiffuse_2( const  TPicRegion_RGB16_555 &  dst, const  TPixels32Ref &  src){
        UInt16 *  pDst = (UInt16 * )dst.pdata;
         const  Color32 *  pSrc = src.pdata;
         const   long  width = src.width;
        TErrorColor *  _HLineErr = new  TErrorColor[width + 2 ]; 
         for  ( long  x = 0 ;x < width + 2 ; ++ x){
            _HLineErr[x].dR = 0 ;
            _HLineErr[x].dG = 0 ;
            _HLineErr[x].dB = 0 ;
        }
        TErrorColor *  HLineErr =& _HLineErr[ 1 ];
         for  ( long  y = 0 ;y < src.height; ++ y){
            CvsPic32To16_ErrorDiffuse_Line_2(pDst,pSrc,width,HLineErr);
            (UInt8 *& )pDst += dst.byte_width;
            (UInt8 *& )pSrc += src.byte_width;
        }
        delete[]_HLineErr;
    }


    速度测试:
    //
    //CvsPic32To16_ErrorDiffuse_2     316.62  FPS
    //

    函数效果:

      
     

    (文章的 下篇 将讨论更快的速度或者更好的效果)

    展开全文
  • 图形图像处理-之-误差扩散 上篇

    千次阅读 2013-11-23 16:33:57
    图形图像处理-之-误差扩散 上篇  HouSisong@GMail.com 2008.04.22   (2010.01.05 文章由2篇变成3篇,对误差扩散的速度和质量作进一步探讨!  代码也有一些更新,容纳到我的图像处理建议框架内,并提供源代码下载...
  • 针对压缩域视频水印安全性与误差积累问题,提出一种基于AVS压缩域的水印新算法。针对误差积累问题,提出两种控制方法,最大限度地降低了误差积累。此外,对嵌入前的水印进行了混沌处理,提高了水印的安全性。仿真实验结果...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,937
精华内容 1,974
关键字:

误差扩散