?? improve.cpp
字號:
int px,py,c;
int* value; //用來保存要排序的數值
int count; //用來保存采樣窗口的像素數量
value = new int[tw*tw];
k=0;
//從采樣窗口中取得像素灰度
for(i=0; i<tw; i++)
{
for(j=0; j<tw; j++)
{
py=y-tw/2+i;
px=x-tw/2+j;
//如果該像素位于采樣窗口中
if(templt[i*tw+j]>0)
{
//保存像素灰度
value[k]=imageBuf0[py][px*4+cn];
k++;
}
}
}
count = k;
vector<int> nums(tw*tw);
for (int i = 0; i < tw*tw; i++)
nums[i] = value[i];
//對保存的像素灰度數據進行排序
sort(nums.begin(), nums.end());
//保存中值
c=nums[count/2];
//清理內存
delete[] value;
return c;
}
/******************************************************************
* 功能: 彩色圖像的中值濾波平滑處理
* 參數: image0為原圖形,image1平滑結果,
* w、h為圖象的寬和高
* size為進行平滑的鄰域邊長
******************************************************************/
void SmoothMedianCl(BYTE* image0, BYTE* image1, unsigned int w, unsigned int h, unsigned int size)
{
//將圖像轉化為矩陣形式
BYTE** imageBuf0 = CreatImage(image0, w, h);
BYTE** imageBuf1 = CreatImage(image1, w, h);
//設定模板
int* templt;
int x,y,c;
int a;
int scale;
//根據鄰域大小設定模板
templt = new int[size * size];
for(x=0; x<size*size; x++)
{
templt[x]=1;
}
//設定衰減因子
scale = 1;
//依次對原圖像的每個像素進行處理
for(y=size/2; y<h-size/2; y++)
{
for(x=size/2; x<w-size/2; x++)
{
for(c=0; c<3; c++)
{
//取采樣窗口中像素灰度的中值
a=MedianValueCl(imageBuf0,w,h,templt,size,x,y,c);
a/= scale;
//過限處理
a = a>255?255:a;
a = a<0?0:a;
imageBuf1[y][x*4+c]=a;
}
}
}
//清理內存
delete[] templt;
free(imageBuf0);
free(imageBuf1);
}
/******************************************************************
* 功能: 灰度圖像的拉普拉斯銳化處理(scale = 3)
* 參數: image0為原圖形,image1銳化結果,
* w、h為圖象的寬和高
******************************************************************/
void SharpLaplacianAsh(BYTE* image0, BYTE* image1, unsigned int w, unsigned int h)
{
//將圖像轉化為矩陣形式
BYTE** imageBuf0 = CreatImage(image0, w, h);
BYTE** imageBuf1 = CreatImage(image1, w, h);
//設定模板
int templt[9]={-1,-1,-1,-1,8,-1,-1,-1,-1};
int x,y;
int a;
int scale;
scale = 3;//設定衰減因子
//依次對原圖像的每個像素進行處理
for(y=1; y<h-1; y++)
for(x=1; x<w-1; x++)
{
//利用拉普拉斯模板對鄰域進行處理
a=TempltExcuteAsh(imageBuf0,w,h,templt,3,x,y);
a/= scale;
//對中心像素進行增強
a=GetAsh(imageBuf0,x,y)+a;
//過限處理
a = a>255?255:a;
a = a<0?0:a;
SetPixelXY(imageBuf1,x,y,a);
}
//清理內存
free(imageBuf0);
free(imageBuf1);
}
/******************************************************************
* 功能: 彩色圖像的拉普拉斯銳化處理(scale = 3)
* 參數: image0為原圖形,image1銳化結果,
* w、h為圖象的寬和高
******************************************************************/
void SharpLaplacianCl(BYTE* image0, BYTE* image1, unsigned int w, unsigned int h)
{
//將圖像轉化為矩陣形式
BYTE** imageBuf0 = CreatImage(image0, w, h);
BYTE** imageBuf1 = CreatImage(image1, w, h);
//設定模板
int templt[9]={-1,-1,-1,-1,8,-1,-1,-1,-1};
int x,y,c;
int a;
int scale;
//設定衰減因子
scale = 3;
//依次對原圖像的每個像素進行處理
for(y=1; y<h-1; y++)
{
for(x=1; x<w-1; x++)
{
for(c=0; c<3; c++)
{
//利用拉普拉斯模板對鄰域進行處理
a=TempltExcuteCl(imageBuf0,w,h,templt,3,x,y,c);
a/= scale;
//對中心像素進行增強
a=imageBuf0[y][x*4+c]+a;
//過限處理
a = a>255?255:a;
a = a<0?0:a;
imageBuf1[y][x*4+c]=a;
}
}
}
//清理內存
free(imageBuf0);
free(imageBuf1);
}
void SetPixel(BYTE* image1, unsigned int n, int a)
{
image1[n] = a;
image1[n+1] = a;
image1[n+2] = a;
image1[n+3] = 255;
}
/***********************************************************************
* Sobel邊緣檢測 (scale=0.5)
* 參數: image0為原圖形,image1為邊緣檢測結果,w、h為圖像的寬和高
* 當type為true時,差分結果取水平和垂直方向差分中較大者,否則取平均值
************************************************************************/
void SideSobel(BYTE* image0, BYTE* image1, unsigned int w, unsigned int h, bool type)
{
int x, y, a, aHr, aHg, aHb, aVr, aVg, aVb, aH, aV;
long n;
double scale = 0.5;
//依次處理每個像素
for(y = 1; y < h-1; y++)
for(x = 1; x < w-1; x++)
{
//計算像素的偏移位置
n = (y*w+x)*4;
//計算紅色分量水平灰度差
aHr = abs( (image0[n-w*4-4]+image0[n-4]*2+image0[n+w*4-4])
- (image0[n-w*4+4]+image0[n+4]*2+image0[n+w*4+4]) );
//計算紅色分量垂直灰度差
aVr = abs( (image0[n-w*4-4]+image0[n-w*4]*2+image0[n-w*4+4])
- (image0[n+w*4-4]+image0[n+w*4]*2+image0[n+w*4+4]) );
//計算綠色分量水平灰度差
aHg = abs( (image0[n-w*4-4+1]+image0[n-4+1]*2+image0[n+w*4-4+1])
- (image0[n-w*4+4+1]+image0[n+4+1]*2+image0[n+w*4+4+1]) );
//計算綠色分量垂直灰度差
aVg = abs( (image0[n-w*4-4+1]+image0[n-w*4+1]*2+image0[n-w*4+4+1])
- (image0[n+w*4-4+1]+image0[n+w*4+1]*2+image0[n+w*4+4+1]) );
//計算藍色分量水平灰度差
aHb = abs( (image0[n-w*4-4+2]+image0[n-4+2]*2+image0[n+w*4-4+2])
- (image0[n-w*4+4+2]+image0[n+4+2]*2+image0[n+w*4+4+2]) );
//計算藍色分量垂直灰度差
aVb = abs( (image0[n-w*4-4+2]+image0[n-w*4+2]*2+image0[n-w*4+4+2])
- (image0[n+w*4-4+2]+image0[n+w*4+2]*2+image0[n+w*4+4+2]) );
//計算水平綜合灰度差
aH = aHr + aHg + aHb;
//計算垂直綜合灰度差
aV = aVr + aVg + aVb;
if(type)
{
//取水平和垂直方向差分中較大者
if(aH > aV) a = aH;
else a = aV;
}
else
{
//取水平和垂直方向差分的平均值
a = (aH + aV)/2;
}
a = a *scale;
a = a>255?255:a;
//生成邊緣掃描結果
SetPixel(image1,n,a);
}
}
/******************************************************************
* 功能: 對圖像進行二值化處理
* 參數: image0為原圖形,image1為處理的結果圖像,
* w、h為圖象的寬和高
* K為閾值
******************************************************************/
void ToTwoValue(BYTE* image0, BYTE* image1, unsigned int w, unsigned int h, int K)
{
//將圖像轉化為矩陣形式
BYTE** imageBuf0 = CreatImage(image0, w, h);
BYTE** imageBuf1 = CreatImage(image1, w, h);
int x,y;
//依次對原圖像的每個像素進行處理
for(y=0; y<h; y++)
for(x=0; x<w; x++)
{
//如果當前點已經為單點 則在結果圖中用黑色標記
if( GetAsh(imageBuf0,x,y) >=K )
{
SetPixelXY (imageBuf1,x,y,255 );
}
//如果當前點不是單點 則在結果圖中用白色標記
else
{
SetPixelXY(imageBuf1,x,y,0);
}
}
//清理內存
free(imageBuf0);
free(imageBuf1);
}
/******************************************************************
* 功能: 對兩副圖像進行減法運算
* 參數: image0為原圖形,image1為要減去的圖像,
* w、h為圖象的寬和高
******************************************************************/
void Subtract(BYTE* image0, BYTE* image1, unsigned int w, unsigned int h)
{
//將圖像轉化為矩陣形式
BYTE** imageBuf0 = CreatImage(image0, w, h);
BYTE** imageBuf1 = CreatImage(image1, w, h);
int x,y;
int a;
//依次對原圖像的每個像素進行處理
for(y=0; y<h; y++)
for(x=0; x<w; x++)
{
//取得原圖像灰度
a=GetAsh(imageBuf0,x,y);
//進行減法運算
a=a-GetAsh(imageBuf1,x,y);
//過限處理
a = a>255?255:a;
a = a<0?0:a;
SetPixelXY(imageBuf1,x,y,a);
}
//清理內存
free(imageBuf0);
free(imageBuf1);
}
/******************************************************************
* 功能: 對兩副圖像進行加法運算
* 參數: image0為原圖形,image1為要減去的圖像,
* w、h為圖象的寬和高
******************************************************************/
void AshAdd(BYTE* image0, BYTE* image1, unsigned int w, unsigned int h)
{
//將圖像轉化為矩陣形式
BYTE** imageBuf0 = CreatImage(image0, w, h);
BYTE** imageBuf1 = CreatImage(image1, w, h);
int x,y,c;
int a;
//依次對原圖像的每個像素進行處理
for(y=0; y<h; y++)
for(x=0; x<w; x++)
{
//取得原圖像灰度
a=GetAsh(imageBuf0,x,y);
//進行減法運算
a=a+GetAsh(imageBuf1,x,y);
//過限處理
a = a>255?255:a;
a = a<0?0:a;
SetPixelXY(imageBuf1,x,y,a);
}
//清理內存
free(imageBuf0);
free(imageBuf1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -