当前位置:首页 » 编程语言 » c语言图像处理算法
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言图像处理算法

发布时间: 2023-08-14 15:44:46

c语言图像处理

c语言不自带图形处理方面的东西。TC特有的头文件graphics.h,其他编译环境都用不了,可移植性是零。而且TC实在太老,与现在c语言标准差距非常大。基本是无法运行现在的代码。所以不太建议你用它。

非要用纯c,可以自己写函数调用WindowsAP和GUI接口。而且需要包含windows.h头文件。

网上有个大神用c—free写的代码在附件里。

/*
纯C通过WindowsAPI编写的基本Windows图形界面
整理加原创,基本上每一句代码都有注释
通过C-Free3.5编译
*/

#include<string.h>//这个头文件在扩展名为.c时是不需要加的
#include<windows.h>//windowsapi必须包含的头文件

LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);//窗口函数的前向声明

//参数说明:
//HINSTANCEhInstance当前实例句柄
//HINSTANCEhPrevInstance以前版本的遗留产物,现在总是置为NULL
//LPSTRlpCmdLine命令行的产生,可以从开始->获得程序运行的参数,由此传入
//intnCmdShow程序最初的显示模式,正常,最大化或最小化

//主函数的入口是WinMain,类型为int
//WINAPI标志是一种特定的调用,它定义了一种生成机器代码和放置函数参数的方式

intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpcmdLine,intnCmdShow)
{
//TCHAR,TEXT都是统一单字节和双字节字符的类型,建议使用
staticTCHARszAppName[]=TEXT("MyFirstWindows");
staticTCHARszClassName[]=TEXT("MFWClass");
HWNDhwnd;//一定一个窗口句柄
MSGmsg;//定义一个消息结构体
WNDCLASSwndclass;//定义一个WNDCLASS结构用于注册窗口

wndclass.style=CS_HREDRAW|CS_VREDRAW;//窗口类的类风格,每当水平和垂直大小改变时完全刷新窗口
wndclass.lpfnWndProc=WndProc;//此窗口类所使用的窗口函数的入口地址
wndclass.cbClsExtra=0;//用于在类结构中预留一些额外的空间
wndclass.cbWndExtra=0;//用于在windows内部保存的窗口结构中预留一些额外的空间
wndclass.hInstance=hInstance;//指定所在程序的实例句柄
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//定制图标
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//定制鼠标图形
wndclass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);//定义背景颜色
wndclass.lpszMenuName=NULL;//指定窗口类的菜单
wndclass.lpszClassName=szClassName;//指定窗口类的类名


//注册窗口,参数为指向WNDCLASS结构的指针
//如果注册不成功,则弹出一个对话框说明情况
//MessageBox是仅有的可以在旧版本和新版本windows都可以运行的对话框

if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("!"),szAppName,MB_ICONERROR);
return0;
}

//创建窗口
hwnd=CreateWindow(
szClassName,//窗口类的名称
TEXT("Title:MyFirstWindowsProgram.这里是标题"),//窗口标题
//WS_OVERLAPPEDWINDOW,//窗口显示风格,这行实际是一个预定义,相当于下面的集合,可以单独设置
WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX,
CW_USEDEFAULT,//初始x方向的位置
CW_USEDEFAULT,//初始y方向的位置
CW_USEDEFAULT,//初始x方向的大小
CW_USEDEFAULT,//初始y方向的大小
NULL,//父窗口句柄
NULL,//菜单句柄
hInstance,//程序实例句柄
NULL);//创建参数


//显示窗口,第一个参数hwnd是CreateWindow所创建的窗口的句柄
//第二个参数nCmdShow是主函数给的,由快捷方式获得
ShowWindow(hwnd,nCmdShow);

//刷新窗口,给窗口函数,在本程序中即WndProc发送一个WM_PAINT
UpdateWindow(hwnd);

//消息循环
while(GetMessage(&msg,NULL,0,0))//接受自己创建的所有窗口的所有消息
{
TranslateMessage(&msg);//将msg结构体传给windows以进行一些键盘转换,即将击键消息转换为字符消息
DispatchMessage(&msg);//再次将msg结构体传给windows,由windows将该消息发送给适当的窗口函数
}

return(int)msg.wParam;
}

//窗口函数
//参数说明:
//HWNDhwnd,接受消息的窗口句柄,由CreateWindow函数返回
//UINTmessage,消息标志符,用以标识消息,每个消息均有一个唯一对应的消息标识符
//WPARAMwParam,是WORDPARAM的意思,一个32位的消息参数,其含义和数值根据消息的不同而不同
//LPARAMlParam,是LONGPARAM的意思,一个32位的消息参数,其值和消息有关

//CALLBACK函数指由程序员定义,编程实现,而由windows系统调用的函数
LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)
{
HDChdc;//定义一个设备描述表句柄结构体

//定义一个PAINTSTRUCT的绘制信息结构体,
//其包含了包含了当前无效矩形区域的坐标和其他信息,用于刷新用户区的内容
PAINTSTRUCTps;

RECTrect;//定义一个RECT结构体,其有left,top,right,bottom四个域

//处理传进的各种消息
switch(message)
{
//窗口创建
caseWM_CREATE:MessageBox(NULL,"MessageContent:ThisisWM_CREATE,这是WM_CREATE。",
"MessageTiTle这是对话框的标题",MB_OK);
return0;

//窗口绘制
caseWM_PAINT:hdc=BeginPaint(hwnd,&ps);//由BeginPaint开始,返回设备描述表以开始绘图
GetClientRect(hwnd,&rect);//获取用户区域的大小

//格式话文本输出
DrawText(hdc,TEXT("WindowsContent:Iamadeveloper.我为计算机而生。"),
-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
EndPaint(hwnd,&ps);//以EndPaint结束,释放设备描述表句柄
return0;
//窗口消亡
caseWM_DESTROY:MessageBox(NULL,"MessageContent:ThisisWM_DESTROY,这是WM_DESTROY。",
"MessageTiTle这是对话框的标题",MB_OK);
PostQuitMessage(0);
return0;
}

//凡是窗口函数不予处理的消息应交由windows默认消息处理函数DefWindowProc处理
returnDefWindowProc(hwnd,message,wParam,lParam);
}

⑵ c语言调用图片函数

c语言调用图片函数
据我所知Matlab有,imshow(),c好象没有,c只能先将图片读到内存中,经过相关处理后以一定的格式保存到硬盘中,然后再打开图片.
读图和存图需要有专门的函数,这些可以参考:
unsigned
char*
ReadBMPData(int
Width,
int
Height,
char
*fname)//图像的宽和高,图像的位置(包括后缀)
{
unsigned
char*
image
=
new
unsigned
char[Width*Height];
FILE
*fp;
fp
=
fopen(fname,
"rb");
fread(image,
1,
Width*Height,
fp);
fclose(fp);
return
image;
}
///////////////////////////
void
WriteRawData(unsigned
char*
image,
int
Width,
int
Height,
char
*fname)
{
FILE
*fp;
fp
=
fopen(fname,
"wb");
fwrite(image,
1,
Width*Height,
fp);
fclose(fp);
}

⑶ 怎样用C语言得到jpeg格式或BMP格式的图像的像素的rgb值

原型:
int WINAPI icePub_getImgfilePColor(char *strImgFilename,int x,int y,char *strR,char *strG,char *strB,int flag)
输入:strImgFilename 待处理的图片文件名
x x坐标
y y坐标
flag 输出RGB值的格式,0 10进制,1 16进制
输出:strR R值
strG G值
strB B值
返回码:0 OK;-2 x,y值超出图片长宽

int retCode=-1;
char strR[128],strG[128],strB[128];
Cstring m_mem;

typedef int (WINAPI ICEPUB_GETIMGFILEPCOLOR)(char *strImgFilename,int x,int y,char *strR,char *strG,char *strB,int flag);
ICEPUB_GETIMGFILEPCOLOR *icePub_getImgfilePColor = 0;
HINSTANCE hDLLDrv = LoadLibrary("icePubDll.dll");
if(hDLLDrv)
icePub_getImgfilePColor = (ICEPUB_GETIMGFILEPCOLOR *)GetProcAddress(hDLLDrv, "icePub_getImgfilePColor");
if(icePub_getImgfilePColor)
retCode=icePub_getImgfilePColor("a.jpg",100,55,strR,strG,strB,0);
if(hDLLDrv)
FreeLibrary(hDLLDrv);
if(retCode == 0)
m_mem.Format("(x,y):%d,%d\r\nR:%s\r\nG:%s\r\nB:%s",point.x,point.y,strR,strG,strB);
AfxMessageBox(m_mem);

原型:
int WINAPI icePub_imgToFileTextdata(char *strImgFilename,char *strFilename,char *strFenge,int flag)
输入:strImgFilename 待处理图像文件 (会被强制256级灰度化)
strFilename 待生成BMP文本数据文件名
strFenge 列之间分隔符
flag 文本数据格式标志:0 10进制; 1 16进制; 10 RGB16进制
输出:

extern "C"
{
__declspec(dllexport)
int WINAPI icePub_imgToFileTextdata(char *strImgFilename,char *strFilename,char *strFenge,int flag);
}

#pragma comment(lib,"icePubDll.lib")

icePub_imgToFileTextdata("a.jpg","bmpdata.txt",",",0);

原型:
char * WINAPI icePub_getBufferFromImg2(char *strImgFilename,int *width,int *height,int huiGrade)
输入:strImgFilename 图片文件名
huiGrade 图像灰度化标志,0 no; >1 and <=256 灰度级
输出:width 图像宽度
height 图像高度
返回值:图像的点阵数据(按照24位BMP格式)

extern "C"
{
__declspec(dllexport)
char * WINAPI icePub_getBufferFromImg2(char *strImgFilename,int *width,int *height,int huiGrade);
}

#pragma comment(lib,"icePubDll.lib")

char *bmpBuffer=NULL;
int imgWidth, imgHeight;

bmpBuffer = icePub_getBufferFromImg2 ("e:\\a.jpg",&imgWidth,&imgHeight,0);
//然后对bmpBuffer数据处理即可

if(bmpBuffer != NULL)
free(bmpBuffer);

⑷ c语言数字图像处理怎么显示一张照片的像素值

#include <stdio.h>
#include <windows.h>
int main()
{
//变量
char title[255];//用于存放控制台窗口标题
HWND hwnd;//窗口的句柄,H:Handle
HDC hdc, hmemdc;//设备上下文句柄,DC:driver context
HBITMAP hbm;//图片的句柄
BITMAP bm;//图片结构体
RECT rect;//矩形 rectangle
//把控制台窗口调成100字符宽度,40行
system("mode con cols=100 lines=40");

//1.取得窗口的句柄
GetConsoleTitleA(title, 255);//获取控制台窗口的标题
hwnd = FindWindowA(NULL, title);//通过窗口标题取得该窗口的句柄
//获取窗口的高度和宽度
GetWindowRect(hwnd, &rect);
//2. 获取画笔
hdc = GetDC(hwnd);
/* if(!hdc)
printf("No val\n");
else
printf("have\n");
TextOutA(hdc, 300, 400, "Hello world", strlen("Hello world"));*/
hmemdc = CreateCompatibleDC(hdc);//创建一个兼容的DC
//3.加载图片
hbm = (HBITMAP)LoadImageA(NULL, "123.bmp", IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE);
GetObject(hbm, sizeof(BITMAP), &bm);//得到图片信息
//4.把图片放入兼容DC中
SelectObject(hmemdc, hbm);

//5.在窗口上画出图片
BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hmemdc, 0, 0, SRCCOPY);

DeleteObject(hbm);
DeleteObject(hmemdc);
ReleaseDC(hwnd, hdc);
return 0;
}

⑸ 纯C语言实现图像处理

这个不难吧?虽然我不用c,可是说下怎么做,首先打开一个BMP文件,然后按照bmp格式解析到一个数组中,接着进行二值化(这个有很多方法),最后将数组中的数据写入一个新的BMP文件就可以了。

⑹ 如何用C语言实现对图像的二值化

/*************************************************************************
* 该函数用于对图像进行阈值分割运算
* 参数:
* LPSTR lpDIBBits - 指向源DIB图像指针
* LONG lWidth - 源图像宽度(象素数)
* LONG lHeight - 源图像高度(象素数)
************************************************************************/

BOOL ImageChangeProc::ThresholdDIB(LPSTR lpDIBBits,LONG lWidth, LONG lHeight)
{

// 指向源图像的指针
LPSTR lpSrc;

// 指向缓存图像的指针
LPSTR lpDst;

// 指向缓存DIB图像的指针
LPSTR lpNewDIBBits;
HLOCAL hNewDIBBits;

//循环变量
long i;
long j;

unsigned char pixel;
long lHistogram[256];

//阈值,最大灰度值与最小灰度值,两个区域的平均灰度值
unsigned char Threshold,NewThreshold,MaxGrayValue,MinGrayValue,Temp1GrayValue,Temp2GrayValue;

//用于计算区域灰度平均值的中间变量
long lP1,lP2,lS1,lS2;

//迭代次数
int IterationTimes;

LONG lLineBytes;
hNewDIBBits = LocalAlloc(LHND, lWidth * lHeight);

if (hNewDIBBits == NULL)
{
// 分配内存失败
return FALSE;
}

// 锁定内存
lpNewDIBBits = (char * )LocalLock(hNewDIBBits);

// 初始化新分配的内存
lpDst = (char *)lpNewDIBBits;
memset(lpDst, (BYTE)255, lWidth * lHeight);

lLineBytes = WIDTHBYTES(lWidth * 8);

for (i = 0; i < 256;i++)
{
lHistogram[i]=0;
}

//获得直方图
MaxGrayValue = 0;
MinGrayValue = 255;
for (i = 0;i < lWidth ;i++)
{
for(j = 0;j < lHeight ;j++)
{
lpSrc = (char *)lpDIBBits + lLineBytes * j + i;

pixel = (unsigned char)*lpSrc;

lHistogram[pixel]++;
//修改最大,最小灰度值
if(MinGrayValue > pixel)
{
MinGrayValue = pixel;
}
if(MaxGrayValue < pixel)
{
MaxGrayValue = pixel;
}
}
}

//迭代求最佳阈值
NewThreshold = (MinGrayValue + MaxGrayValue)/2;
Threshold = 0;

for(IterationTimes = 0; Threshold != NewThreshold && IterationTimes < 1000;IterationTimes ++)
{
Threshold = NewThreshold;
lP1 =0;
lP2 =0;
lS1 = 0;
lS2 = 0;
//求两个区域的灰度平均值
for (i = MinGrayValue;i <=Threshold;i++)
{
lP1 += lHistogram[i]*i;
lS1 += lHistogram[i];
}

for (i = Threshold+1;i<MaxGrayValue;i++)
{
lP2 += lHistogram[i]*i;
lS2 += lHistogram[i];
}
if(lS1==0||lS2==0)
{
// 释放内存
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);
return FALSE;
}
Temp1GrayValue = (unsigned char)(lP1 / lS1);
Temp2GrayValue = (unsigned char)(lP2 / lS2);
NewThreshold = (Temp1GrayValue + Temp2GrayValue)/2;
}

//根据阈值将图像二值化
for (i = 0;i < lWidth ;i++)
{
for(j = 0;j < lHeight ;j++)
{
lpSrc = (char *)lpDIBBits + lLineBytes * j + i;
lpDst = (char *)lpNewDIBBits + lLineBytes * j + i;
pixel = (unsigned char)*lpSrc;

if(pixel <= Threshold)
{
*lpDst = (unsigned char)0;
}
else
{
*lpDst = (unsigned char)255;
}
}
}

// 复制图像
memcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight);

// 释放内存
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);

// 返回
return TRUE;
}

参考:http://topic.csdn.net/t/20030909/13/2240079.html

⑺ C语言怎么处理图片

想操作的,主要是操作像素点。根据矩阵位置可以做局部数据的调整

⑻ c语言如何实现图像对比

C函数库:

以前版本的C(TC时代)有graphics库可以用,
现在这个库不是通用的了(VC++不包含graphics.h),但是可以加搜差上easyX(就链嫌是个常用非官方库,实现了graphics.h的功能并有不少改进).

给你个思路.

直观的方法:
1.用loadimage将两张图片加载
2.用putimage输出第一张
3.用putimage输出第二张, 但是第四个参数选择XOR_PUT(图像和原世唤皮有像素作异或运算)
相同颜色的点将被抹除而只留下不同部分(但是颜色不能保证正确).
此方法可以快速直观得到不同处(找茬外挂专用)

准确的方法:
1.load两张图片
2.用getpixel逐个对比两张图片

稍稍优化的方法:
1.先用直观方法获得大致不同的区域

2.用GetMouseMsg()获得鼠标相关信息
3.鼠标框选差异区域
4.对应两个图片用getpixel仅处理差异区域.

要是用winapi之类的,那方法就更多了.

⑼ 用C语言编写程序处理图片bmp文件 1.读取图片的宽度,高度,每个像素所需的位数,水平分辨率,垂直

