女人夜夜春高潮爽A∨片传媒_国产精品VIDEOS麻豆_在线精品亚洲一区二区三区_亚洲熟妇无码av

圖像處理
新聞詳情

圖像處理基礎(7):圖像的灰度變換

發布時(shi)間:2021-01-13 14:54:36 最(zui)后更新(xin):2021-01-13 15:46:23 瀏覽(lan)次(ci)數:3569

前面幾篇文章介紹的是圖像的空間域濾波,其對像素的處理都是基于像素的某一鄰域進行的。本文介紹的圖像的灰度變換則不同,其對像素的計算僅僅依賴于當前像素灰度變換函數
灰度(du)變(bian)(bian)換也被稱為圖(tu)像(xiang)的(de)點運算(suan)(只(zhi)針對圖(tu)像(xiang)的(de)某一像(xiang)素(su)點)是所有圖(tu)像(xiang)處(chu)理技術中(zhong)最(zui)簡單的(de)技術,其(qi)變(bian)(bian)換形式如下(xia):


其中,T是灰度變換函數;r是變換前的灰度;s是變換后的像素。
圖像(xiang)灰度變換的(de)有以下作用:

?   改善圖像(xiang)的質量(liang),使(shi)圖像(xiang)能夠顯示更(geng)多的細節(jie),提(ti)高圖像(xiang)的對比度(對比度拉(la)伸)

?   有選擇的(de)突(tu)出圖(tu)像(xiang)感(gan)興趣的(de)特征或者抑制圖(tu)像(xiang)中不需要的(de)特征

?   可以有效的(de)改變圖像的(de)直方圖分(fen)布,使像素的(de)分(fen)布更為均勻

常見的灰度變換

灰(hui)(hui)(hui)(hui)度(du)變(bian)(bian)(bian)換函(han)數(shu)(shu)描(miao)述了輸入(ru)灰(hui)(hui)(hui)(hui)度(du)值和輸出灰(hui)(hui)(hui)(hui)度(du)值之間變(bian)(bian)(bian)換關(guan)系,一旦灰(hui)(hui)(hui)(hui)度(du)變(bian)(bian)(bian)換函(han)數(shu)(shu)確定下(xia)(xia)來了,那么其(qi)輸出的(de)(de)灰(hui)(hui)(hui)(hui)度(du)值也(ye)就確定了。可見灰(hui)(hui)(hui)(hui)度(du)變(bian)(bian)(bian)換函(han)數(shu)(shu)的(de)(de)性質(zhi)就決(jue)定了灰(hui)(hui)(hui)(hui)度(du)變(bian)(bian)(bian)換所能(neng)達(da)到的(de)(de)效果。用于圖像灰(hui)(hui)(hui)(hui)度(du)變(bian)(bian)(bian)換的(de)(de)函(han)數(shu)(shu)主要有以下(xia)(xia)三種(zhong):

?   線性函(han)數 (圖像反(fan)轉(zhuan))

?   對(dui)(dui)數函(han)數:對(dui)(dui)數和反對(dui)(dui)數變換

?   冪律函(han)數:n次(ci)冪和n次(ci)開方變(bian)換

上圖給出了幾種常見灰度變換函數的曲線圖,根據這幾種常見函數的曲線形狀,可以知道這幾種變換的所能達到的效果。例如,對數變換和冪律變換都能實現圖像灰度級的擴展/壓縮,另外對數變換還有一個重要的性質,它能壓縮圖像灰度值變換較大的圖像的動態范圍(例如,傅立葉變換的頻譜顯示)。

線性變換

令r為變換前的灰度,s為變換后的灰度,則線性變換的函數:


其中,a為(wei)直線的斜率,b為(wei)在(zai)y軸的截距。選擇不同(tong)的a,b值會有(you)不同(tong)的效果:

?   a>1,增加圖像的對比度

?   a<1,減小圖像的對比度

?   a=1且b≠0,圖像整體的灰度值上移或者下移,也就是圖像整體變亮或者變暗,不會改變圖像的對比度。

?   a<0且b=0,圖像的亮區域變暗,暗區域變亮

?   a=1且b=0,恒定變換,不變

?   a=?1且b=255,圖像反轉。

在進行圖像增強時,上述的線性變換函數用的較多的就是圖像反轉了,根據上面的參數,圖像反轉的變換函數為:s=255?s。圖像反轉得到的是圖像的負片,能夠有效的增強在圖像暗區域的白色或者灰色細節。其效果如下:

圖像反轉的實現是比較簡單的,在OpenCV中有對Mat的運算符重載,可以直接Mat r = 255 - img或者~img來實現。

對數變換

對數變換的通(tong)用公式是(shi):


其中,c是一個常數,,假設r≥0,根據上圖中的對數函數的曲線可以看出:對數變換,將源圖像中范圍較窄的低灰度值映射到范圍較寬的灰度區間,同時將范圍較寬的高灰度值區間映射為較窄的灰度區間,從而擴展了暗像素的值,壓縮了高灰度的值,能夠對圖像中低灰度細節進行增強。;從函數曲線也可以看出,反對數函數的曲線和對數的曲線是對稱的,在應用到圖像變換其結果是相反的,反對數變換的作用是壓縮灰度值較低的區間,擴展高灰度值的區間。
基于OpenCV的實現,其對數變換的代碼如下:

float pixels[256];
    for (int i = 0; i < 256; i++)
        pixels[i] = log(1 + i);

    Mat imageLog(image.size(), CV_32FC3);
    for (int i = 0; i<image.rows; i++)
    {
        for (int j = 0; j<image.cols; j++)
        {
            imageLog.at(i, j)[0] = pixels[image.at(i, j)[0]];
            imageLog.at(i, j)[1] = pixels[image.at(i, j)[1]];
            imageLog.at(i, j)[2] = pixels[image.at(i, j)[2]];
        }
    }
    //歸一化到0~255  
    normalize(imageLog, imageLog, 0, 255, CV_MINMAX);
    //轉(zhuan)換成8bit圖像(xiang)顯示  
    convertScaleAbs(imageLog, imageLog);

這使用的對數函數的底為10。由于灰度變換是灰度值之間的一對一的映射,而灰度值區間通常為[0,255],所以在進行灰度變換時,通常使用查表法。也就是,現將每個灰度值的映射后的結果計算出來,在變換時,通過查表得到變換后的灰度值。執行上面結果得到的結果如下:

左邊為原圖像,其拍攝環境較暗,無法分辨出很多的細節;右邊為變換后的圖像,整個圖像明亮許多,也能分辨出原圖中處于暗區域的狗狗的更多細節。
對數變換,還有一個很重要的性質,能夠壓縮圖像像素的動態范圍。例如,在進行傅立葉變換時,得到的頻譜的動態范圍較大,頻譜值的范圍通常為,甚至更高。這樣范圍的值,顯示器是無法完整的顯示如此大范圍的灰度值的,因而許多灰度細節會被丟失掉。而將得到的頻譜值進行對數變換,可以將其動態范圍變換到一個合適區間,這樣就能夠顯示更多的細節。

冪律變換(伽馬變換)

伽馬變換的公式為:


其中c和為正常數。
伽馬變換的效果與對數變換有點類似,當時將較窄范圍的低灰度值映射為較寬范圍的灰度值,同時將較寬范圍的高灰度值映射為較窄范圍的灰度值;當時,情況相反,與反對數變換類似。其函數曲線如下:

時,的值越小,對圖像低灰度值的擴展越明顯;當時,的值越大,對圖像高灰度值部分的擴展越明顯。這樣就能夠顯示更多的圖像的低灰度或者高灰度細節。
伽馬變換主要用于圖像的校正,對灰度值過高(圖像過亮)或者過低(圖像過暗)的圖像進行修正,增加圖像的對比度,從而改善圖像的顯示效果。
基于OpenCV的實現:

float pixels[256];
    for (int i = 0; i < 256; i++)
        pixels[i] = i * i *i;

    Mat imageLog(image.size(), CV_32FC3);
    for (int i = 0; i<image.rows; i++)
    {
        for (int j = 0; j<image.cols; j++)
        {
            imageLog.at(i, j)[0] = pixels[image.at(i, j)[0]];
            imageLog.at(i, j)[1] = pixels[image.at(i, j)[1]];
            imageLog.at(i, j)[2] = pixels[image.at(i, j)[2]];
        }
    }
    //歸一化到0~255  
    normalize(imageLog, imageLog, 0, 255, CV_MINMAX);
    //轉換(huan)成8bit圖像顯(xian)示  
    convertScaleAbs(imageLog, imageLog);

這里選擇的參數為c = 1,=3,來擴展圖像的高灰度區域,其結果如下:

當選擇參數為c = 1,=0.4,來擴展圖像的低灰度區域,其效果如下:

根據以上(shang)的(de)結果,結合(he)伽馬變(bian)換(huan)的(de)函數曲線(xian)圖,做如下總結:

?   時,會將低于某個灰度值K的灰度區域壓縮到較小的灰度區間,而將高于K的灰度區域擴展到較大灰度區間。令L為灰度的最大值,k = 3/4L . 那么就有的灰度區域映射到為的輸出;而將這部分高灰度區域映射到區間。這樣變換的結果就是,低于K的灰度區域被壓縮到更低灰度區間,而較亮的高灰度區域的灰度值被擴展到較大的灰度區間變的不那么亮,整體的效果就是圖像的對比度增加了,但是由于亮度區域被擴展,也就不那么亮了。

