李現路:圖像增強處理算法大全
算法一、圖像反相算法
將圖像按像素進行求反,取得類似照相底片效果。求反處理的圖像與原始圖“黑白顛倒”, 可以看清原始圖中灰黑區域的情況。求反的圖像一般用于數字圖像的初步處理。
設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。本實驗采用的是清除背景的灰度窗口變換;叶却翱谧儞Q可以檢測出在某一灰度窗口范圍內的所有像素,是圖像灰度分析中的一個有力工具。
在視頻顯示任務的循環中,程序首先將視頻數據從輸入緩沖區讀入自己開設的臨時圖像處理緩沖區,再在臨時圖像處理緩沖區上進行處理,處理后的數據再輸出到輸出緩沖區。
在屏幕中央開辟一個矩形區域,對這個區域內的圖像進行處理。
以下是處理算法的具體函數,用下面的算法處理函數把上面完整程序里的相關算法處理函數替換掉,就可實現圖像處理的效果。
/*灰度的窗口變換*/
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編輯過]