(转帖)图像增强算法

[复制链接]
5505|20
 楼主| 五谷道场 发表于 2012-1-18 20:05 | 显示全部楼层 |阅读模式
算法一、图像反相算法
将图像按像素进行求反,取得类似照相底片效果。求反处理的图像与原始图黑白颠倒
可以看清原始图中灰黑区域的情况。求反的图像一般用于数字图像的初步处理。

   
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);



}


}


}
 楼主| 五谷道场 发表于 2012-1-18 20:06 | 显示全部楼层
算法二、图像灰度处理算法
灰度图(gray-scale imgc5)是指将图像按照灰度等级的数目来划分后形成的图像。灰度模式最多使用256级灰度来表现图像,图像中的每个像素有一个0(黑色)到255(白色)之间的亮度值。实现灰度图现实的方法比较简单,将UV分量的值赋为0X80Y分量值保持不变即可。
以下是处理算法的具体函数,用下面的算法处理函数把上面完整程序里的相关算法处理函数替换掉,就可实现图像处理的效果。
/*消去彩色*/

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;



}


}


}
 楼主| 五谷道场 发表于 2012-1-18 20:06 | 显示全部楼层
算法三、图像阈值变换算法
灰度的阈值变换可以将一幅灰度图像转换成黑白二值图像。它的操作过程是先由用户指
定一个阈值,如果图像中期权像素的灰度值小于该阈值,则将该像素的灰度值设置为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;



}


}


}
 楼主| 五谷道场 发表于 2012-1-18 20:07 | 显示全部楼层
算法三、图像阈值变换算法
灰度的阈值变换可以将一幅灰度图像转换成黑白二值图像。它的操作过程是先由用户指
定一个阈值,如果图像中期权像素的灰度值小于该阈值,则将该像素的灰度值设置为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;



}


}


}
 楼主| 五谷道场 发表于 2012-1-18 20:08 | 显示全部楼层
算法五、灰度窗口变换算法

灰度窗口变换(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;                       

                   }        

         }                 

}
huigoushang 发表于 2012-1-19 00:31 | 显示全部楼层
值得借鉴一下
G21372 发表于 2012-1-19 00:47 | 显示全部楼层
好全啊
张鑫鑫鑫 发表于 2012-1-19 19:39 | 显示全部楼层
有帮助,楼主辛苦了
一品人生 发表于 2012-1-19 19:46 | 显示全部楼层
好家伙,这么多内容
yangguangaisha 发表于 2012-1-19 19:54 | 显示全部楼层
收藏了,楼主辛苦
gdmt0601 发表于 2012-10-24 16:30 | 显示全部楼层
楼主还在吗?有些问题我想请教您!能否给个联系方式,我QQ853771773   多谢指教!不胜感激
gdmt0601 发表于 2012-10-24 16:32 | 显示全部楼层
我现在准备连续显示两幅图,先显示原始图像,再接着显示灰度化后的图像,可是在显示灰度化图像的时候,图像就不稳定,屏幕上有重影,请问这是什么原因呢?
happy啦啦啦 发表于 2012-10-24 16:47 | 显示全部楼层
图像处理这方面接触的比较少,先看看再说
meng219902 发表于 2012-10-24 16:53 | 显示全部楼层
i LIKE !
gibenlin 发表于 2012-10-24 17:44 | 显示全部楼层
jxmzzr 发表于 2012-10-24 18:53 | 显示全部楼层
人类感知的外界信息80%以上是通过视觉得到的,资料很有借鉴意义,感谢分享
vivilzb1985 发表于 2012-10-25 12:00 | 显示全部楼层
感谢分享,很好的资料的,我先借鉴啦
zhongxon 发表于 2012-10-25 12:13 | 显示全部楼层

1

看看这样,Retinex,就是运算量太大了
 楼主| 五谷道场 发表于 2012-10-25 14:12 | 显示全部楼层
我现在准备连续显示两幅图,先显示原始图像,再接着显示灰度化后的图像,可是在显示灰度化图像的时候,图像就不稳定,屏幕上有重影,请问这是什么原因呢? ...
gdmt0601 发表于 2012-10-24 16:32
找到问题了没,是不是原始图像的影响呢?
爱之翼V 发表于 2012-10-25 15:18 | 显示全部楼层
嘿嘿...今天来巧了,正想这事呢.很有启发。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7647

主题

9805

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部