這個源代碼怎么改 我用VC調不對
#define ff(x,y) pBmpBuf0[256*(y)+(x)]
#define gg(x,y) pBmpBuf9[256*(y)+(x)]
#include <windows.h>
#include <stdio.h>
#include <fstream.h>
#include <math.h>
unsigned char *pBmpBuf;//讀入影像資料的指標
int bmpWidth;//影像的寬
int bmpHeight;//影像的高
RGBQUAD *pColorTable;//顏色表指標
int biBitCount;//影像型別,每像素位
//讀影像的位圖資料,寬,高,顏色表及每像素位等資料進記憶體,存放在相應的全域變數中
bool readBmp(char*bmpName)
{
FILE*fp=fopen(bmpName,"rb");//二進制讀方式打開指定的影像檔案
if(fp==0)
return 0;
//跳過影像檔案頭結構BITMAPFILEHEADER
fseek(fp,sizeof(BITMAPFILEHEADER),0);
//定義位圖資訊頭結構變數,讀取位圖資訊頭進記憶體,存放在變數head中
BITMAPFILEHEADER head;
fread(&head,sizeof(BITMAPFILEHEADER),1,fp);//獲取影像寬,高,每像素所占位數等資訊
bmpWidth=head.biWidth;
bmpHeight=head.biHeight;
biBitCount=head.biBitCount;
//定義變數,計算影像每行像素所占的位元組數(必須是4的倍數)
int lineByte=(bmpWidth*biBitCount/8+3)/4*4;//灰度影像有顏色表,且顏色表項為256
if(biBitCount==8)
{
//申請顏色表所需要的空間,讀顏色表進記憶體
pColorTable=new RGBQUAD[256];
fread(pColorTable,sizeof(RGBQUAD),256,fp);
}
//申請位圖資料所需要的空間,讀位圖資料記憶體
pBmpBuf=new unsigned char[lineByte*bmpHeight];
fread(pBmpBuf,1,lineByte*bmpHeight,fp);
fclose(fp);//關閉檔案
return 1;//讀取檔案成功
}
//給定一個影像位圖資料,寬,高,顏色表指標以及每像素所占的位數等資訊,將其寫到指定檔案中
bool saveBmp (char*bmpName,unsigned char *imgBuf,int width,int height,int biBitCount,RGBQUAD*pColorTable)
{
//如果位圖資料指標為0,則沒有資料傳入,函式回傳
if(!imgBuf)
return 0;
//顏色表大小,以位元組為單位,灰度圖顏色表為1024位元組
int colorTablesize=0;
if(biBitCount==8)
colorTablesize=1024;
//待存盤影像資料每行位元組數為4的倍數
int lineByte=(width*biBitCount/8+3)/4*4;
//以二進制寫的方式打開檔案
FILE*fp=fopen(bmpName,"wb");
if(fp==0) return 0;
//申請位圖檔案頭結構變數,填寫檔案頭資訊
BITMAPFILEHEADER fileHead;
fileHead.bfType=0x4D42;//bmp型別
//bfsize是影像檔案4個組成部分之和
fileHead.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTablesize+lineByte*height;
fileHead.bfReservedl=0;
fileHead.bfReserved2=0;
//bfOffBits是影像檔案前3個部分所需空間之和
fileHead.bfOffBits=54+colorTablesize;
//寫檔案頭進檔案
fwrite(&fileHead,sizeof(BITMAPFILEHEADER),1,fp);
//申請位圖資訊頭結構變數,填寫資訊頭資訊
BITMAPINFOHEADER head;
head.biBitCount=biBitCount;
head.biClrImportant=0;
head.biClrUsed=0;
head.biCompression=0;
head.biHeight=height;
head.biPlanes=1;
head.biSize=40;
head.biSizeImage=lineByte*height;
head.biWidth=width;
head.biXPelsPerMeter=0;
head.biYPelsPerMeter=0;
//寫位圖資訊頭進記憶體
fwrite(&head,sizeof(BITMAPINFOHEADER),1,fp);
//如有灰度影像,有顏色表,寫入檔案
fwrite(pColorTable,sizeof(RGBQUAD),256,fp);
//寫進位圖資料進檔案
fwrite(imgBuf,height*lineByte,1,fp);
//關閉檔案
fclose(fp);
return 1;
}
//各邊緣檢測算子演算法實作
// 函式宣告
void roberts(unsigned char *pBmpBufroberts);
void sobel(unsigned char *pBmpBufsobel);
void robinson(unsigned char *pBmpBufrobinson);
void prewitt(unsigned char *pBmpBufprewitt);
void main()
{
//讀入指定BMP檔案進記憶體
char readPath[]="c:/text.BMP";
readBmp(readPath);
//輸出影像資訊
printf("width=%d,height=%d,biBitCount=%d\n",bmpWidth,bmpHeight,biBitCount);
//函式呼叫
roberts(pBmpBuf);
sobel(pBmpBuf);
robinson(pBmpBuf);
prewitt(pBmpBuf);
//清楚緩沖區,pBmpBuf和pcolorTable是全域變數在檔案讀入時申請的空間
delete []pBmpBuf;
delete []pColorTable;
}
//各函式定義
//roberts算子
void roberts(unsigned char *pBmpBufroberts)
{
unsigned char *pBmpBuf0;
unsigned char *pBmpBuf9[256*256];
int ix,iy,vx,vy,lx=256;
pBmpBuf0=pBmpBufroberts;
//模板1
for(ix=1;ix<255;ix++)
{
for(iy=1;iy<255;iy++)
{
vx=ff(ix+1,iy)-ff(ix,iy);
vy=ff(ix,iy+1)-ff(ix,iy);
gg(ix,iy)=abs(vx)+abs(vy);
}
}
//將資料影像存盤
char writePath[]="textroberts1.BMP";
saveBmp(writePath,pBmpBuf9,bmpWidth,bmpHeight,biBitCount,pColorTable);
//模板2
for(ix=1;ix<255;ix++)
for(iy=1;iy<255;iy++)
{
vx=ff(ix,iy)-ff(ix+1,iy+1);
vy=ff(ix+1,iy)-ff(ix,iy+1);
gg(ix,iy)=abs(vx)+abs(vy);
}
//將影像資料存盤
char writePath2[]="textroberts2.BMP";
saveBmp(writePath2,pBmpBuf9,bmpWidth,bmpHeight,biBitCount,pColorTable);
}
//robinson
void robinson(unsigned char *pBmpBufrobin)
{
unsigned char *pBmpBuf0;
pBmpBuf0=pBmpBufrobin;
unsigned char pBmpBuf9[256*256];
int ix,iy,mx,my,jx,jy,jpv,mxav,im;
static int mask [8][3][3]=
{1,2,1,0,0,0,-1,-2,-1,
0,1,2,-1,0,1,-2,-1,0,
-1,0,1,-2,0,2,-1,0,1,
-2,-1,0,-1,0,1,0,-1,2,
-1,-2,-1,0,0,0,1,2,1,
0,-1,-2,1,0,-1,2,1,0,
1,0,-1,2,0,2,1,0,-1,
2,1,01,0,-1,0,-1,-2,
};
for(ix=1;ix<255;ix++)
for(iy=1;iy<255;iy++)
{
for(im=0;im<=7;im++)
{
jpv=0;
mxav=0;
for(mx=0;mx<=2;mx++)
{
jx=ix-1+mx;
for(my=0;my<=2;my++)
{
jy=iy-1+my;
jpv=jpv+ff(jx,jy)*mask[im][mx][my];
}
}
if((jpv>mxav)||(im==0))mxav=jpv;
}
gg(ix,iy)=mxav;
}
char writePath[]="textrobinson.BMP";
saveBmp(writePath,pBmpBuf9,bmpWidth,bmpHeight,biBitCount,pColorTable);
}
//prewitt
void prewitt(unsigned char *pBmpBufprewitt)
{
unsigned char *pBmpBuf0;
pBmpBuf0=pBmpBufprewitt;
unsigned char *pBmpBuf9[256*256];
int ix,iy,im,mx,my;
int jx,jy,jpv,mxav;
static int mask[8][3][3]=
{ 1,1,1,1,-2,1,-1,-1,-1,
1,1,1,-1,-2,1,-1,-1,1,
-1,1,1,-1,-2,1,-1,1,1,
-1,-1,-1,-1,-2,1,1,1,1,
1,-1,-1,1,-2,,1,1,1,1,
1,1,1,1,-2,1,-1,-1,-1,
1,1,-1,1,-2,-1,1,1,-1,
1,1,1,1,-2,-1,1,-1,-1,
};
for(ix=1;ix<255;ix++)
for(iy=1;iy<255;iy++)
{
for(im=0;im<=7;im++)
{
jpv=0;
mxav=0;
for(mx=0;mx<=2;mx++)
{
jx=ix-1+mx;
for(my=0;my<=2;my++)
{
jy=iy-1+my;
jpv=jpv+ff(jx,jy)*mask[im][mx][my];
}
}
if((jpv>mxav)||(im==0))mxav=jpv;
}
gg(ix,iy)=mxav;
}
//將資料影像存盤
char writePath[]="textprewitt.BMP";
saveBmp(writePath,pBmpBuf9,bmpWidth,bmpHeight,biBitCount,pColorTable)
};
//sobel
void sobel(unsigned char *pBmpBufsobel)
{
unsigned char *pBmpBuf0;
unsigned char *pBmpBuf9[256*256];
int ix,iy,vx,vy,lx=256;
pBmpBuf0=pBmpBufsobel;
for(ix=1;ix<255;ix++)
{
for(iy=1;iy<255;iy++)
{
vx=(ff(ix-1,iy-1)+2*ff(ix-1,iy)+ff(ix-1,iy+1))-(ff(ix+1,iy-1)+2*ff(ix+1,iy)+ff(ix=1,iy+1));
vy=(ff(ix-1,iy-1)+2*ff(ix,iy-1)+ff(ix+1,iy-1))-(ff(ix-1,iy+1)+2*ff(ix,iy+1)+ff(ix+1,iy+1));
gg(ix,iy)=abs(vx)+abs(vy);
}
}
//將資料影像存盤
char writePath[]="textsobel.BMP";
saveBmp(writePath,pBmpBuf9,bmpWidth,bmpHeight,biBitCount,pColorTable);
}
uj5u.com熱心網友回復:
目測你得寫個主函式呼叫一下,或者放到mfc里面完善你工程的業務邏輯就行,演算法好像沒啥問題轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/147883.html
標籤:圖形處理/算法
上一篇:雙邊濾波和聯合雙邊濾波的區別
下一篇:有沒有這樣一個濾波器
