李现路:图像增强处理算法大全
算法一、图像反相算法
将图像按像素进行求反,取得类似照相底片效果。求反处理的图像与原始图“黑白颠倒”, 可以看清原始图中灰黑区域的情况。求反的图像一般用于数字图像的初步处理。
设DA表示输入图像的灰度,DB表示输入图像的灰度。灰度变换方程为:
DB=255-DA
在视频显示任务的循环中,程序首先将视频数据从输入缓冲区读入自己开设的临时
图像处理缓冲区,再在临时图像处理缓冲区上进行处理,处理后的数据再输出到输出缓冲区。
图像的采集分为奇偶场采集,即将图像的奇数行作为一场数据,偶数行作为另
一场数据。对像素处理时,一般需分为奇数行与偶数行处理。在下面的程序中奇数行是第一场数据放在临时图像处理缓冲区的前半部。
/********具体处理反相的代码如下:**********************************/
/*进行图像反色处理*/
void videoReverse()
{
int i,j;
//方框内奇数行
for(i=intALines;i<intDLines;i++) //行数
{
for(j=intAPixels;j<intDPixels;j++) //像素个数/每行
{
*(Uint8 *)(tempYbuffer + i*numPixels + j) = 0xFF-*(Uint8 *)(tempYbuffer + i*numPixels + j);
}
}
//方框内偶数行
for(i=numLines/2+intALines;i<numLines/2+intDLines;i++)//行数
{
for(j=intAPixels;j<intDPixels;j++) //像素个数/每行
{
*(Uint8 *)(tempYbuffer + i*numPixels + j) = 0xFF-*(Uint8 *)(tempYbuffer + i*numPixels + j);
}
}
}
算法二、图像灰度处理算法
灰度图(gray-scale imgc5)是指将图像按照灰度等级的数目来划分后形成的图像。灰度模式最多使用256级灰度来表现图像,图像中的每个像素有一个0(黑色)到255(白色)之间的亮度值。实现灰度图现实的方法比较简单,将UV分量的值赋为0X80,Y分量值保持不变即可。
以下是处理算法的具体函数,用下面的算法处理函数把上面完整程序里的相关算法处理函数替换掉,就可实现图像处理的效果。
/*消去彩色*/
void removeColor()
{
int i,j;
//方框内奇数行
for(i=intALines;i<intDLines;i++)//行数
{
for(j=intAPixels/2;j<intDPixels/2;j++) //像素数/每行
{
*(Uint8 *)(tempCbbuffer + i * (numPixels >> 1) + j) = 0x80;
*(Uint8 *)(tempCrbuffer + i * (numPixels >> 1) + j) = 0x80;
}
}
//方框内偶数行
for(i=numLines/2+intALines;i<numLines/2+intDLines;i++)//行数
{
for(j=intAPixels/2;j<intDPixels/2;j++) //像素数/每行
{
*(Uint8 *)(tempCbbuffer + i * (numPixels >> 1) + j) = 0x80;
*(Uint8 *)(tempCrbuffer + i * (numPixels >> 1) + j) = 0x80;
}
}
}
算法三、图像阈值变换算法
灰度的阈值变换可以将一幅灰度图像转换成黑白二值图像。它的操作过程是先由用户指
定一个阈值,如果图像中期权像素的灰度值小于该阈值,则将该像素的灰度值设置为0,否则灰度值设置为255。
以下是处理算法的具体函数,用下面的算法处理函数把上面完整程序里的相关算法处理函数替换掉,就可实现图像处理的效果。
/*****进行阈值分割处理*********/
void threshold()
{
int i,j;
//方框内奇数行
for(i=intALines;i<intDLines;i++)//行数
{
for(j=intAPixels;j<intDPixels;j++) //像素数/每行
{
*(Uint8 *)(tempYbuffer + i*numPixels + j) = *(Uint8 *)(tempYbuffer + i*numPixels + j)<intThreshold?0x00:0xFF;
}
}
//方框内偶数行
for(i=numLines/2+intALines;i<numLines/2+intDLines;i++)//行数
{
for(j=intAPixels;j<intDPixels;j++) //像素数/每行
{
*(Uint8 *)(tempYbuffer + i*numPixels + j) = *(Uint8 *)(tempYbuffer + i*numPixels + j)<intThreshold?0x00:0xFF;
}
}
}
算法四、图像灰度线性变换算法
灰度的线性变换就是将图像中所有的点的灰度按照线性灰度变换函数进行变换。该线性
灰度变换函数是一个一维线性函数:
灰度变换方程为:
dB=fA*dA+fB
1. 如果fA<0,暗区域将变亮,亮区域将变暗,点运算完成了图像求补运算
2. 当fA>1时,输出图像的对比度将增大
3. 当fA<1时,输出图像的对比度将减小
4. 当fA=1且fB≠0时,操作仅使所有像素的灰度值上移或下移,其效果是使整个图像更暗或更亮;
5. 如果fA<0,暗区域将变亮,亮区域将变暗,点运算完成了图像求补运算。
6. 特殊情况下,当fA=1,fB=0时,输出图像和输入图像相同
7. 当fA=1,fB=255时,输出图像的灰度正好反转。
以下是处理算法的具体函数,用下面的算法处理函数把上面完整程序里的相关算法处理函数替换掉,就可实现图像处理的效果。
/***进行灰度线性变换处理*******/
void linerTrans()
{
int i,j,intTemp;
//方框内奇数行
for(i=intALines;i<intDLines;i++)//行数
{
for(j=intAPixels;j<intDPixels;j++) //像素数/每行
{
intTemp = (*(Uint8 *)(tempYbuffer + i*numPixels + j))*intFA+intFB;
if(intTemp>255)
{
*(Uint8 *)(tempYbuffer + i*numPixels + j) = 0xFF;
}
else if(intTemp<0)
{
*(Uint8 *)(tempYbuffer + i*numPixels + j) = 0x00;
}
else
{
*(Uint8 *)(tempYbuffer + i*numPixels + j) = intTemp;
}
}
}
//方框内偶数行
for(i=numLines/2+intALines;i<numLines/2+intDLines;i++)//行数
{
for(j=intAPixels;j<intDPixels;j++) //像素数/每行
{
intTemp = (*(Uint8 *)(tempYbuffer + i*numPixels + j))*intFA+intFB;
if(intTemp>255)
{
*(Uint8 *)(tempYbuffer + i*numPixels + j) = 0xFF;
}
else if(intTemp<0)
{
*(Uint8 *)(tempYbuffer + i*numPixels + j) = 0x00;
}
else
{
*(Uint8 *)(tempYbuffer + i*numPixels + j) = intTemp;
}
}
}
}
算法五、灰度窗口变换算法
灰度窗口变换(slicing)是将某一区间的灰度级和其他部分(背景)分开。
灰度窗口变换有两种,一种是清除背景的,一种是保留背景的。前者把不在灰度窗口范围内的像素都赋值为0,在灰度窗口范围内的像素都赋值为255,这也能实现灰度图的二值化;后者是把不在灰度窗口范围内的像素保留原灰度值,在灰度窗口范围内的像素都赋值为255。本实验采用的是清除背景的灰度窗口变换。灰度窗口变换可以检测出在某一灰度窗口范围内的所有像素,是图像灰度分析中的一个有力工具。
在视频显示任务的循环中,程序首先将视频数据从输入缓冲区读入自己开设的临时图像处理缓冲区,再在临时图像处理缓冲区上进行处理,处理后的数据再输出到输出缓冲区。
在屏幕中央开辟一个矩形区域,对这个区域内的图像进行处理。
以下是处理算法的具体函数,用下面的算法处理函数把上面完整程序里的相关算法处理函数替换掉,就可实现图像处理的效果。
/*灰度的窗口变换*/
void windowTrans()
{
int i,j,intTemp;
//方框内奇数行
for(i=intALines;i<intDLines;i++)//行数
{
for(j=intAPixels;j<intDPixels;j++) //像素数/每行
{
intTemp = *(Uint8 *)(tempYbuffer + i*numPixels + j);
if(intTemp<intL)
*(Uint8 *)(tempYbuffer + i*numPixels + j) = 0x00;
else if(intTemp>intU)
*(Uint8 *)(tempYbuffer + i*numPixels + j) = 0xFF;
else
*(Uint8 *)(tempYbuffer + i*numPixels + j) = intTemp;
}
}
//方框内偶数行
for(i=numLines/2+intALines;i<numLines/2+intDLines;i++)//行数
{
for(j=intAPixels;j<intDPixels;j++) //像素数/每行
{
intTemp = *(Uint8 *)(tempYbuffer + i*numPixels + j);
if(intTemp<intL)
*(Uint8 *)(tempYbuffer + i*numPixels + j) = 0x00;
else if(intTemp>intU)
*(Uint8 *)(tempYbuffer + i*numPixels + j) = 0xFF;
else
*(Uint8 *)(tempYbuffer + i*numPixels + j) = intTemp;
}
}
}
曙海教育
曙海嵌入式学院
(课程:DSP培训,FPGA培训,MTK培训,Android培训,iPhone培训)
电话:021-51875830
网址:http://www.51qianru.cn
讲师:李现路
版权所有-曙海教育 欢迎转摘,转摘请注明作者和出处
[此贴子已经被作者于2009-12-3 11:48:53编辑过]