- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
图形图像处理-之-一个复杂度为常数的快速局部自适应算法
HouSisong@GM 2008.04.12
(2009.03.10 可以到这里下载完整的可以编译的项目源代码: http://cid-
10/browse.aspx/.Public?uc=4
tag: 图像二值化,局部自适应,二维模板
摘要: 图像处理中,某些算法在对一个像素的处理都需要根据周围很多像素的综合信息
来做处理,这类算法一般叫做局部自适应算法,用以得到更好的处理效果;但很多时候
这都可能成为一个性能瓶颈,因为对一个像素点都需要做大量的处理;本文将提供我使
用的一个复杂度为常数的快速局部自适应算法。
(当然,某些二维模板不一定能够拆解成常数算法,但很多还是可以拆解成线性算法的)
正文:
代码使用C++,编译器:VC2005
测试平台:(CPU:AMD64x2 4200+(2.37G); 内存:DDR2 677(双通道); 编译
器:VC2005)
A:像素使用ARGB32 颜色类型,颜色和图片的数据定义:
typedef unsigned char TUInt8; // [0..255]
typedef unsigned long TUInt32;
struct TARGB32 // 32 bit color
{
TUInt8 b,g,r,a; // a is alpha
};
struct TPicRegion // 一块颜色数据区的描述,便于参数传递
{
TARGB32 * pdata; // 颜色数据首地址
long byte_width; // 一行数据的物理宽度(字节宽度);
// 注意: abs(byte_width)有可能大于等于width*sizeof(TARGB32);
unsigned long width; // 像素宽度
unsigned long height; // 像素高度
};
// 那么访问一个点的函数可以写为:
inline TARGB32 Pixels( const TPicRegion pic,
const long x, const long y)
{
return ( (TARGB32 * )((TUInt8 * )pic.pdata + pic.byte_width
* y) )[x];
}
B:图像二值化的一个简单实现
函数的作用是将一幅彩色图像转化成黑白两色的图像;
算法很简单,像素的亮度值大于127(也可以预先统计出源图片的平均亮度值作
为阈值)的转换为白色,否则设置为黑色,实现如下:
const double cs_gray_red = 0.299 ;
const double cs_gray_green = 0.587 ;
const double cs_gray_blue = 0.114 ;
inline long getGray0( const TARGB32 color) // 获得颜色的
亮度
{
return ( long )(color.r * cs_gray_red + color.g *
cs_gray_green + color.b * cs_gray_blue);
}
void threshold0( const TPicRegion dst, const TPicRegion
src)
{
long width = dst.width;
if (src.width width) width = src.width;
long height = dst.height;
if (src.height height) height = src.height;
TARGB32 * srcLine
文档评论(0)