- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
图形图像处理-之-误差扩散下篇 - 更快的速度或更好的效果
HouSisong@GM 2010.01.05
(2010.01.06 补充误差扩散算法并行化的一些探讨 )
tag: 误差扩散,真彩色到高彩色转换,色阶,减色,半色调
摘要: 在图像的颜色转换过程中,由于颜色值域的不同,转换过程中可能会产生误差;
误差扩散算法通过将误差传递到周围像素而减轻其造成的视觉误差。
上篇:简单实现; 中篇:简单的速度优化; 下篇: 更快的速度或更好的效果.
(测试源代码下载: http://cid-
10/self.aspx/.Public/ErrorDiffuse.zip )
正文:
代码使用C++,编译器:VC2005
测试平台:(CPU:i7-920(3.44G); 内存:DDR3 1333(三通道); 编译器:VC2005)
(请先参看文章的上篇和中篇)
A:更快的速度
前面的文章用使用的误差传递系数为:
* 2
1 1 0 /4
为速度和质量做了折中;而在某些应用场合下,可能希望更快的实时进行误差扩散;
这时可以考虑这样的误差扩散系数:
* 1
0 1 0 /2
甚至于:
* 1 /1
这时误差只用传递到右边,实现起来就简单多了:
//扩散模板
// * 1 /1
void CvsPic32To16_ErrorDiffuse_Line_fast(UInt16 * pDst, const Color32 * pSrc, long width){
TErrorColor HErr;
HErr.dR = 0 ; HErr.dG = 0 ; HErr.dB = 0 ;
for ( long x = 0 ;x width; ++ x)
{
long cB = (pSrc[x].b + HErr.dB);
long cG = (pSrc[x].g + HErr.dG);
long cR = (pSrc[x].r + HErr.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 );
HErr.dB = (cB - getC8Color(rB)) ;
HErr.dG = (cG - getC8Color(rG)) ;
HErr.dR = (cR - getC8Color(rR)) ;
}
}
void CvsPic32To16_ErrorDiffuse_fast( const TPicRegion_RGB16_555 dst, const TPixels32Ref src)
UInt16 * pDst = (UInt16 * )dst.pdata;
const Color32 * pSrc = src.pdata;
const long width = src.width;
for ( long y = 0 ;y src.height; ++ y){
CvsPic32To16_ErrorDiffuse_Line_fast(pDst,pSrc,width);
(UInt8 * )pDst += dst.byte_width;
(UInt8 * )pSrc += src.byte_width;
}
}
速度测试:
//////////////////////////////////////////////////////////
文档评论(0)