本篇文章给大家谈谈c语言简易图像编程处理,以及c语言编图像程序对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
1、用C语言进行简单图像判断2、纯C语言实现图像处理?3、用C语言编写程序处理图片bmp文件 1.读取图片的宽度,高度,每个像素所需的位数,水平分辨率,垂直
用C语言进行简单图像判断
先把你要判断的图像进行二元化处理
然后与你预先存储的形状信息进行匹配,过程比较复杂,大体上就是要注意边缘的匹配。
而在判断的时候,要以边缘数据占的权重最大,也就是说可以不太关心图形中心的情形。
具体说起来很麻烦有很多要说,说这些大致方法你能懂就好,不能理解的话还是去找些DEMO什么的看看吧 这个肯定有的
就是用匹配加权啊, 在预存的图样的各点数据加权值,在中间图形的关键边缘加权值大一些,其他地方小一些就行
纯C语言实现图像处理?
#include stdio.h
#include stdlib.h
#include conio.h
#define ONE 255
#define ZERO 0
/*
typedef struct tagBITMAPFILEHEADER { // bmfh
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER{ // bmih
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
*/
void main (int argc,char *argv[])
{
FILE *fi,*fo;//I/O file
char fin[80],fon[80];//I/O file name
unsigned char **ri,**ro;
unsigned char buff;
long w,h;
int t;
int i,j;
if(argc3)
{
printf(“orginfile name:”);
scanf(“%s”,fin);
printf(“resultfile name:”);
scanf(“%s”,fon);
}else{
sscanf(argv[1],”%s”,fin);
sscanf(argv[2],”%s”,fon);
}
if(argc==4)
sscanf(argv[4],”%d”,t);
else{
printf(“theshold [0,255]:”);
scanf(“%d”,t);
}
if (((fi=fopen(fin,”rb”))==NULL)||((fo=fopen(fon,”wb”))==NULL))
{
puts(“\nfile open failed”);
return;
}
fseek(fi,18L,SEEK_SET);
fread(w,sizeof(long),1,fi);
fread(h,sizeof(long),1,fi);
fseek(fi,0L,SEEK_SET);
ri=(unsigned char **)malloc(sizeof(unsigned *)*h);
for (i=0;ih;i++)
*(ri+i)=(unsigned char *)malloc(sizeof(unsigned)*w);
ro=(unsigned char **)malloc(sizeof(unsigned *)*h);
for (i=0;ih;i++)
*(ro+i)=(unsigned char *)malloc(sizeof(unsigned)*w);
//分配失败后果自负!
for (i=0;i32;i++){
fread(buff,sizeof(buff),1,fi);
fwrite(buff,sizeof(buff),1,fo);}
for (i=0;ih;i++)
for (j=0;jw;j++)
fread(*(ri+i)+j,sizeof(unsigned char),1,fi);
for (i=0;ih;i++)
for (j=0;jw;j++)
*(*(ro+i)+j)=((*(*(ri+i)+j)=t)?ZERO:ONE);
for (i=0;ih;i++)
for (j=0;jw;j++)
fwrite(*(ro+i)+j,sizeof(unsigned char),1,fo);
fclose(fo);
}
用C语言编写程序处理图片bmp文件 1.读取图片的宽度,高度,每个像素所需的位数,水平分辨率,垂直
#include windows.h
//读bmp图片需要两个结构
#pragma pack(push, enter_defBM, 1) //指定内存对齐单位为1。
typedef struct tagBmpFileHeader
{
WORD bfType; // 文件类型 BM
DWORD bfSize; // 文件大小
WORD bfReserved1; // 保留字
WORD bfReserved2; // 保留字
DWORD bfOffBits; // 位图的数据信息离文件头的偏移量
} BFH;
typedef struct tagBmpImgHeader
{
DWORD biSize; // 表示本结构的大小,0X28
LONG biWidth; // 位图的宽度
LONG biHeight; // 位图的高度
WORD biPlanes; // 位面数永远为1
WORD biBitCount; // 位图的位数
DWORD biCompression; // 压缩类型
DWORD biSizeImage; // 表示位图数据区域的大小
LONG biXPelsPerMeter; // 表示显示设备的水平分辨率
LONG biYPelsPerMeter; // 表示显示设备的垂直分辨率
DWORD biClrUsed; // 实际使用的颜色数目
DWORD biClrImportant; // 重要的颜色数量
} BIH;
#pragma pack(pop, enter_defBM) //恢复默认内存对齐单位。
#define HDIB HANDLE // 位图句柄
DWORD WINAPI DIBNumColors(BYTE * data)
{
WORD wBitCount;
DWORD dwClrUsed = ((BIH *)data)-biClrUsed;
if (dwClrUsed != 0) return (WORD)dwClrUsed;
wBitCount = ((BIH *)data)-biBitCount;
return 1 wBitCount;
}
WORD WINAPI PaletteSize(BYTE * data)
{
return (WORD)(::DIBNumColors(data) * sizeof(RGBQUAD));
}
BYTE * WINAPI FindDIBBits(BYTE * data)
{
return (data + *(DWORD *)data + ::PaletteSize(data));
}
// 获取Bmp的宽度
DWORD FAR DIBWidth(const BYTE * data)
{
BIH * pbmi;
pbmi = (BIH *)data;
if(pbmi-biSize == sizeof(BIH)) return pbmi-biWidth;
else return -1;
}
// 获取Bmp的高度
DWORD FAR DIBHeight(const BYTE * data)
{
BIH * pbmi;
pbmi = (BIH *)data;
if(pbmi-biSize == sizeof(BIH)) return pbmi-biHeight;
else return -1;
}
// 从文件读取Bmp图像数据
HDIB WINAPI ReadDIBFile(FILE * fp)
{
BFH bmf;
HDIB hDIB;
BYTE * pData;
rewind(fp);
if(fread(bmf, sizeof(BFH), 1, fp) != 1) return NULL; // 文件读取错误
if(bmf.bfType != 19778) return NULL; // 文件类型错误
hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, bmf.bfSize); // 为DIB分配内存
if (hDIB == 0) return NULL; // 内存分配失败。
pData = (BYTE *)::GlobalLock((HGLOBAL) hDIB); // 锁定
if(fread(pData, 1, bmf.bfSize – sizeof(BFH), fp) != (bmf.bfSize – sizeof(BFH))) // 文件读取错误
{
::GlobalUnlock((HGLOBAL) hDIB); // 解除锁定
::GlobalFree((HGLOBAL) hDIB); // 释放内存
return NULL;
}
::GlobalUnlock((HGLOBAL) hDIB); // 解除锁定
return hDIB; // 返回DIB句柄
}
BOOL WINAPI PaintDIB(HDC hDC, int posX, int posY, HDIB hDIB)
{
BYTE * pDIBHd; // BITMAPINFOHEADER指针
BYTE * pDIBBits; // DIB象素指针
BOOL bSuccess = FALSE; // 成功标志
HPALETTE hPal = NULL; // DIB调色板
//HPALETTE hOldPal = NULL; // 以前的调色板
if (hDIB == NULL) return FALSE; // 判断DIB对象是否为空
pDIBHd = (BYTE *) ::GlobalLock((HGLOBAL) hDIB); // 锁定DIB
pDIBBits = ::FindDIBBits(pDIBHd); // 找到DIB图像象素起始位置
::SetStretchBltMode(hDC, COLORONCOLOR); // 设置显示模式
// 调用SetDIBitsToDevice()来绘制DIB对象
bSuccess = ::SetDIBitsToDevice(hDC, // hDC
posX, posY,
((BIH *)pDIBHd)-biWidth, // nDestWidth
((BIH *)pDIBHd)-biHeight, // nDestHeight
0, // SrcX
0, // SrcY
0, // nStartScan
(WORD)DIBHeight(pDIBHd), // nNumScans
pDIBBits, // lpBits
(LPBITMAPINFO)pDIBHd, // lpBitsInfo
DIB_RGB_COLORS); // wUsage
::GlobalUnlock((HGLOBAL) hDIB); // 解除锁定
return bSuccess;
}
// 打印位图信息
VOID WINAPI PrintDIBInfo(HDIB hDIB)
{
BYTE * pDIBHd = (BYTE *)::GlobalLock((HGLOBAL) hDIB);
BIH * pbmi = (BIH *)pDIBHd;
const char *lp[] =
{
“位图信息长度: %d\n”,
“位图图像大小: %dx%d\n”,
“位面数:%d\n”,
“位图颜色深度: %d\n”,
“位图数据压缩类型: %d\n”,
“位图数据区域大小: %d\n”,
“位图分辨率: 水平 %d dpi, 垂直 %d dpi\n”,
};
printf(“Windows V3 cBitmapInfoHeader 信息\n\n”);
printf(lp[0], pbmi-biSize);
printf(lp[1], pbmi-biWidth, pbmi-biHeight);
printf(lp[2], pbmi-biPlanes);
printf(lp[3], pbmi-biBitCount);
printf(lp[4], pbmi-biCompression);
printf(lp[5], pbmi-biSizeImage);
printf(lp[6], (LONG)(pbmi-biXPelsPerMeter * 0.0254f + 0.5f), (LONG)(pbmi-biYPelsPerMeter * 0.0254f + 0.5f));
::GlobalUnlock((HGLOBAL) hDIB); // 解除锁定
}
int main(int argc, char* argv[])
{
HDIB x;
FILE * fp = fopen(“1.bmp”, “rb”);
if(fp==NULL) return -1;
x = ReadDIBFile(fp);
printf(“DIB handle %u”, x);
PaintDIB(GetDC(NULL), 0, 0, x);
PrintDIBInfo(x);
return 0;
}
c语言简易图像编程处理的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言编图像程序、c语言简易图像编程处理的信息别忘了在本站进行查找喔。