?   時,會將灰度值較小的低灰度區域擴展到較寬的灰度區間,而將較寬的高灰度區域壓縮到較小的灰度區間。這樣變換的效果就是,低灰度區域擴展開來,變亮;而寬的高灰度區域,被壓縮的較窄的區間,也變亮了,故變換后的整體效果是變亮了。

基于OpenCV的灰度變換實現

灰(hui)度變換屬于點對(dui)點的(de)一(yi)一(yi)變換,在(zai)實(shi)現的(de)時候(hou),可以利用查表法(fa)。也就是實(shi)現將(jiang)[0,255]區間的(de)各個灰(hui)度值(zhi)的(de)變換后(hou)的(de)值(zhi)計算出來,在(zai)變換的(de)時候(hou)直接根據(ju)灰(hui)度值(zhi)進(jin)行查表得到變換后(hou)的(de)結果。其實(shi)現如下:

/////////////////////////////////////////////////////////////////////
//
// 灰度線性變換(huan)函(han)數
// 參數:
//        src,輸入原(yuan)圖像
//        dst,輸出圖像,類型為CV_32F,大小(xiao)及通道數與原圖像相(xiang)同
//        mapping,灰度映(ying)射表,可以根(gen)據不同(tong)的變(bian)換函數,提(ti)前計算好圖像的灰度映(ying)射表
//
////////////////////////////////////////////////////////////////////
void gray_trans(const Mat& src, Mat& dst,float* mapping)
{
    int channels = src.channels();
    if (channels == 1)
    { 
        dst = Mat(src.size(), CV_32FC1);
        for (int i = 0; i < src.rows; i++)
        {
            float* p1 = dst.ptr<float>(i);
            const uchar* p2 = src.ptr(i);
            for (int j = 0; j < src.cols; j++)
                p1[j] = mapping[p2[j]];
        }
    }
    else if (channels == 3)
    {
        dst = Mat(src.size(), CV_32FC3);
        for (int i = 0; i < src.rows; i++)
        {
            float* p1 = dst.ptr<float>(i);
            const uchar* p2 = src.ptr(i);
            for (int j = 0; j < src.cols * 3; j+=3)
            {
                p1[j] = mapping[p2[j]];
                p1[j+1] = mapping[p2[j+1]];
                p1[j+2] = mapping[p2[j+2]];
            }            
        }
    }
}

其調用(yong)也比(bi)較簡單,根據(ju)具(ju)體的灰度變換函(han)數,填(tian)充灰度映(ying)射(she)表即可,以(yi)伽馬變換為例:

    float pixels[256];
    for (int i = 0; i < 256; i++)
        pixels[i] = powf(i, 1.5);
    Mat imageLog;
    gray_trans(image, imageLog, pixels);

總結

本文主要對圖像的幾(ji)種常見的灰度變換(huan)進行了總結。

?   圖像反轉(zhuan),是圖像線(xian)性變換的一(yi)種,可以得到圖像負片,能(neng)夠有效的增強(qiang)圖像的暗色(se)區(qu)域(yu)中的白色(se)或者灰色(se)細節(jie)

?   對數變(bian)(bian)換(huan)(huan),擴展(zhan)圖像(xiang)中(zhong)的(de)(de)低(di)灰(hui)度區域(yu),壓(ya)縮圖像(xiang)中(zhong)的(de)(de)高灰(hui)度區域(yu),能夠增強圖像(xiang)中(zhong)的(de)(de)暗色區域(yu)的(de)(de)細節(jie);反(fan)對數變(bian)(bian)換(huan)(huan)與此相反(fan)。對數變(bian)(bian)換(huan)(huan)還有個重要作用(yong)是,能夠壓(ya)縮圖像(xiang)灰(hui)度值的(de)(de)動(dong)態范圍,在傅立葉變(bian)(bian)換(huan)(huan)中(zhong)能夠顯(xian)示(shi)更多的(de)(de)變(bian)(bian)換(huan)(huan)后的(de)(de)頻(pin)譜細節(jie)。

?   伽馬變換,主要用于圖像的校正,根據參數γγ的選擇不同,能夠修正圖像中灰度過高(γ>1γ>1)或者灰度過低(γ<1γ<1

 

文章轉自Brook_icv   //www.cnblogs.com/wangguchangqing/p/6983680.html

在線客服
客服電(dian)話
  • 0755-23712116
  • 13310869691