#include<windows.h>
//读bmp图片需要两个结构
#pragmapack(push,enter_defBM,1)//指定内存对齐单位为1。
typedefstructtagBmpFileHeader
{
WORDbfType;//文件类型BM
DWORDbfSize;//文件大小
WORDbfReserved1;//保留字
WORDbfReserved2;//保留字
DWORDbfOffBits;//位图的数据信息离文件头的偏移量
}BFH;
typedefstructtagBmpImgHeader
{
DWORDbiSize;//表示本结构的大小,0X28
LONGbiWidth;//位图的宽度
LONGbiHeight;//位图的高度
WORDbiPlanes;//位面数永远为1
WORDbiBitCount;//位图的位数
DWORDbiCompression;//压缩类型
DWORDbiSizeImage;//表示位图数据区域的大小
LONGbiXPelsPerMeter;//表示显示设备的水平分辨率
LONGbiYPelsPerMeter;//表示显示设备的垂直分辨率
DWORDbiClrUsed;//实际使用的颜色数目
DWORDbiClrImportant;//重要的颜色数量
}BIH;
#pragmapack(pop,enter_defBM)//恢复默认内存对齐单位。

#defineHDIBHANDLE//位图句柄


DWORDWINAPIDIBNumColors(BYTE*data)
{
WORDwBitCount;
DWORDdwClrUsed=((BIH*)data)->biClrUsed;
if(dwClrUsed!=0)return(WORD)dwClrUsed;
wBitCount=((BIH*)data)->biBitCount;
return1<<wBitCount;
}


WORDWINAPIPaletteSize(BYTE*data)
{
return(WORD)(::DIBNumColors(data)*sizeof(RGBQUAD));
}
BYTE*WINAPIFindDIBBits(BYTE*data)
{
return(data+*(DWORD*)data+::PaletteSize(data));
}

//获取Bmp的宽度
DWORDFARDIBWidth(constBYTE*data)
{
BIH*pbmi;
pbmi=(BIH*)data;
if(pbmi->biSize==sizeof(BIH))returnpbmi->biWidth;
elsereturn-1;
}
//获取Bmp的高度
DWORDFARDIBHeight(constBYTE*data)
{
BIH*pbmi;
pbmi=(BIH*)data;
if(pbmi->biSize==sizeof(BIH))returnpbmi->biHeight;
elsereturn-1;
}
//从文件读取Bmp图像数据
HDIBWINAPIReadDIBFile(FILE*fp)
{
BFHbmf;
HDIBhDIB;
BYTE*pData;

rewind(fp);
if(fread(&bmf,sizeof(BFH),1,fp)!=1)returnNULL;//文件读取错误
if(bmf.bfType!=19778)returnNULL;//文件类型错误
hDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,bmf.bfSize);//为DIB分配内存
if(hDIB==0)returnNULL;//内存分配失败。
pData=(BYTE*)::GlobalLock((HGLOBAL)hDIB);//锁定
if(fread(pData,1,bmf.bfSize-sizeof(BFH),fp)!=(bmf.bfSize-sizeof(BFH)))//文件读取错误
{
::GlobalUnlock((HGLOBAL)hDIB);//解除锁定
::GlobalFree((HGLOBAL)hDIB);//释放内存
returnNULL;
}
::GlobalUnlock((HGLOBAL)hDIB);//解除锁定
returnhDIB;//返回DIB句柄
}

BOOLWINAPIPaintDIB(HDChDC,intposX,intposY,HDIBhDIB)
{
BYTE*pDIBHd;//BITMAPINFOHEADER指针
BYTE*pDIBBits;//DIB象素指针
BOOLbSuccess=FALSE;//成功标志
HPALETTEhPal=NULL;//DIB调色板
//HPALETTEhOldPal=NULL;//以前的调色板
if(hDIB==NULL)returnFALSE;//判断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);//解除锁定
returnbSuccess;
}
//打印位图信息
VOIDWINAPIPrintDIBInfo(HDIBhDIB)
{
BYTE*pDIBHd=(BYTE*)::GlobalLock((HGLOBAL)hDIB);
BIH*pbmi=(BIH*)pDIBHd;
constchar*lp[]=
{
"位图信息长度:%d ",
"位图图像大小:%dx%d ",
"位面数:%d ",
"位图颜色深度:%d ",
"位图数据压缩类型:%d ",
"位图数据区域大小:%d ",
"位图分辨率:水平%ddpi,垂直%ddpi ",
};
printf("WindowsV3cBitmapInfoHeader信息 ");
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);//解除锁定
}intmain(intargc,char*argv[])
{
HDIBx;
FILE*fp=fopen("1.bmp","rb");
if(fp==NULL)return-1;
x=ReadDIBFile(fp);
printf("DIBhandle%u",x);
PaintDIB(GetDC(NULL),0,0,x);
PrintDIBInfo(x);
return0;
}