您的位置:首页 > 其它

[图像增强]三. 灰度线性转换

2013-08-12 13:40 211 查看

一. 线性变换



X(原灰度)经过一直线方程转换后得到Y(新灰度)

上图X, Y坐标都代表灰度值, 区间都在[0, 255]之间.

灰度拉伸, 灰度的直线变换, 对数变换等都是一样的原理: X代表原图像某像素的灰度值, X经过一函数式变换后得到Y, Y就代表了变换后该像素的灰度值. 当然Y不应该大于255(在8位的灰度图中)

二. 直线方程

Y = k * X + b

(Y大于255的取255, 小于0的取0)

三. 参考代码

(代码来自: visual c++数字图像处理开发入门与编程实践 代码)

/******************************************************************************
*	作用:			线性变换函数
*	参数:
*		pixel		原始像素数组
*		tempPixel	保存变换后图像的像素数组
*		width		原始图像宽度
*		height		原始图像高度
*		slope		线性函数的斜率
*		inter		线性函数的截距
*	备注:			此函数对于彩色图同样适用
******************************************************************************/
void LineTrans(BYTE* pixel, BYTE* tempPixel, UINT width, UINT height,
double slope, double inter)
{
// 灰度映射表
BYTE map[256];

// 保存运算后的临时值
double dTemp;

for (int i = 0; i < 256; i++)
{
// 计算当前像素变换后的值
dTemp = slope * i + inter;

// 如果超界则修改其值
if (dTemp < 0)
dTemp = 0.0;
else if (dTemp > 255)
dTemp = 255;

// 四舍五入
map[i] = int(dTemp + 0.5);
}

// 线性变换后的值直接在映射表中查找
for (UINT i = 0; i < width * height; i++)
{
for (int j = 0; j < 4; j++)
tempPixel[i*4+j] = map[ pixel[i*4+j] ];
}
}


三. 用途和说明

灰度的线性变换用到的线性灰度变换函数f(x)是一个一维线性函数:

f(x) = kx + d,应用到图像上就带人各像素点的灰度值:Gd=f(Gs) = k*Gs + d;其中k为线性函数的斜率,d为线性函数在y轴的截距。Gs表示输入图像的灰度,Gd表示输出图像的灰度。

当k>1时,输出图像的对比度将增大;

当k<1时,输出图像的对比度将减小;

当k=1且d≠0时,操作使所有的灰度值上移或下移,其效果是使整个图像变暗或变亮。

当k<0,暗区域将变亮,亮区域将变暗,点运算完成了图形求补运算。

特殊情况:1、当k=1,d=0时,输出图像与原图像相同。2、当k=-1,d=255时,输出图像的灰度正好相反。

参考:

http://3352101.blog.163.com/blog/static/126753097201032611282752/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: