有大神幫忙解決一下嗎,很急!!!!
C語言處理BMP影像灰度化+二值化,但是有的圖片會出問題,求大神幫忙改一下函式里面的代碼。。
代碼如下:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
int Gray(FILE* fp1,FILE* fp2);
int threshold(FILE* fp2,FILE* fp3);
#pragma pack(1)
typedef struct tagBITMAPFILEHEADER
{
unsigned short bfType;//檔案格式
unsigned long bfSize;//檔案大小
unsigned short bfReserved1;//保留
unsigned short bfReserved2;
unsigned long bfOffBits; //DIB資料在檔案中的偏移量
}fileHeader;
#pragma pack()
/*
位圖資料資訊結構
*/
#pragma pack(1)
typedef struct tagBITMAPINFOHEADER
{
unsigned long biSize;//該結構的大小
long biWidth;//檔案寬度
long biHeight;//檔案高度
unsigned short biPlanes;//平面數
unsigned short biBitCount;//顏色位數
unsigned long biCompression;//壓縮型別
unsigned long biSizeImage;//DIB資料區大小
long biXPixPerMeter;
long biYPixPerMeter;
unsigned long biClrUsed;//多少顏色索引表
unsigned long biClrImporant;//多少重要顏色
}fileInfo;
#pragma pack()
/*
調色板結構
*/
#pragma pack(1)
typedef struct tagRGBQUAD
{
unsigned char rgbBlue; //藍色分量亮度
unsigned char rgbGreen;//綠色分量亮度
unsigned char rgbRed;//紅色分量亮度
unsigned char rgbReserved;
}rgbq;
#pragma pack()
//其他資料
typedef struct OtherData
{
unsigned char extradata;
struct OtherData *next;
}OtherData;
//灰度函式
int Gray(FILE* fp1,FILE* fp2)
{
fileHeader * fh;
fileInfo * fi;
int i,j,k=0;
//存盤bmp一行的像素點
unsigned char ImgData[3000][3];
//將灰度影像存到一維陣列中
unsigned char ImgData2[3000];
rgbq *fq;
fh = (fileHeader *)malloc(sizeof(fileHeader));
fi = (fileInfo *)malloc(sizeof(fileInfo));
//讀取位圖頭結構和資訊頭
fread(fh, sizeof(fileHeader), 1, fp1);
fread(fi, sizeof(fileInfo), 1, fp1);
//修改資訊頭
fi->biBitCount = 8;
fi->biSizeImage = ((fi->biWidth * 3 + 3) / 4) * 4 * fi->biHeight;
fi->biSizeImage = fi->biHeight*fi->biWidth;
//修改檔案頭
fh->bfOffBits = sizeof(fileHeader) + sizeof(fileInfo) + 256 * sizeof(rgbq);
fh->bfSize = fh->bfOffBits + fi->biSizeImage;
fh->bfSize=fi->biSize;
//創建調色板
fq = (rgbq *)malloc(256 * sizeof(rgbq));
for (i = 0; i<256; i++)
{
fq[i].rgbBlue = fq[i].rgbGreen = fq[i].rgbRed = i;
}
//寫入檔案頭、資訊頭、調色板
fwrite(fh, sizeof(fileHeader), 1, fp2);
fwrite(fi, sizeof(fileInfo), 1, fp2);
fwrite(fq, sizeof(rgbq), 256, fp2);
//灰度化
for (i = 0; i<(fi->biHeight); i++)
{
for (j = 0; j<(fi->biWidth + 3) / 4 * 4; j++)
{
for (k = 0; k<3; k++)
fread(&ImgData[j][k], 1, 1, fp1);
}
for (j = 0; j<(fi->biWidth + 3) / 4 * 4; j++)
{
ImgData2[j] = /*int*/(float)ImgData[j][0] * 0.114 + (float)ImgData[j][1] * 0.587 +(float)ImgData[j][2] * 0.299;
}
//將灰度圖資訊寫入
fwrite(ImgData2, j, 1, fp2);
}
free(fh);
free(fi);
free(fq);
fclose(fp1);
fclose(fp2);
return 1;
}
//二值化函式
int threshold(FILE* fp2,FILE* fp3)
{
int i,j;
unsigned char ImgData[1000];
fileHeader * fh;
fileInfo * fi;
rgbq * fq;
if(fp2==NULL)
{
printf("打開檔案失敗");
exit(0);
}
if(fp3==NULL)
{
printf("創建檔案失敗");
exit(0);
}
//讀取灰度圖資料
fh=(fileHeader *)malloc(sizeof(fileHeader));
fi=(fileInfo *)malloc(sizeof(fileInfo));
fq=(rgbq *)malloc(256*sizeof(rgbq));
fread(fh,sizeof(fileHeader),1,fp2);
fread(fi,sizeof(fileInfo),1,fp2);
fread(fq,sizeof(rgbq),256,fp2);
//將頭資訊寫入
fwrite(fh,sizeof(fileHeader),1,fp3);
fwrite(fi,sizeof(fileInfo),1,fp3);
fwrite(fq,sizeof(rgbq),256,fp3);
//灰度值低于閾值則置0
for(i=0;i<(fi->biHeight);i++)
{
for(j=0;(j<(fi->biWidth+3)/4*4);j++)
{
fread(&ImgData[j],1,1,fp2);
if(ImgData[j]>45)
ImgData[j]=255;
else
ImgData[j]=0;
}
fwrite(ImgData,1,j,fp3);
}
free(fh);
free(fi);
free(fq);
fclose(fp3);
fclose(fp2);
printf("success\n");
return 0;
}
void main (int argc,char *argv[])
{
FILE *fi,*fo,*fc;//I/O file
char fin[80],fon[80],f[80];//I/O file name
char a;
if(argc<3)
{
printf(" dorginfile name:");
scanf("%s",fin);
printf(" resultfile name:");
scanf("%s",fon);
}else{
scanf(argv[1],"%s",fin);
scanf(argv[2],"%s",fon);
}
if (((fi=fopen(fin,"rb"))==NULL)||((fo=fopen(fon,"wb"))==NULL))
{
puts("\nfile open failed");
return;
}
Gray(fi,fo);
system(fon);
printf(" thresholdresult name:");
scanf("%s",f);
if (((fo=fopen(fin,"rb"))==NULL)||((fc=fopen(f,"wb"))==NULL))
{
puts("\nfile open failed");
return;
}
threshold(fo,fc);
system(f);
}
uj5u.com熱心網友回復:
還是用OpenCV吧。uj5u.com熱心網友回復:
不許用,這個我已經解決了
uj5u.com熱心網友回復:
你怎么解決的呀,可以分享一下嗎?uj5u.com熱心網友回復:
具體我也不記得了。,一年多了。尷尬
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/17596.html
標籤:C語言
上一篇:【疑惑】關于指標取址遇到的一絲絲小問題(嵌入式、C語言)
下一篇:單點定位
