您的位置:首页 > 其它

图像处理-基本算法之线性变换

2012-06-13 12:43 253 查看
线性变换是灰度变换的一种,图像的灰度变换通过建立灰度映射来调整源图像的灰度从而达到图像增强的目的。
其公式可以表示为y(x, y) = k * x(x, y) + b;其中y(x, y)表示目标像素值,x(x, y)表示源像素值,k表示斜率,b表示截距。

1)当k>1时,可用于增加图像的对比度。图像的像素值在变换后全部增大,整体显示效果被增强。
2)当k=1时,常用于调节图像亮度。
3)当0<k<1时,效果与k>1时刚刚相反,图像的对比度和整体效果都被削弱。
4)当k<0时,源图像较亮的区域变暗,而较暗的区域会变亮。此时可以使函数中的k=-1,d=255让图像实现反色效果。
代码如下:

[cpp]
view plaincopyprint?

/******************************************************************************

* 作用: 线性变换函数
* 参数: pDst 输出图像的像素数组

* 参数: pSrc 原始图像的像素数组
* 参数: nWidth 原始图像宽度

* 参数: nHeight 原始图像高度
* 参数: slope 线性函数的斜率

* 参数: inter 线性函数的截距
* 备注: 此函数对于彩色图同样适用
******************************************************************************/

int LineTrans(BYTE* pDst,
BYTE* pSrc, int nWidth,
int nHeight, double slope,
double inter)
{
if (!pSrc || !pDst)

{
return EXIT_FAILURE;

}

// 灰度映射表
BYTE map[256];

// 保存运算后的临时值

double dTemp;
int i, j;

for (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 (i = 0; i < nWidth * nHeight; i++)

{
for (j = 0; j < 4; j++)

pDst[i*4 + j] = map[pSrc[i*4 + j]];
}
return EXIT_SUCCESS;

}

/******************************************************************************
* 作用: 线性变换函数
* 参数: pDst 输出图像的像素数组
* 参数: pSrc 原始图像的像素数组
* 参数: nWidth 原始图像宽度
* 参数: nHeight 原始图像高度
* 参数: slope 线性函数的斜率
* 参数: inter 线性函数的截距
* 备注: 此函数对于彩色图同样适用
******************************************************************************/
int LineTrans(BYTE* pDst, BYTE* pSrc, int nWidth, int nHeight, double slope, double inter)
{
if (!pSrc || !pDst)
{
return EXIT_FAILURE;
}

// 灰度映射表
BYTE map[256];

// 保存运算后的临时值
double dTemp;
int i, j;
for (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 (i = 0; i < nWidth * nHeight; i++)
{
for (j = 0; j < 4; j++)
pDst[i*4 + j] = map[pSrc[i*4 + j]];
}
return EXIT_SUCCESS;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: