国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Visual C++ 實(shí)現(xiàn)數(shù)字圖像增強(qiáng)處理
Visual C++實(shí)現(xiàn)數(shù)字圖像增強(qiáng)處理2002-12-25··劉 濤··yesky
前言
對(duì)于一個(gè)圖像處理系統(tǒng)來說,可以將流程分為三個(gè)階段,在獲取原始圖像后,首先是圖像預(yù)處理階段、第二是特征抽取階段、第三是識(shí)別分析階段。圖像預(yù)處理階段尤為重要,如果這階段處理不好,后面的工作根本無法展開。
在實(shí)際應(yīng)用中,我們的系統(tǒng)獲取的原始圖像不是完美的,例如對(duì)于系統(tǒng)獲取的原始圖像,由于噪聲、光照等原因,圖像的質(zhì)量不高,所以需要進(jìn)行預(yù)處理,以有利于提取我們感興趣的信息。圖像的預(yù)處理包括圖像增強(qiáng)、平滑濾波、銳化等內(nèi)容。圖像的預(yù)處理既可以在空間域?qū)崿F(xiàn),也可以在頻域內(nèi)實(shí)現(xiàn),我們主要介紹在空間域內(nèi)對(duì)圖像進(jìn)行點(diǎn)運(yùn)算,它是一種既簡(jiǎn)單又重要的圖像處理技術(shù),它能讓用戶改變圖像上像素點(diǎn)的灰度值,這樣通過點(diǎn)運(yùn)算處理將產(chǎn)生一幅新圖像。下面我們開始介紹與圖像點(diǎn)運(yùn)算的相關(guān)知識(shí)。
一、圖像的直方圖
圖像直方圖是圖像處理中一種十分重要的圖像分析工具,它描述了一幅圖像的灰度級(jí)內(nèi)容,任何一幅圖像的直方圖都包含了豐富的信息,它主要用在圖象分割,圖像灰度變換等處理過程中。從數(shù)學(xué)上來說圖像直方圖是圖像各灰度值統(tǒng)計(jì)特性與圖像灰度值的函數(shù),它統(tǒng)計(jì)一幅圖像中各個(gè)灰度級(jí)出現(xiàn)的次數(shù)或概率;從圖形上來說,它是一個(gè)二維圖,橫坐標(biāo)表示圖像中各個(gè)像素點(diǎn)的灰度級(jí),縱坐標(biāo)為各個(gè)灰度級(jí)上圖像各個(gè)像素點(diǎn)出現(xiàn)的次數(shù)或概率。如果不特別說明,本講座中的直方圖的縱坐標(biāo)都對(duì)應(yīng)著該灰度級(jí)在圖像中出現(xiàn)的概率。我們的例子是在一個(gè)對(duì)話框中顯示一個(gè)圖像的直方圖,為實(shí)現(xiàn)該目的,我們定義了一個(gè)名為"ZFT"的對(duì)話框類用來顯示圖像的直方圖,具體實(shí)現(xiàn)代碼和效果圖如下(關(guān)于代碼實(shí)現(xiàn)部分可以參考筆者2001年在天極網(wǎng)上發(fā)表的一篇VC實(shí)現(xiàn)數(shù)字圖像處理的文章):
//////////////////////////////////直方圖對(duì)話框構(gòu)造函數(shù);
ZFT::ZFT(CWnd* pParent /*=NULL*/)
: CDialog(ZFT::IDD, pParent)//ZFT為定義的用來顯示直方圖的對(duì)話框類;
{
Width=Height=0;//對(duì)話框初始化階段設(shè)置圖像的寬和高為"0";
}
////////////////////////對(duì)話框重畫函數(shù);
void ZFT::OnPaint()
{
CRect rect;//矩形區(qū)域?qū)ο螅?div style="height:15px;">
CWnd *pWnd;//得到圖片框的窗口指針;
pWnd=GetDlgItem(IDC_Graphic);//得到ZFT對(duì)話框內(nèi)的"Frame"控件的指針;
file://(IDC_Graphic為放置在對(duì)話框上的一個(gè)"Picture"控件,并講類型設(shè)置為"Frame")。
pWnd->GetClientRect(&rect);//得到"Frame"控件窗口的"視"區(qū)域;
int i;
CPaintDC dc(pWnd);//得到"Frame"控件的設(shè)備上下文;
file://畫直方圖的x、y軸;
dc.MoveTo(0,rect.Height());
dc.LineTo(rect.Width(),rect.Height());
dc.MoveTo(0,rect.Height());
dc.LineTo(0,0);
file://畫直方圖,num[]是"ZFT"的內(nèi)部數(shù)組變量,存放的是圖像各個(gè)灰度級(jí)出現(xiàn)的概率;該數(shù)組的各個(gè)分量在  顯示具體圖像的直方圖時(shí)設(shè)置;
for(i=0;i<256;i++)//根據(jù)圖像上的各個(gè)灰度級(jí)出現(xiàn)的概率,在坐標(biāo)上對(duì)應(yīng)的畫出一根直線,從而各個(gè)表示各灰度級(jí)出現(xiàn)概率的直線構(gòu)成了圖像的直方圖;
{
dc.MoveTo(i+1,rect.Height());
dc.LineTo (i+1,(rect.Height()-rect.Height()*num[i]*30));
file://此處num分量乘以"30"是為了放大個(gè)灰度級(jí)上對(duì)應(yīng)的出現(xiàn)概率直線,增強(qiáng)顯示效果;
}
}
////////////////////////////////////////////////////////
void ZFT::OnMouseMove(UINT nFlags, CPoint point)
{//OnMouseMove函數(shù)處理鼠標(biāo)消息,顯示當(dāng)前鼠標(biāo)所在直方圖上的灰度值等信息;
CWnd *pWnd,*pWndText;//定義兩個(gè)窗口對(duì)象;
CPoint point1;//定義個(gè)一個(gè)點(diǎn)對(duì)象;
point1=point;//存放當(dāng)前鼠標(biāo)的位置信息;
CRect rect;//矩形對(duì)象;
CString string ;//字符串對(duì)象;
pWnd=GetDlgItem(IDC_Graphic);//得到顯示直方圖的框架窗口對(duì)象指針;
pWndText=GetDlgItem(IDC_NUM);//得到指向文本框?qū)ο螅↖DC_NUM)窗口的指針;
pWnd->GetWindowRect(&rect);//獲取pWnd窗口對(duì)象窗口區(qū)域位置;
file://屏幕坐標(biāo)轉(zhuǎn)換為客戶區(qū)坐標(biāo);
ScreenToClient(&rect);
file://判斷當(dāng)前鼠標(biāo)是否指在直方圖內(nèi);
if(rect.PtInRect (point))
{
int x=point1.x-rect.left;
file://當(dāng)前鼠標(biāo)位置減去區(qū)域的起始位置恰好為當(dāng)前鼠標(biāo)所指位置所表示的灰度級(jí);
string.Format("%d",x);
file://顯示當(dāng)前位置對(duì)應(yīng)的圖像的灰度級(jí);
pWndText->SetWindowText((LPCTSTR)string);
}
CDialog::OnMouseMove(nFlags, point);
}
////////////////////////////////////////
void CDibView::OnImagehorgm()
file://在程序的"視"類對(duì)象內(nèi)處理顯示圖像直方圖的函數(shù);
{
CDibDoc *pDoc=GetDocument();
HDIB hdib;
hdib=pDoc->GetHDIB();
BITMAPINFOHEADER *lpDIBHdr;//位圖信息頭結(jié)構(gòu)指針;
BYTE *lpDIBBits;//指向位圖像素灰度值的指針;
lpDIBHdr=( BITMAPINFOHEADER *)GlobalLock(hdib);//得到圖像的位圖頭信息
lpDIBBits=(BYTE*)lpDIBHdr+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);
file://獲取圖像像素值
ZFT dialog;//直方圖對(duì)話框模板對(duì)象;
int i,j;
int wImgWidth=lpDIBHdr->biWidth;
int wImgHeight=lpDIBHdr->biHeight;
file://a[]數(shù)組用來存放各個(gè)灰度級(jí)出現(xiàn)的概率;
float a[256];
for(i=0;i<256;i++)//初始化數(shù)組;
{
a[i]=0;
}
file://統(tǒng)計(jì)各個(gè)灰度級(jí)出現(xiàn)的次數(shù);
for(i=0;i
{
for(j=0;j
{
a[*(lpDIBBits+WIDTHBYTES(wImgWidth*8)*i+j)]++;
}
file://統(tǒng)計(jì)各個(gè)灰度級(jí)出現(xiàn)的概率;
for(i=0;i<256;i++)
{
a[i]=a[i]/(wImgHeight*wImgWidth);//得到每個(gè)灰度級(jí)的出現(xiàn)概率;
memcpy(dialog.num,a,256*sizeof(float));
}
}
dialog.DoModal();//顯示直方圖對(duì)話框;
}
return;
}
(a)LENA圖像
(b)直方圖
圖一
上圖為L(zhǎng)ENA的原始圖像和其對(duì)應(yīng)的直方圖,在(b)圖中的135表示當(dāng)前鼠標(biāo)在直方圖中所指的位置對(duì)應(yīng)的灰度級(jí)為135。從該直方圖可以看出,LENA圖像的灰度主要分布在中高灰度級(jí)上,在低灰度級(jí)上圖像的像素?cái)?shù)幾乎為零。
二、圖像增強(qiáng)
影響系統(tǒng)圖像清晰程度的因素很多,例如室外光照度不夠均勻就會(huì)造成圖像灰度過于集中;由CCD(攝像頭)獲得的圖像經(jīng)過A/D(數(shù)/模轉(zhuǎn)換,該功能在圖像系統(tǒng)中由數(shù)字采集卡來實(shí)現(xiàn))轉(zhuǎn)換、線路傳送都會(huì)產(chǎn)生噪聲污染等等。因此圖像質(zhì)量不可避免的降低了,輕者表現(xiàn)為圖像不干凈,難于看清細(xì)節(jié);重者表現(xiàn)為圖像模糊不清,連概貌也看不出來。因此,在對(duì)圖像進(jìn)行分析之前,必須要對(duì)圖像質(zhì)量進(jìn)行改善,一般情況下改善的方法有兩類:圖像增強(qiáng)和圖像復(fù)原。圖像增強(qiáng)不考慮圖像質(zhì)量下降的原因,只將圖像中感興趣的特征有選擇的突出,而衰減不需要的特征,它的目的主要是提高圖像的可懂度。圖像增強(qiáng)的方法分為空域法和頻域法兩類,空域法主要是對(duì)圖像中的各個(gè)像素點(diǎn)進(jìn)行操作;而頻域法是在圖像的某個(gè)變換域內(nèi),對(duì)圖像進(jìn)行操作,修改變換后的系數(shù),例如付立葉變換、DCT變換等的系數(shù),然后再進(jìn)行反變換得到處理后的圖像。圖像復(fù)原技術(shù)與增強(qiáng)技術(shù)不同,它需要了解圖像質(zhì)量下降的原因,首先要建立"降質(zhì)模型",再利用該模型,恢復(fù)原始圖像。本期講座我們主要介紹各種增強(qiáng)技術(shù)在圖象處理系統(tǒng)中的實(shí)際應(yīng)用。
1.灰度變換
簡(jiǎn)單的說,灰度變換就是指對(duì)圖像上各個(gè)像素點(diǎn)的灰度值x按某個(gè)函數(shù)T()變換到y(tǒng)。例如為了提高圖像的清晰度,需要將圖像的灰度級(jí)整個(gè)范圍或其中某一段(A,B)擴(kuò)展或壓縮到(A
,B
);需要顯示出圖像的細(xì)節(jié)部分等都要求采用灰度變換方法?;叶茸儞Q有時(shí)又被稱為圖像的對(duì)比度增強(qiáng)或?qū)Ρ榷壤臁<俣ㄝ斎雸D像中的一個(gè)像素的灰度級(jí)為Z,經(jīng)過T(Z)函數(shù)變換后輸出圖像對(duì)應(yīng)的灰度級(jí)為Z
,其中要求Z和Z
都要在圖像的灰度范圍之內(nèi)。根據(jù)T()形式,可以將灰度變換分為線性變換和非線性變換。具體應(yīng)用中采用何種T(),需要根據(jù)變換的要求而定。
對(duì)于圖像的灰度變換,我們這里介紹一種稍微復(fù)雜一點(diǎn)的方法,既直方圖均衡化。直方圖均衡化是灰度變換的一個(gè)重要應(yīng)用,廣泛應(yīng)用在圖像增強(qiáng)處理中,它是以累計(jì)分布函數(shù)變換為基礎(chǔ)的直方圖修正法,可以產(chǎn)生一幅灰度級(jí)分布具有均勻概率密度的圖像,擴(kuò)展了像素的取值動(dòng)態(tài)范圍。若像素點(diǎn)的原灰度為R,變換后的灰度為S,需要注意的是R、S是歸一化后的灰度值,其灰度變換函數(shù)T()為:
S=T (R);
k=0,1…, ;
式中,
是第j級(jí)灰度值的概率,
是圖像中j級(jí)灰度的像素總數(shù),
是圖像中灰度級(jí)的總數(shù)目,
是圖象中像素的總數(shù)。對(duì)變換后的S值取最靠近的一個(gè)灰度級(jí)的值,建立灰度級(jí)變換表,將原圖像變換為直方圖均衡的圖像。下面是實(shí)現(xiàn)圖像直方圖均衡化函數(shù)的源代碼和效果圖:
void CDibView::OnZftJh()
{
CClientDC pDC(this);
HDC hDC=pDC.GetSafeHdc();//獲取當(dāng)前設(shè)備上下文的句柄;
SetStretchBltMode(hDC,COLORONCOLOR);
CDibDoc *pDoc=GetDocument();
HDIB hdib;
hdib=pDoc->GetHDIB();
BITMAPINFOHEADER *lpDIBHdr;//位圖信息頭結(jié)構(gòu)指針;
BYTE *lpDIBBits;//指向位圖像素灰度值的指針;
lpDIBHdr=( BITMAPINFOHEADER *)GlobalLock(hdib);//得到圖像的位圖頭信息
lpDIBBits=(BYTE*)lpDIBHdr+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);
file://獲取圖像像素值
float p[256],p1[256],num[256];
int i,j,k;
for(i=0;i<256;i++)//清空三個(gè)數(shù)組;
{ num[i]=0.0f;
p[i]=0.0f;
p1[i]=0.0f;
}
file://num[]存放圖象各個(gè)灰度級(jí)出現(xiàn)的次數(shù);
int Height=lpDIBHdr->biHeight;
int Width=lpDIBHdr->biWidth;
for(i=0;i
for(j=30;j
{
num[*(lpDIBBits+WIDTHBYTES(Width*8)*i+j)]++;
}
file://p[]存放圖像各個(gè)灰度級(jí)的出現(xiàn)概率;
for(i=0;i<256;i++)
{
p[i]=num[i]/(Width*Height);
}
file://p1[]存放各個(gè)灰度級(jí)之前的概率和,用于直方圖變換;
for(i=0;i<256;i++)
{
for(k=0;k<=i;k++)
p1[i]+=p[k];
}
file://直方圖變換;
for(i=0;i
for(j=30;j
{   *(lpDIBBits+WIDTHBYTES(Width*8)*i+j)=(BYTE)(p1[*(lpDIBBits+WIDTHBYTES(Width*8)*i+j)]*255+0.5);
}
StretchDIBits (hDC,0,0,lpDIBHdr->biWidth,lpDIBHdr->biHeight,0,0,
lpDIBHdr->biWidth,lpDIBHdr->biHeight,
lpDIBBits,(LPBITMAPINFO)lpDIBHdr,
DIB_RGB_COLORS,
SRCCOPY);//顯示圖像;
}
(a)LENA原圖
(b)直方圖均衡化后的效果圖
(c)原始圖象的直方圖
(d)均衡化后的直方他圖
圖 二
從上述效果圖可以看出,經(jīng)過直方圖均衡化處理后,圖像變的清晰了,從直方圖來看,處理后的LENA的圖像直方圖分布更均勻了,在每個(gè)灰度級(jí)上圖像都有像素點(diǎn)。但是直方圖均衡化存在著兩個(gè)缺點(diǎn):
1)變換后圖像的灰度級(jí)減少,某些細(xì)節(jié)消失;
2)某些圖像,如直方圖有高峰,經(jīng)處理后對(duì)比度不自然的過分增強(qiáng)。
為此M.Kamel和Lian Guan等人從圖像相鄰像素一般高度相關(guān)這一事實(shí)出發(fā),將灰度概率分布和空間相關(guān)性聯(lián)系在一起,提出了用二維條件概率密度函數(shù)取代一維概率密度函數(shù)作為均衡化條件,很好的解決了這個(gè)問題,有興趣的朋友可以參閱一些圖像處理書籍和資料。
2.圖像平滑
圖像平滑主要是為了消除噪聲。噪聲并不限于人眼所能看的見的失真和變形,有些噪聲只有在進(jìn)行圖像處理時(shí)才可以發(fā)現(xiàn)。圖像的常見噪聲主要有加性噪聲、乘性噪聲和量化噪聲等。圖像中的噪聲往往和信號(hào)交織在一起,尤其是乘性噪聲,如果平滑不當(dāng),就會(huì)使圖像本身的細(xì)節(jié)如邊界輪廓、線條等變的模糊不清,如何既平滑掉噪聲有盡量保持圖像細(xì)節(jié),是圖像平滑主要研究的任務(wù)。
一般來說,圖像的能量主要集中在其低頻部分,噪聲所在的頻段主要在高頻段,同時(shí)系統(tǒng)中所要提取的汽車邊緣信息也主要集中在其高頻部分,因此,如何去掉高頻干擾又同時(shí)保持邊緣信息,是我們研究的內(nèi)容。為了去除噪聲,有必要對(duì)圖像進(jìn)行平滑,可以采用低通濾波的方法去除高頻干擾。圖像平滑包括空域法和頻域法兩大類,在空域法中,圖像平滑的常用方法是采用均值濾波或中值濾波,對(duì)于均值濾波,它是用一個(gè)有奇數(shù)點(diǎn)的滑動(dòng)窗口在圖像上滑動(dòng),將窗口中心點(diǎn)對(duì)應(yīng)的圖像像素點(diǎn)的灰度值用窗口內(nèi)的各個(gè)點(diǎn)的灰度值的平均值代替,如果滑動(dòng)窗口規(guī)定了在取均值過程中窗口各個(gè)像素點(diǎn)所占的權(quán)重,也就是各個(gè)像素點(diǎn)的系數(shù),這時(shí)候就稱為加權(quán)均值濾波;對(duì)于中值濾波,對(duì)應(yīng)的像素點(diǎn)的灰度值用窗口內(nèi)的中間值代替。實(shí)現(xiàn)均值或中值濾波時(shí),為了簡(jiǎn)便編程工作,可以定義一個(gè)n*n的模板數(shù)組。另外,讀者需要注意一點(diǎn),在用窗口掃描圖像過程中,對(duì)于圖像的四個(gè)邊緣的像素點(diǎn),可以不處理;也可以用灰度值為"0"的像素點(diǎn)擴(kuò)展圖像的邊緣。下面給出了采用加權(quán)均值濾波的圖像平滑函數(shù)代碼和效果圖:
void CDibView::OnImagePh()
{
CClientDC pDC(this);
HDC hDC=pDC.GetSafeHdc();//獲取當(dāng)前設(shè)備上下文的句柄;
SetStretchBltMode(hDC,COLORONCOLOR);
HANDLE data1handle;
LPBITMAPINFOHEADER lpBi;
CDibDoc *pDoc=GetDocument();
HDIB hdib;
unsigned char *hData;
unsigned char *data;
hdib=pDoc->GetHDIB();
BeginWaitCursor();
lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);
hData=(unsigned char*)FindDIBBits((LPSTR)lpBi);
pDoc->SetModifiedFlag(TRUE);
data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight);
data=(unsigned char*)GlobalLock((HGLOBAL)data1handle);
AfxGetApp()->BeginWaitCursor();
int i,j,s,t,ms=1;
int sum=0,sumw=0;
int mask[3][3]={{1,1,1},{1,2,1},{1,1,1}};//定義的3x3加權(quán)平滑模板;
for(i=0; ibiHeight; i++)
for(j=0; jbiWidth; j++)
{
sumw=0; sum=0;
for(s=(-ms); s<=ms; s++)
for(t=(-ms); t<=ms; t++)     if(((i+s)>=0)&&((j+t)>=0)&&((i+s)biHeight)&&((j+t)biWidth))
{
sumw += mask[1+s][1+t];
sum+=*(hData+(i+s)*WIDTHBYTES(lpBi->biWidth*8)+(j+t))*mask[1+s][1+t];
}
if(sumw==0) sumw=1;
sum/=sumw;
if(sum>255)sum=255;
if(sum<0)sum=0;
*(data+i*WIDTHBYTES(lpBi->biWidth*8)+j)=sum;
}
for( j=0; jbiHeight; j++)
for(i=0;ibiWidth;i++)  *(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)=*(data+i*WIDTHBYTES(lpBi->biWidth*8)+j);
StretchDIBits (hDC,0,0,lpBi->biWidth,lpBi->biHeight,0,0,
lpBi->biWidth,lpBi->biHeight,
hData,(LPBITMAPINFO)lpBi,
DIB_RGB_COLORS,
SRCCOPY);//顯示圖像;
}
(a)LENA原圖
(b)平滑后的效果圖
圖三
中值或均值平滑有時(shí)處理圖像的效果并不是很好,它雖然去除了一定的噪聲,但同時(shí)使圖像中的邊緣變的模糊,這主要和所選取的窗口大小有關(guān),為此下面介紹了一種既能保持邊緣清晰又能消除噪聲的方法,其算法如圖四所示:
(a)
(b)
(c)
圖 四 圖像平滑模板
上圖的含義是在圖像中取5*5的區(qū)域,包含點(diǎn)(i,j)的五邊形和六邊形各四個(gè),3*3的區(qū)域一個(gè),計(jì)算這九個(gè)區(qū)域的標(biāo)準(zhǔn)差和灰度的平均值,取標(biāo)準(zhǔn)差最小區(qū)域的灰度平均值作為點(diǎn)(i,j)的灰度。由于該算法的實(shí)現(xiàn)代碼和上述代碼大同小異,所以代碼部分就不再贅述。
3.圖像銳化
圖像平滑往往使圖像中的邊界、輪廓變的模糊,為了減少這類不利效果的影響,這就需要利用圖像鋭化技術(shù),使圖像的邊緣變的清晰。圖像銳化處理的目的是為了使圖像的邊緣、輪廓線以及圖像的細(xì)節(jié)變的清晰,經(jīng)過平滑的圖像變得模糊的根本原因是因?yàn)閳D像受到了平均或積分運(yùn)算,因此可以對(duì)其進(jìn)行逆運(yùn)算(如微分運(yùn)算)就可以使圖像變的清晰。從頻率域來考慮,圖像模糊的實(shí)質(zhì)是因?yàn)槠涓哳l分量被衰減,因此可以用高通濾波器來使圖像清晰。
為了要把圖像中間任何方向伸展的的邊緣和輪廓線變得清晰,我們希望對(duì)圖像的某種運(yùn)算是各向同性的??梢宰C明偏導(dǎo)平方和的運(yùn)算是各向同性的,既:
式中(
)是圖像旋轉(zhuǎn)前的坐標(biāo),(
)是圖像旋轉(zhuǎn)后的坐標(biāo)。梯度運(yùn)算就是在這個(gè)式子的基礎(chǔ)上開方得到的。圖像(x,y)點(diǎn)的梯度值:
為了突出物體的邊緣,常常采用梯度值的改進(jìn)算法,將圖像各個(gè)點(diǎn)的梯度值與某一閾值作比較,如果大于閾值,該像素點(diǎn)的灰度用梯度值表示,否則用一個(gè)固定的灰度值表示。
我們?cè)趯?duì)圖像增強(qiáng)的過程中,采用的是一種簡(jiǎn)單的高頻濾波增強(qiáng)方法:
式中f,g分別為銳化前后的圖像,
是與擴(kuò)散效應(yīng)有關(guān)的系數(shù)。
表示對(duì)圖像f進(jìn)行二次微分的拉普拉斯算子。這表明不模糊的圖像可以由模糊的圖像減去乘上系數(shù)的模糊圖像拉普拉斯算子來得到。
可以用下面的模板H={{1,4,1},{4,-20,4},{1,4,1}}來近似。在具體實(shí)現(xiàn)時(shí),上述模板H中的各個(gè)系數(shù)可以改變,
這個(gè)系數(shù)的選擇也很重要,太大了會(huì)使圖像的輪廓過沖,太小了則圖像銳化不明顯。實(shí)驗(yàn)表明,
選取2-8之間往往可以達(dá)到比較滿意的效果。下面給出
等于4的情況下的實(shí)現(xiàn)代碼和效果圖:
void CDibView::OnMenuitem32785()
{
CClientDC pDC(this);
HDC hDC=pDC.GetSafeHdc();//獲取當(dāng)前設(shè)備上下文的句柄;
SetStretchBltMode(hDC,COLORONCOLOR);
CDibDoc *pDoc=GetDocument();
HDIB hdib;
hdib=pDoc->GetHDIB();
BITMAPINFOHEADER *lpDIBHdr;//位圖信息頭結(jié)構(gòu)指針;
BYTE *lpDIBBits;//指向位圖像素灰度值的指針;
lpDIBHdr=( BITMAPINFOHEADER *)GlobalLock(hdib);//得到圖像的位圖頭信息 lpDIBBits=(BYTE*)lpDIBHdr+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);// 獲取圖像像素值
BYTE* pData1;
static int a[3][3]={{1,4,1},{4,-20,4},{1,4,1}};//拉普拉斯算子模板;
int m,n,i,j,sum;
int Width=lpDIBHdr->biWidth;
int Height=lpDIBHdr->biHeight;
pData1=(BYTE*)new char[WIDTHBYTES(Width*8)*Height];
file://進(jìn)行拉普拉斯濾波運(yùn)算;
for(i=1;i
for(j=1;j
{
sum=0;
for(m=-1;m<2;m++)
for(n=-1;n<2;n++) sum+=*(lpDIBBits+WIDTHBYTES(Width*8)*(i+m)+j+n)*a[1+m][1+n];
if(sum<0) sum=0;
if(sum>255) sum=255;
*(pData1+WIDTHBYTES(Width*8)*i+j)=sum;
}
file://原始圖像pData減去拉普拉斯濾波處理后的圖像pData1
for(i=0;i
for(j=0;j
{ sum=(int)(*(lpDIBBits+WIDTHBYTES(Width*8)*i+j)-4*(*(pData1+WIDTHBYTES(Width*8)*i+j)));
if(sum<0) sum=0;
if(sum>255) sum=255;
*(lpDIBBits+WIDTHBYTES(Width*8)*i+j)=sum;
}
StretchDIBits (hDC,0,0,lpDIBHdr->biWidth,lpDIBHdr->biHeight,0,0,
lpDIBHdr->biWidth,lpDIBHdr->biHeight,
lpDIBBits,(LPBITMAPINFO)lpDIBHdr,
DIB_RGB_COLORS,
SRCCOPY);
}
(a)LENA原圖
(b)拉普拉斯銳化圖
圖 五
本文主要講解了圖像直方圖的基本概念和圖像點(diǎn)處理運(yùn)算中的增強(qiáng)、平滑、銳化概念和實(shí)現(xiàn)算法,并給處理實(shí)現(xiàn)代碼和處理效果圖和廣大讀者朋友們交流,希望達(dá)到拋磚引玉的作用。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
VC++圖像處理編程 - LiteQ的日志 - 網(wǎng)易博客
攝影學(xué)堂(每四部分:后期處理)
C++圖像的膨脹和腐蝕
#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)
位圖操作函數(shù)WIDTHBYTES
積分圖像(Integral Image)與積分直方圖 (Integral Histogram)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服