?? zhongzhi.txt
字號:
*****************************************************
*
* 函數名稱:
* Template:
*
* 參數:
* HDIB hDIB -圖像的句柄
* int tem_w -模板的寬度
* int tem_h -模板的高度
*
* 功能:
* 對圖像進行中值
*
* 說明:
* 為處理方便起見,模板的寬度和高度都應為奇數
*******************************************************/
HDIB MidFilter(HDIB hDIB,int tem_w,int tem_h)
{
//統計中間值
double mid;
BYTE *temp=(BYTE*)malloc(tem_w*tem_h*sizeof(BYTE));
//指向圖像起始位置的指針
BYTE *lpDIB=(BYTE*)::GlobalLock((HGLOBAL) hDIB);
//指向象素起始位置的指針
BYTE *pScrBuff =(BYTE*)::FindDIBBits((char*)lpDIB);
//獲取圖像的顏色信息
int numColors=(int) ::DIBNumColors((char *)lpDIB);
//如果圖像不是256色返回
if (numColors!=256)
{
//解除鎖定
::GlobalUnlock((HGLOBAL) hDIB);
//返回
return(hDIB);
}
//將指向圖像象素起始位置的指針,賦值給指針變量
BYTE* oldbuf = pScrBuff;
//循環變量
int i,j,m,n;
int w, h, dw;
//獲取圖像的寬度
w = (int) ::DIBWidth((char *)lpDIB);
//獲取圖像的高度
h = (int) ::DIBHeight((char *)lpDIB);
//計算圖像每行的字節數
dw = (w+3)/4*4;
//建立一個和原圖像大小相同的25色灰度位圖
HDIB newhDIB=NewDIB(w,h,8);
//指向新的位圖的指針
BYTE *newlpDIB=(BYTE*)::GlobalLock((HGLOBAL) newhDIB);
//指向新的位圖的象素起始位置的指針
BYTE *destBuf = (BYTE*)FindDIBBits((char *)newlpDIB);
//將指向新圖像象素起始位置的指針,賦值給指針變量
BYTE *newbuf=destBuf;
//對圖像進行掃描
//行
for(i=0;i<h;i++)
{
//列
for(j=0;j<w;j++)
{
//為統計變量賦初始值
//對于圖像的4個邊框的象素保持原灰度不變
if( j<((tem_w-1)/2) || j>(w-(tem_w+1)/2) || i<((tem_h-1)/2) || i>(h-(tem_h+1)/2) )
*(newbuf+i*dw+j)=*(oldbuf+i*dw+j);
//對于其他的象素進行模板操作
else
{
//將點(i,j)點作為模板的中心
for(m=i-((tem_h-1)/2);m<=i+((tem_h-1)/2);m++)
{
for(n=j-((tem_w-1)/2);n<=j+((tem_w-1)/2);n++)
//將以點(i,j)為中心,與模板大小相同的范圍內的象素傳遞到模板矩陣中
temp[(m-i+((tem_h-1)/2))*tem_w+n-j+((tem_w-1)/2)]=*(oldbuf+m*dw+n);
}
//利用氣泡法計算中值
for(m=0;m<tem_w*tem_h-1;m++)
{
for(n=0;n<tem_w*tem_h-m-1;n++)
{
if(temp[n]>temp[n+1])
mid=temp[n];
temp[n]=temp[n+1];
temp[n+1]=mid;
}
}
//將計算的結果放到新的位圖的相應位置
*(newbuf+i*dw+j)=temp[(tem_w*tem_h-1)/2];
}
}
}
//解除鎖定
::GlobalUnlock((HGLOBAL)hDIB);
//返回新的位圖的句柄
return(newhDIB);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -