题目:图像的基本处理班级:2011级软件2班姓名:刘磊磊时间:20130907摘要:随着数字化与多媒体时代的来临,数字图像处理已经成为必备的基础知识。全国各大专院校的计算机、电子、通信、医学、光学及许多相关专业都开设了与数字图像预处理相关的课程。数字图像二值化是图像预处理中的一项重要技术,其在模式识别、光学字符识别、医学成像等方面都有着重要应用。本论文主要为大家介绍24位真彩图像的灰度、二值处理以及图像的一些简单的打开和保存和如何画直方图,还有一些通过这次小学期学到的一些知识。关键字:灰度处理,二值化图像的打开voidCText1Dlg::ShowPic(){if(m_path==)//判断图片路径是否存在{return;}hwnd=GetDlgItem(IDC_pic);hDesDC=hwnd-GetDC()-m_hDC;hSrcDC=CreateCompatibleDC(hDesDC);hBitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),m_path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);GetObject(hBitmap,sizeof(BITMAP),&bm);SelectObject(hSrcDC,hBitmap);hwnd-GetClientRect(&rect);::SetStretchBltMode(hDesDC,COLORONCOLOR);::StretchBlt(hDesDC,rect.left,rect.top,rect.right,rect.bottom,hSrcDC,0,0,bm.bmWidth,bm.bmHeight,+SRCCOPY);UpdateData(false);}voidCText1Dlg::Onopenpicture()//打开图像{//TODO:Addyourcontrolnotificationhandlercodehereinum=1;CFileDialogdlg(TRUE,bmp,.bmp,OFN_HIDEREADONLY,BMPFiles(*.jpg)|*.bmp||);//设置所能打开图像的格式//CFileDialogdlg(TRUE,jpg,.jpg,OFN_HIDEREADONLY,JPGFiles(*.bmp)|*.jpg||);这是jpg图像的打开方式if(dlg.DoModal()!=IDOK)//dlg_jpg.DoModal(){return;}m_path=dlg.GetPathName();//获得图片路径UpdateData(false);//更新路径公共变量ShowPic();//调用显示图片函数}图像的保存我的方法是先选择需要保存的图片并且这张图片是已经命名的,然后选择路径,最后用CopyFile(“原始图像全名包括扩展名”,“保存的全名包括路径+新的命名+扩展名”,false)就OK了。下面是代码:voidCForm::Onsaveroud(){//TODO:AddyourcontrolnotificationhandlercodehereCStringstrFolderPath=;TCHARszPath[_MAX_PATH];BROWSEINFObi;bi.hwndOwner=GetSafeHwnd();bi.pidlRoot=NULL;bi.lpszTitle=_T(选择文件夹);bi.pszDisplayName=szPath;bi.ulFlags=BIF_RETURNONLYFSDIRS;bi.lpfn=NULL;bi.lParam=NULL;LPITEMIDLISTpItemIDList=SHBrowseForFolder(&bi);if(pItemIDList){if(SHGetPathFromIDList(pItemIDList,szPath)){strFolderPath=szPath;}//防止内存泄露,要使用IMalloc接口IMalloc*pMalloc;if(SHGetMalloc(&pMalloc)!=NOERROR){TRACE(_T(无法取得外壳程序的IMalloc接口\n));}pMalloc-Free(pItemIDList);if(pMalloc)pMalloc-Release();}ScanDiskFile(strFolderPath);}voidCForm::ScanDiskFile(CString&strPath){CFileFindfind;CStringstrTemp=strPath;CStringstrDirectory=strPath+_T(\\)+_T(\\*.*);CStringstrFile;BOOLIsFind=find.FindFile(strDirectory);IsFind=find.FindNextFile();//如果是.则不扫描if(find.IsDots()){}//如果是是目录,继续扫描此目录elseif(find.IsDirectory()){strFile=find.GetFileName();strTemp=strTemp;//+_T(\\)+strFile;//ScanDiskFile(strTemp);}m_path=strTemp;//m_path就是所要保存图片的路径UpdateData(false);find.Close();}彩色图像的灰度处理:图像灰度处理就是把各个像素点的R,G,B值设置为同一个值,当然要根据图像来取值。voidCText1Dlg::Oncolortogray()//彩色转换灰度{//TODO:Addyourcontrolnotificationhandlercodehere//m_dwOperation=IMAGE_Text1_color_grayed_out;UpdateData();CStringstr;if(inum==1)//判别是否是从其他路径读取{m_sourcefile=m_path;//m_sourcefile是所要处理的彩色图片的路径及全名m_targetfile=m_path+gray.bmp;//m_targetfile是处理过的图片的路径及全名str=m_targetfile;}m_sourcefile=CStimes;m_targetfile=gray.bmp;str=m_targetfile;if(m_sourcefile==||m_targetfile==)return;FILE*sourcefile,*targetfile;//位图文件头和信息头BITMAPFILEHEADERsourcefileheader,targetfileheader;BITMAPINFOHEADERsourceinfoheader,targetinfoheader;memset(&targetfileheader,0,sizeof(BITMAPFILEHEADER));memset(&targetinfoheader,0,sizeof(BITMAPINFOHEADER));sourcefile=fopen(m_sourcefile,rb);fread((void*)&sourcefileheader,1,sizeof(BITMAPFILEHEADER),sourcefile);//提取原图文件头if(sourcefileheader.bfType!=0x4d42){fclose(sourcefile);MessageBox(原图象不为BMP图象!);return;}fread((void*)&sourceinfoheader,1,sizeof(BITMAPINFOHEADER),sourcefile);//提取文件信息头if(sourceinfoheader.biBitCount!=24){fclose(sourcefile);MessageBox(原图象不为24位真彩色!);return;}if(sourceinfoheader.biCompression!=BI_RGB){fclose(sourcefile);MessageBox(原图象为压缩后的图象,本程序不处理压缩过的图象!);return;}//构造灰度图的文件头targetfileheader.bfOffBits=54+sizeof(RGBQUAD)*256;targetfileheader.bfSize=targetfileheader.bfOffBits+sourceinfoheader.biSizeImage/3;targetfileheader.bfReserved1=0;targetfileheader.bfReserved2=0;targetfileheader.bfType=0x4d42;//构造灰度图的信息头,这些都是固定值targetinfoheader.biBitCount=8;targetinfoheader.biSize=40;targetinfoheader.biHeight=sourceinfoheader.biHeight;targetinfoheader.biWidth=sourceinfoheader.biWidth;targetinfoheader.biPlanes=1;targetinfoheader.biCompression=BI_RGB;targetinfoheader.biSizeImage=sourceinfoheader.biSizeImage/3;targetinfoheader.biXPelsPerMeter=sourceinfoheader.biXPelsPerMeter;targetinfoheader.biYPelsPerMeter=sourceinfoheader.biYPelsPerMeter;targetinfoheader.biClrImportant=0;targetinfoheader.biClrUsed=256;//构造灰度图的调色版RGBQUADrgbquad[256];//color=(RGBMixPlate*)malloc(sizeof(RGBMixPlate)*256);//index=(BYTE*)malloc(sizeof(BYTE)*infohead.readSize);inti,j,m,n,k;for(i=0;i256;i++){rgbquad[i].rgbBlue=i;rgbquad[i].rgbGreen=i;rgbquad[i].rgbRed=i;rgbquad[i].rgbReserved=0;}targetfile=fopen(m_targetfile,wb);//写入灰度图的文件头,信息头和调色板信息fwrite((void*)&targetfileheader,1,sizeof(BITMAPFILEHEADER),targetfile);fwrite((void*)&targetinfoheader,1,sizeof(BITMAPINFOHEADER),targetfile);fwrite((void*)&rgbquad,1,sizeof(RGBQUAD)*256,targetfile);BYTE*sourcebuf;BYTE*targetbuf;//这里是因为BMP规定保存时长度和宽度必须是4的整数倍,如果不是则要补足m=(targetinfoheader.biWidth/4)*4;if(mtargetinfoheader.biWidth)m=m+4;n=(targetinfoheader.biHeight/4)*4;if(ntargetinfoheader.biHeight)n=n+4;sourcebuf=(BYTE*)malloc(m*n*3);//读取原图的颜色矩阵信息fread(sourcebuf,1,m