【數字影象處理】五.MFC影象點運算之灰度線性變化、灰度非線性變化、閾值化和均衡化處理詳解
【數字影象處理】一.MFC詳解顯示BMP格式圖片
【數字影象處理】二.MFC單文件分割視窗顯示圖片
【數字影象處理】三.MFC實現影象灰度、取樣和量化功能詳解
【數字影象處理】四.MFC對話方塊繪製灰度直方圖
免費資源下載地址:
http://download.csdn.net/detail/eastmount/8764373
一. 點運算與初始操作
影象的點運算是影象處理中非常基礎的技術,它主要用於改變一篇影象的灰度分佈範圍,通過一定的變換函式將影象的畫素進行轉換,最終生成一幅新的影象。點運算的最大特點就是輸出畫素值只與當前輸入畫素值相關。定義如下。
點運算(Point Operation)指對於一幅輸入影象,將產生一幅輸出影象,輸出影象的每個畫素點的灰度值由輸入畫素點決定。
點運算由灰度變換函式(Grap Scale Transformation,GST)確定:B(x,y)=F[A(x,y)]
需要注意一下幾點:
(1).與區域性或鄰域運算的差別,輸入畫素和輸出畫素是一一對應的;(2).與幾何運算的差別,不改變影象的空間關係;(3).又稱為對比增強,對比拉伸或灰度變換。
在前面第四篇部落格的基礎上增加點運算處理。
第一步:在資源檢視中Menu中新增“影象點運算”選單欄如下所示:
線性變換 ID_DYS_XXYD(點運算 線性移動) ID_DYS_XXZQ( 點運算 線性增強)
ID_DYS_XXJX(點運算 線性減小) ID_DYS_XXQB(點運算 線性求補)
非線性變換 ID_DYS_FXXPF(點運算 非線性平方) ID_DYS_FXXHS(非線性函式)
閾值變換 ID_DYS_YZBH(點運算 閾值變換) 影象均衡化 ID_DYS_JHH
第二步:開啟類嚮導(Ctrl+W),為點運算每個ID選單新增相應的功能處理函式,如下圖所示:選擇類CImageProcessingView,在選擇IDs為ID_DYS_...(點運算)新增函式OnDysXxqb()線性求補。
二. 線性變換
影象線性變換是通過建立灰度對映來調整資源影象的灰度,從而達到影象增強的目的。其中GST函式f(D)為線性的,即:
若a=1,b!=0影象所有灰度值上移或下移
若a>1輸出影象對比度增強
若0<a<1輸出影象對比度減小
若a<0暗區域變亮,亮區域變暗,影象求補
首先是影象移動,程式碼如下:
/**********************************************************************/
/* 影象點運算 4種線性變化直方圖:
/* ID_DYS_XXYD:表示線性灰度變化移動 D(B)=D(A)+50 灰度值上移下移
/* ID_DYS_XXZQ:表示線性灰度變化增強 D(B)=1.5*D(A) 影象對比度增強
/* ID_DYS_XXJX:表示線性灰度變化減小 D(B)=0.8*D(A) 影象對比度減小
/* ID_DYS_XXQB:表示線性灰度求補 D(B)=-1*D(A)+255 影象暗區變亮,亮區變暗
/**********************************************************************/
// 1.點運算 線性灰度變化移動 D(B)=D(A)+50
void CImageProcessingView::OnDysXxyd()
{
// TODO: Add your command handler code here
if(numPicture==0) {
AfxMessageBox("載入圖片後才能線性灰度運算!",MB_OK,0);
return;
}
AfxMessageBox("線性灰度直方圖-灰度變化移動 D(B)=D(A)+50!",MB_OK,0);
int i;
//開啟臨時的圖片
FILE *fpo = fopen(BmpName,"rb");
FILE *fpw = fopen(BmpNameLin,"wb+");
//讀取檔案
fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);
fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);
fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);
fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);
//灰度影象
unsigned char color;
unsigned char red,green,blue;
for( i=0; i<m_nImage/3; i++ )
{
fread(&red,sizeof(char),1,fpo);
fread(&green,sizeof(char),1,fpo);
fread(&blue,sizeof(char),1,fpo);
if( (int)red+50 >255 )
red=255;
else
red=(int)red+50;
if( (int)green+50>255 )
green=255;
else
green=(int)green+50;
if( (int)blue+50>255 )
blue=255;
else
blue=(int)blue+50;
fwrite(&red,sizeof(char),1,fpw);
fwrite(&green,sizeof(char),1,fpw);
fwrite(&blue,sizeof(char),1,fpw);
}
fclose(fpo);
fclose(fpw);
numPicture = 2;
level=101; //賦值101在ShowBitmap中呼叫顯示處理後的圖片
Invalidate();
}
同時修改void CImageProcessingView::ShowBitmap(CDC *pDC,
CString BmpName)函式中的程式碼:
else //影象點運算 線性變化
if(level=101)
{
m_hBitmapChange = (HBITMAP) LoadImage(NULL,BmpNameLin,IMAGE_BITMAP,0,0,
LR_LOADFROMFILE|LR_DEFAULTSIZE|LR_CREATEDIBSECTION);
}
執行效果如下圖所示,同時我擷取了直方圖(RGB相同只顯示一種)。2.D(B)=1.5*D(A)
// 2.點運算 線性灰度變化增強 D(B)=1.5*D(A)
void CImageProcessingView::OnDysXxzq()
{
if(numPicture==0) {
AfxMessageBox("載入圖片後才能線性灰度運算!",MB_OK,0);
return;
}
AfxMessageBox("線性灰度直方圖-灰度變化增強 D(B)=1.5*D(A)!",MB_OK,0);
int i;
//開啟臨時的圖片
FILE *fpo = fopen(BmpName,"rb");
FILE *fpw = fopen(BmpNameLin,"wb+");
fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);
fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);
fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);
fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);
//灰度影象
unsigned char color;
unsigned char red,green,blue;
for( i=0; i<m_nImage/3; i++ )
{
fread(&red,sizeof(char),1,fpo);
fread(&green,sizeof(char),1,fpo);
fread(&blue,sizeof(char),1,fpo);
if( (int)red*1.5 >255 )
red=255;
else
red=(int)red*1.5;
if( (int)green*1.5>255 )
green=255;
else
green=(int)green*1.5;
if( (int)blue*1.5>255 )
blue=255;
else
blue=(int)blue*1.5;
fwrite(&red,sizeof(char),1,fpw);
fwrite(&green,sizeof(char),1,fpw);
fwrite(&blue,sizeof(char),1,fpw);
}
fclose(fpo);
fclose(fpw);
numPicture = 2;
level=101; //線性變化 ShowBitmap中呼叫
Invalidate();
}
執行效果如下圖所示,影象對比度增強,平均灰度122*1.5=1813.D(B)=0.8*D(A)
// 3.點運算 線性灰度變化減小D(B)=0.8*D(A)
void CImageProcessingView::OnDysXxjx()
{
if(numPicture==0) {
AfxMessageBox("載入圖片後才能線性灰度處理!",MB_OK,0);
return;
}
AfxMessageBox("線性灰度直方圖-灰度減小 D(B)=0.8*D(A)!",MB_OK,0);
int i;
//開啟臨時的圖片
FILE *fpo = fopen(BmpName,"rb");
FILE *fpw = fopen(BmpNameLin,"wb+");
fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);
fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);
fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);
fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);
//灰度影象
unsigned char color;
unsigned char red,green,blue;
for( i=0; i<m_nImage/3; i++ )
{
fread(&red,sizeof(char),1,fpo);
fread(&green,sizeof(char),1,fpo);
fread(&blue,sizeof(char),1,fpo);
red=(int)red*0.8;
green=(int)green*0.8;
blue=(int)blue*0.8;
fwrite(&red,sizeof(char),1,fpw);
fwrite(&green,sizeof(char),1,fpw);
fwrite(&blue,sizeof(char),1,fpw);
}
fclose(fpo);
fclose(fpw);
numPicture = 2;
level=101;
Invalidate();
}
執行如下圖所示,影象減弱。4.D(B)=-1*D(A)+255
// 4.點運算 線性灰度求補 D(B)=-1*D(A)+255
void CImageProcessingView::OnDysXxqb()
{
if(numPicture==0) {
AfxMessageBox("載入圖片後才能線性灰度處理!",MB_OK,0);
return;
}
AfxMessageBox("線性灰度直方圖-灰度求補 D(B)=-1*D(A)+255!",MB_OK,0);
int i;
//開啟臨時的圖片
FILE *fpo = fopen(BmpName,"rb");
FILE *fpw = fopen(BmpNameLin,"wb+");
fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);
fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);
fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);
fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);
//灰度影象
unsigned char color;
unsigned char red,green,blue;
for( i=0; i<m_nImage/3; i++ )
{
fread(&red,sizeof(char),1,fpo);
fread(&green,sizeof(char),1,fpo);
fread(&blue,sizeof(char),1,fpo);
red=(int)red*(-1)+255;
green=(int)green*(-1)+255;
blue=(int)blue*(-1)+255;
fwrite(&red,sizeof(char),1,fpw);
fwrite(&green,sizeof(char),1,fpw);
fwrite(&blue,sizeof(char),1,fpw);
}
fclose(fpo);
fclose(fpw);
numPicture = 2;
level=101;
Invalidate();
}
執行效果如下圖所示,它是影象的求補,發現直方圖是互補的。三. 非線性變換
灰度非線性變換主要包括對數變換、冪次變換、指數變換、分段函式變換,通過非線性關係對影象進行灰度處理,下面主要講解課件中的兩個函式對其進行處理。其中對數變換實現了擴充套件低灰度值而壓縮高灰度值的效果,影象灰度分佈更符合而你的視覺特徵。
/************************************************************************/
/* 2種非線性變化直方圖:
/* ID_DYS_FXXPF:表示非線性平方灰度變化,D(B)=D(A)*D(A)/255
/* ID_DYS_FXXHS:表示非線性函式灰度變化,D(B)=D(A)+0.8*D(A)*(255-D(A))/255
/************************************************************************/
// 非線性平方灰度變化 D(B)=D(A)*D(A)/252
void CImageProcessingView::OnDysFxxpf()
{
if(numPicture==0)
{
AfxMessageBox("載入圖片後才能非線性灰度處理!",MB_OK,0);
return;
}
AfxMessageBox("非線性灰度變化 D(B)=D(A)*D(A)/255!",MB_OK,0);
int i;
//開啟臨時的圖片
FILE *fpo = fopen(BmpName,"rb");
FILE *fpw = fopen(BmpNameLin,"wb+");
//讀取檔案
fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);
fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);
fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);
fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);
//灰度影象
unsigned char color;
unsigned char red,green,blue;
for( i=0; i<m_nImage/3; i++ )
{
fread(&red,sizeof(char),1,fpo);
fread(&green,sizeof(char),1,fpo);
fread(&blue,sizeof(char),1,fpo);
red=(int)red*(int)red/255;
green=(int)green*(int)green/255;
blue=(int)blue*(int)blue/255;
fwrite(&red,sizeof(char),1,fpw);
fwrite(&green,sizeof(char),1,fpw);
fwrite(&blue,sizeof(char),1,fpw);
}
fclose(fpo);
fclose(fpw);
numPicture = 2;
level=101;
Invalidate();
}
執行效果如下圖所示:2.D(B)=D(A)+0.8*D(A)*(255-D(A))/255
// 非線性函式灰度變化 D(B)=D(A)+0.8*D(A)*(255-D(A))/255
void CImageProcessingView::OnDysFxxhs()
{
if(numPicture==0)
{
AfxMessageBox("載入圖片後才能非線性灰度處理!",MB_OK,0);
return;
}
AfxMessageBox("線性灰度直方圖-灰度變化增強 D(B)=D(A)+0.8*D(A)*(255-D(A))/255!",MB_OK,0);
int i;
FILE *fpo = fopen(BmpName,"rb");
FILE *fpw = fopen(BmpNameLin,"wb+");
fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);
fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);
fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);
fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);
unsigned char color;
unsigned char red,green,blue;
for( i=0; i<m_nImage/3; i++ )
{
fread(&red,sizeof(char),1,fpo);
fread(&green,sizeof(char),1,fpo);
fread(&blue,sizeof(char),1,fpo);
if( ((int)red+0.8*(int)red*(255-(int)red)/255) > 255 )
red=255;
else
red=(int)red+0.8*(int)red*(255-(int)red)/255;
if( ((int)green+0.8*(int)green*(255-(int)green)/255) > 255 )
green=255;
else
green=(int)green+0.8*(int)green*(255-(int)green)/255;
if( ((int)blue+0.8*(int)blue*(255-(int)blue)/255) > 255 )
blue=255;
else
blue=(int)blue+0.8*(int)blue*(255-(int)blue)/255;
fwrite(&red,sizeof(char),1,fpw);
fwrite(&green,sizeof(char),1,fpw);
fwrite(&blue,sizeof(char),1,fpw);
}
fclose(fpo);
fclose(fpw);
numPicture = 2;
level=101;
Invalidate();
}
執行效果如下圖所示:寫到此處你會發現影象灰度的線性變換和非線性變換是非常簡單的,主要是通過以下步驟完成:
第一步:賦值處理後影象的BMP頭資訊
FILE *fpo = fopen(BmpName,"rb");
FILE *fpw = fopen(BmpNameLin,"wb+");
fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);
fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);
fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);
fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);
第二步:通過迴圈和線性變換或非線性便函函式處理每一個畫素
for( i=0; i<m_nImage/3; i++ )
{
fread(&red,sizeof(char),1,fpo);
處理畫素RBG 如:red=(int)red*(int)red/255;
fwrite(&red,sizeof(char),1,fpw);
}
第三步:呼叫ShowBitmap自定義函式並重繪影象
numPicture = 2;
level=101;
Invalidate();
而它的主要應用包括:光度學標定,希望數字影象的灰度能夠真實反映影象的物理特性;對比度增強和對比度擴充套件;顯示標定和輪廓線確定(閾值化)。
四. 灰度閾值化
閾值又稱為臨界值,它的目的是確定出一個範圍,然後這個範圍內的部分使用同一種方法處理,而閾值之外的部分則使用另一種處理方法或保持原樣。常用的包括產生二值圖:當x<T時y=0,當x>=T時y=255(其中T是閾值)。閾值變換在生物學上的應用比較廣泛,常用語細胞影象分割等。
開啟類嚮導(Ctrl+W)生成選擇ImageProcessingView類,IDs選擇ID_DYS_YZBH後新增相應的函式。程式碼如下:
/**************************************************************/
/* ID_DYS_YZBH:表示點運算閾值變換 也看做灰度拉伸
/* 此處的拉伸是:閾值化(thresholding)可以看作是削波的一個特例
/* 只要令削波中的g1old=g2old就實現了閾值化。
/* 閾值就象個門檻,比它大就是白,比它小就是黑,二值
/**************************************************************/
void CImageProcessingView::OnDysYzbh()
{
if(numPicture==0)
{
AfxMessageBox("載入圖片後才能點運算閾值化處理!",MB_OK,0);
return;
}
AfxMessageBox("影象點運算閾值化處理!",MB_OK,0);
//讀寫檔案
FILE *fpo = fopen(BmpName,"rb");
FILE *fpw = fopen(BmpNameLin,"wb+");
fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);
fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);
fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);
fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);
//處理
unsigned char color;
unsigned char red,green,blue;
for(int i=0; i<m_nImage/3; i++ )
{
fread(&red,sizeof(char),1,fpo);
fread(&green,sizeof(char),1,fpo);
fread(&blue,sizeof(char),1,fpo);
if( (int)red > 128 )
red=255;
else
red=0;
if( (int)green > 128 )
green=255;
else
green=0;
if( (int)blue > 128 )
blue=255;
else
blue=0;
fwrite(&red,sizeof(char),1,fpw);
fwrite(&green,sizeof(char),1,fpw);
fwrite(&blue,sizeof(char),1,fpw);
}
fclose(fpo);
fclose(fpw);
numPicture = 2;
level=101;
Invalidate();
}
執行效果如下圖所示,感覺還挺好看的,顯然此時的直方圖就是0和255兩條直線。
五. 灰度均衡化
灰度均衡化的目的是使一輸入影象轉換為在每一灰度級上都有相同的畫素點(即輸出的直方圖是平的),它可以產生一幅灰度級分佈概率均衡的影象。
換句話說,經過均衡化後的影象在每一級灰度上畫素點的數量相差不大,對應的灰度直方圖的每一級高度也相差不大。它是增強影象的有效手段之一。
研究思路是通過直方圖變換公式實現:
Pi:0.03, 0, 0.06, 0.10, 0.20, 0.11, 0, 0, 0, 0.03, 0, 0.06, 0.10, 0.20, 0.11, 0
步驟2:i從1開始,令s[i]=s[i]+s[i-1],得到的結果是s: 0.03, 0.03, 0.09, 0.19, 0.39, 0.50, 0.50, 0.50, 0.50, 0.53, 0.53, 0.59, 0.69, 0.89, 1.0, 1.0
這樣就找到了原來的調色盤索引值和新的調色盤索引值之間的對應關係,即
0→0, 1→0, 2→1, 3→2, 4→4, 5→5, 6→5, 7→5, 8→5, 9→5, 10→5, 11→5, 12→6, 13→8, 14→9, 15→9。
// ID_DYS_JHH:表示影象均衡化 相見演算法
void CImageProcessingView::OnDysJhh()
{
if(numPicture==0) {
AfxMessageBox("載入圖片後才能影象均衡化!",MB_OK,0);
return;
}
AfxMessageBox("影象均衡化!",MB_OK,0);
//第一步:獲取影象的資料資訊
//此操作可以在開啟圖片時就進行 在直方圖取樣(ZFTCY)中也有該程式碼
FILE *fpo = fopen(BmpName,"rb");
fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);
fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);
int i,j,k;
for(j=0;j<256;j++) { //定義陣列並清零
Red[j]=0;
Green[j]=0;
Blue[j]=0;
}
//計算4個資料
unsigned char red,green,blue;
int IntRed,IntGreen,IntBlue; //強制轉換
double sumRedHD=0,sumGreenHD=0,sumBlueHD=0; //記錄影素總的灰度值和
for(i=0; i<m_nImage/3; i++ )
{
fread(&red,sizeof(char),1,fpo);
IntRed=int(red);
sumRedHD=sumRedHD+IntRed;
if( IntRed>=0 && IntRed<256 ) Red[IntRed]++;
fread(&green,sizeof(char),1,fpo);
IntGreen=int(green);
sumGreenHD=sumGreenHD+IntGreen;
if( IntGreen>=0 && IntGreen<256 ) Green[IntGreen]++;
fread(&blue,sizeof(char),1,fpo);
IntBlue=int(blue);
sumBlueHD=sumBlueHD+IntBlue;
if( IntBlue>=0 && IntBlue<256 ) Blue[IntBlue]++;
}
fclose(fpo);
/*****************************************************************/
/* 影象均衡化處理
/* 利用全域性變數 Red[256] Blue[256] Green[256]
/* 第一步:用3個陣列Count..記錄0-255灰度出現的概率,即
/* 概率=該灰度出現次數*3/總得畫素 (因為分成3部分RGB)
/* 第二步:i從1開始,令s[i]=s[i]+s[i-1] 記錄新概率數
/* 第三步:用一個陣列L記錄新的調色盤索引值,即
/* L[i]=s[i]×(256-1)結果四捨五入2.8即為3
/* 第四步:將老的索引值對應的概率合併,作為對應的新的索引值的概率
/* 1.原來的索引值0,1都對應了新的索引值0,則灰度索引值為0的概率
/* 為P0+P1=0.03
/* 2.新的索引值3和7找不到老的索引值與之對應,所以令Q3和Q7為0
/*****************************************************************/
//記錄出現的概率,會加到1 用於相加到調色盤
float CountRed[256],CountGreen[256],CountBlue[256];
//記錄原始資料,不會相加到1 用於計算新灰度概率
float CountRedLin[256],CountGreenLin[256],CountBlueLin[256];
for( k=0 ; k<256 ; k++ )
{
CountRed[k]=(float)(Red[k])*3/m_nImage;
CountRedLin[k]=CountRed[k];
CountGreen[k]=(float)(Green[k])*3/m_nImage;
CountGreenLin[k]=CountGreen[k];
CountBlue[k]=(float)(Blue[k])*3/m_nImage;
CountBlueLin[k]=CountBlue[k];
}
for( k=1 ; k<256 ; k++ )
{
CountRed[k]=CountRed[k]+CountRed[k-1];
CountGreen[k]=CountGreen[k]+CountGreen[k-1];
CountBlue[k]=CountBlue[k]+CountBlue[k-1];
}
/****************************************************/
/* 此處百度到一個四捨五入浮點型的演算法:
/* float a=3.456; 保留到小數點後兩位
/* float b=(int)((a * 100) + 0.5) / 100.0;
/* output b=3.46
/****************************************************/
int LRed[256],LGreen[256],LBlue[256]; //記錄調色盤
for( k=0 ; k<256 ; k++ )
{
LRed[k]=(int)(CountRed[k]*(256-1)+0.5);
LGreen[k]=(int)(CountGreen[k]*(256-1)+0.5);
LBlue[k]=(int)(CountBlue[k]*(256-1)+0.5);
}
//第三步:處理均衡化影象寫入 開啟臨時的圖片
fpo = fopen(BmpName,"rb");
fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);
fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);
FILE *fpw = fopen(BmpNameLin,"wb+");
fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);
fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);
//m_nWidth*m_nHeight 讀取圖片最後一行不為m_nWidth時會報錯 改為m_nImage/3
for( i=0; i<m_nImage/3 ; i++ )
{
fread(&red,sizeof(char),1,fpo);
fread(&green,sizeof(char),1,fpo);
fread(&blue,sizeof(char),1,fpo);
red=LRed[int(red)];
green=LGreen[int(green)];
blue=LBlue[int(blue)];
fwrite(&red,sizeof(char),1,fpw);
fwrite(&green,sizeof(char),1,fpw);
fwrite(&blue,sizeof(char),1,fpw);
}
fclose(fpw);
numPicture = 2;
level=101;
Invalidate();
}
執行結果如下圖所示,影象增強而且異常清晰:最後介紹下影象對比度拉伸,它就是把你感興趣的灰度範圍拉開,使得該範圍內畫素,亮的更亮,暗的更暗,從而達到增強對比度的目的。
如下圖所示,a、b、c為三段直線的斜率,g1old和g2old表示途中要進行對比度擴充套件的範圍,g1new和g2new表示對應的新值。當g1old=g2old就是二值影象閾值化處理。
最後還是希望文章對你有所幫助,如果文章有不足或錯誤之處,請海涵。最近挺忙的,寫這些古老的文章有人說在浪費青春,但我還是準備把這個系列講完,非常高興以前的程式碼註釋和風格都不錯,回憶起來挺好的,希望你也能養成好的程式碼和註釋風格~
(By:Eastmount 2015-06-02 下午4點 http://blog.csdn.net/eastmount/)
相關文章
- Android影像灰度化、線性灰度變化、二值化處理方法Android
- Python-OpenCV 處理影象(七):影象灰度化處理PythonOpenCV
- 【數字影象處理】三.MFC實現影象灰度、取樣和量化功能詳解
- 圖形影象處理-之-彩色轉化到灰度的速度優化優化
- [Python影象處理] 七.影象閾值化處理及演算法對比Python演算法
- Python-OpenCV 處理影象(八):影象二值化處理PythonOpenCV
- 【數字影象處理】七.MFC影象增強之影象普通平滑、高斯平滑、Laplacian、Sobel、Prewitt銳化詳解
- 【數字影象處理】四.MFC對話方塊繪製灰度直方圖直方圖
- 【數字影象處理】六.MFC空間幾何變換之影象平移、映象、旋轉、縮放詳解
- matlab中將RGB影象轉化為灰度影象Matlab
- 數字影象處理DIP
- 影象邊緣檢測—sobel運算元(灰度影象,彩色影象)
- OpenCV計算機視覺學習(3)——影像灰度線性變換與非線性變換(對數變換,伽馬變換)OpenCV計算機視覺
- [Python影象處理] 五.影象融合、加法運算及影象型別轉換Python型別
- Python-OpenCV 處理影象(二):濾鏡和影象運算PythonOpenCV
- MATLAB數字影象處理(二)影象增強Matlab
- 運籌優化(五)--線性規劃之內點法優化
- 數字影象處理-第一節
- 數字影象處理目錄列表
- matlab影象處理為什麼要歸一化和如…Matlab
- 影象處理 二維小波變換
- python - 圖片灰度化、二值化Python
- EasyPR--開發詳解(3)高斯模糊、灰度化和Sobel運算元
- MATLAB數字影象處理(一)基礎操作和傅立葉變換Matlab
- iOS 影象處理 - 影象拼接iOS
- 圖形影象處理-之-高質量的快速的影象縮放 中篇 二次線性插值和三次卷積插值卷積
- [Python影象處理] 三.獲取影象屬性、興趣ROI區域及通道處理Python
- [Python影象處理] 十.形態學之影象頂帽運算和黑帽運算Python
- 【數字影像處理】直方圖均衡化詳解及程式設計實現直方圖程式設計
- 圖形影象處理-之-高質量的快速的影象縮放 上篇 近鄰取樣插值和其速度優化優化
- 影象處理1--傅立葉變換(Fourier Transform )ORM
- [Python影象處理] 九.形態學之影象開運算、閉運算、梯度運算Python梯度
- 資料倉儲中維度變化和事實變化的處理方法
- 執行計劃變化的處理
- 影象處理之影象增強
- UIImage 影象處理UI
- Bayer影象處理
- php 處理 浮點數 精度運算 數字處理等PHP