图像处理opencv代码.doc

上传人:w****2 文档编号:6615445 上传时间:2020-02-29 格式:DOC 页数:15 大小:52KB
返回 下载 相关 举报
图像处理opencv代码.doc_第1页
第1页 / 共15页
图像处理opencv代码.doc_第2页
第2页 / 共15页
图像处理opencv代码.doc_第3页
第3页 / 共15页
点击查看更多>>
资源描述
#include stdafx.h#include mymfc.h#include mymfcDlg.h#include afxdialogex.h#include #ifdef _DEBUG#define new DEBUG_NEW#endif/ 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogExpublic:CAboutDlg();/ 对话框数据enum IDD = IDD_ABOUTBOX ;protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV 支持/ 实现protected:DECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialogEx(CAboutDlg:IDD)void CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialogEx:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)END_MESSAGE_MAP()/ CmymfcDlg 对话框CmymfcDlg:CmymfcDlg(CWnd* pParent /*=NULL*/): CDialogEx(CmymfcDlg:IDD, pParent), TheImage(NULL), rePath(_T()m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);void CmymfcDlg:DoDataExchange(CDataExchange* pDX)CDialogEx:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CmymfcDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_ReadImg, &CmymfcDlg:OnBnClickedReadimg)ON_BN_CLICKED(IDC_EdgeDetect, &CmymfcDlg:OnBnClickedEdgedetect)ON_BN_CLICKED(IDC_Refresh, &CmymfcDlg:OnBnClickedRefresh)ON_BN_CLICKED(IDC_GrayProcess, &CmymfcDlg:OnBnClickedGrayprocess)ON_BN_CLICKED(IDC_Sobel, &CmymfcDlg:OnBnClickedSobel)ON_BN_CLICKED(IDC_Laplace, &CmymfcDlg:OnBnClickedLaplace)ON_BN_CLICKED(IDC_FFT2, &CmymfcDlg:OnBnClickedFft2)ON_BN_CLICKED(IDC_CImage, &CmymfcDlg:OnBnClickedCimage)ON_BN_CLICKED(IDC_Mirror, &CmymfcDlg:OnBnClickedMirror)ON_BN_CLICKED(IDC_CColor, &CmymfcDlg:OnBnClickedCcolor)ON_BN_CLICKED(IDC_MedianBlur, &CmymfcDlg:OnBnClickedMedianblur)ON_BN_CLICKED(IDC_Gaussian, &CmymfcDlg:OnBnClickedGaussian)ON_BN_CLICKED(IDC_BothSide, &CmymfcDlg:OnBnClickedBothside)ON_BN_CLICKED(IDC_Equally, &CmymfcDlg:OnBnClickedEqually)ON_BN_CLICKED(IDC_Corrosion, &CmymfcDlg:OnBnClickedCorrosion)ON_BN_CLICKED(IDC_Dilate, &CmymfcDlg:OnBnClickedDilate)END_MESSAGE_MAP()/ CmymfcDlg 消息处理程序BOOL CmymfcDlg:OnInitDialog()CDialogEx:OnInitDialog();/ 将“关于.”菜单项添加到系统菜单中。CvSize ImgSize;ImgSize.height = IMAGE_HEIGHT;ImgSize.width = IMAGE_WIDTH;TheImage = cvCreateImage( ImgSize, IPL_DEPTH_8U, IMAGE_CHANNELS );/ IDM_ABOUTBOX 必须在系统命令范围内。ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动/ 执行此操作SetIcon(m_hIcon, TRUE);/ 设置大图标SetIcon(m_hIcon, FALSE);/ 设置小图标/ TODO: 在此添加额外的初始化代码return TRUE; / 除非将焦点设置到控件,否则返回 TRUEvoid CmymfcDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialogEx:OnSysCommand(nID, lParam);/ 如果向对话框添加最小化按钮,则需要下面的代码/ 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,/ 这将由框架自动完成。void CmymfcDlg:OnPaint()if (IsIconic()CPaintDC dc(this); / 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc(), 0);/ 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ 绘制图标dc.DrawIcon(x, y, m_hIcon);elseCDialogEx:OnPaint();CDialog:OnPaint();/ 重绘对话框CDialog:UpdateWindow();/ 更新windows窗口,如果无这步调用,图片显示还会出现问题/ShowImage( TheImage, IDC_ShowImg );/ 重绘图片函数/当用户拖动最小化窗口时系统调用此函数取得光标/显示。HCURSOR CmymfcDlg:OnQueryDragIcon()return static_cast(m_hIcon);void CmymfcDlg:OnBnClickedReadimg() /读取图片操作/ TODO: 在此添加控件通知处理程序代码/ 这里用CFileDialog来选择图片CFileDialog dlg(TRUE, _T(*.bmp), NULL,OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY,_T(All Files (*.*) |*.*|image files (*.bmp; *.jpg)|*.bmp; *.jpg |), NULL);/ 打开文件对话框的标题名dlg.m_ofn.lpstrTitle = _T(Open Image);/ 判断是否获得图片if( dlg.DoModal() != IDOK )return;/ 获取图片路径CString mPath = dlg.GetPathName();rePath = mPath;/ 读取图片IplImage* ipl = cvLoadImage( mPath, 1 );/ 判断是否成功读取图片if( !ipl ) return;if( TheImage ) cvZero( TheImage );ResizeImage( ipl );ShowImage( TheImage,IDC_ShowImg);cvReleaseImage( &ipl );void CmymfcDlg:ShowImage(IplImage* img, UINT ID) / ID 是Picture Control控件的ID号/ 获得显示控件的 DCCDC* pDC = GetDlgItem( ID ) -GetDC();/ 获取 HDC(设备句柄) 来进行绘图操作HDC hDC = pDC -GetSafeHdc(); CRect rect;GetDlgItem(ID) -GetClientRect( &rect );/ 求出图片控件的宽和高int rw = rect.right - rect.left;int rh = rect.bottom - rect.top;/ 读取图片的宽和高int iw = img-width;int ih = img-height;/ 使图片的显示位置正好在控件的正中int tx = (int)(rw - iw)/2;int ty = (int)(rh - ih)/2;SetRect( rect, tx, ty, tx+iw, ty+ih );/ 复制图片CvvImage cimg;cimg.CopyOf( img );/ 将图片绘制到显示控件的指定区域内cimg.DrawToHDC( hDC, &rect ); ReleaseDC( pDC );void CmymfcDlg:ResizeImage(IplImage* img)/ 读取图片的宽和高int w = img-width;int h = img-height; / 找出宽和高中的较大值者int max = (w h)? w: h; / 计算将图片缩放到TheImage区域所需的比例float scale = (float) ( (float) max / 256.0f ); / 缩放后图片的宽和高int nw = (int)( w/scale );int nh = (int)( h/scale ); / 为了将缩放后的图片存入 TheImage 的正中部位,需计算图片在 TheImage 左上角的期望坐标值int tlx = (nw nh)? 0: (int)(256-nw)/2;int tly = (nw nh)? (int)(256-nh)/2: 0; / 设置 TheImage 的 ROI 区域,用来存入图片 imgcvSetImageROI( TheImage, cvRect( tlx, tly, nw, nh) ); / 对图片 img 进行缩放,并存入到 TheImage 中cvResize( img, TheImage ); / 重置 TheImage 的 ROI 准备读入下一幅图片cvResetImageROI( TheImage );void CmymfcDlg:OnBnClickedEdgedetect() /Canny算法的边缘检测/ TODO: 在此添加控件通知处理程序代码IplImage *gray = 0, *edge = 0; gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 ); edge = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 ); cvCvtColor( TheImage, gray, CV_BGR2GRAY ); cvCanny( gray, edge, 30, 100, 3 ); ShowImage( edge, IDC_ShowImg ); / 调用显示图片函数 cvReleaseImage( &gray ); cvReleaseImage( &edge );void CmymfcDlg:OnBnClickedRefresh() /恢复图片/ TODO: 在此添加控件通知处理程序代码/将读入的图片路径传给mPathCString mPath = rePath;/ 读取图片、缓存到一个局部变量 ipl 中IplImage* ipl = cvLoadImage( mPath, 1 );/ 判断是否成功读取图片if( !ipl ) return;/ 对上一幅显示的图片数据清零if( TheImage ) cvZero( TheImage );/ 对读入的图片进行缩放,使其宽或高最大值者刚好等于 256,再复制到 TheImage 中ResizeImage( ipl );/ 调用显示图片函数ShowImage( TheImage,IDC_ShowImg);void CmymfcDlg:OnBnClickedGrayprocess() /灰度图像的转化/ TODO: 在此添加控件通知处理程序代码IplImage *gray = 0; gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 ); cvCvtColor( TheImage, gray, CV_RGB2GRAY );ShowImage( gray, IDC_ShowImg );/释放图片的内存空间cvReleaseImage( &gray );void CmymfcDlg:OnBnClickedSobel() /用cvSobel函数的边缘检测/ TODO: 在此添加控件通知处理程序代码IplImage *gray = 0, *edge = 0; gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 ); edge = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 ); cvCvtColor( TheImage, gray, CV_BGR2GRAY ); cvSobel( gray, edge, 1, 0, 3 ); ShowImage( edge, IDC_ShowImg ); / 调用显示图片函数 cvReleaseImage( &gray ); cvReleaseImage( &edge );void CmymfcDlg:OnBnClickedLaplace() /用cvLaplace函数实现图像的拉普拉斯变换/ TODO: 在此添加控件通知处理程序代码IplImage *gray = 0, *edge = 0; gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 ); edge = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 ); cvCvtColor( TheImage, gray, CV_BGR2GRAY ); cvLaplace( gray, edge, 3 ); ShowImage( edge, IDC_ShowImg ); / 调用显示图片函数 cvReleaseImage( &gray ); cvReleaseImage( &edge );void CmymfcDlg:fft2(IplImage* src, IplImage* des) /傅里叶正变换方法/实部、虚部IplImage *image_Re = 0, *image_Im = 0, *Fourier = 0; / int i, j; image_Re = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1); /实部/Imaginary partimage_Im = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1); /虚部 /2 channels (image_Re, image_Im)Fourier = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 2);/ Real part conversion from u8 to 64f (double)cvConvertScale(src, image_Re, 1, 0); / Imaginary part (zeros)cvZero(image_Im);/ Join real and imaginary parts and stock them in Fourier imagecvMerge(image_Re, image_Im, 0, 0, Fourier);/ Application of the forward Fourier transformcvDFT(Fourier, des, CV_DXT_FORWARD); cvReleaseImage(&image_Re);cvReleaseImage(&image_Im);cvReleaseImage(&Fourier);void CmymfcDlg:OnBnClickedFft2()/ TODO: 在此添加控件通知处理程序代码IplImage *src; /源图像IplImage *Fourier; /傅里叶系数IplImage *dst ;IplImage *ImageRe;IplImage *ImageIm;IplImage *Image;IplImage *ImageDst;double m,M;double scale;double shift;src = cvLoadImage(rePath,0); /加载源图像,第二个参数表示将输入的图片转为单信道Fourier = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,2);dst = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,2);ImageRe = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,1);ImageIm = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,1);Image = cvCreateImage(cvGetSize(src),src-depth,src-nChannels);ImageDst = cvCreateImage(cvGetSize(src),src-depth,src-nChannels);fft2(src,Fourier); /傅里叶变换fft2shift(Fourier, Image); /中心化/cvDFT(Fourier,dst,CV_DXT_INV_SCALE);/实现傅里叶逆变换,并对结果进行缩放cvSplit(dst,ImageRe,ImageIm,0,0);cvPow(ImageRe,ImageRe,2); cvPow(ImageIm,ImageIm,2);cvAdd(ImageRe,ImageIm,ImageRe,NULL);cvPow(ImageRe,ImageRe,0.5);cvMinMaxLoc(ImageRe,&m,&M,NULL,NULL);scale = 255/(M - m);shift = -m * scale;/将shift加在ImageRe各元素按比例缩放的结果上,存储为ImageDst/cvConvertScale(ImageRe,ImageDst,scale,shift);cvNamedWindow(傅里叶谱,0);cvShowImage(傅里叶谱,Image);cvReleaseImage(&src);cvReleaseImage(&Image);cvReleaseImage(&ImageIm);cvReleaseImage(&ImageRe);cvReleaseImage(&Fourier);cvReleaseImage(&dst);cvReleaseImage(&ImageDst);void CmymfcDlg:fft2shift(IplImage* src, IplImage* dst) /傅里叶变换IplImage *image_Re = 0, *image_Im = 0;int nRow, nCol, i, j, cy, cx;double scale, shift, tmp13, tmp24;image_Re = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1);/Imaginary partimage_Im = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1);cvSplit( src, image_Re, image_Im, 0, 0 );/ Compute the magnitude of the spectrum Mag = sqrt(Re2 + Im2) /计算傅里叶谱 cvPow( image_Re, image_Re, 2.0); cvPow( image_Im, image_Im, 2.0); cvAdd( image_Re, image_Im, image_Re); cvPow( image_Re, image_Re, 0.5 ); /对数变换以增强灰度级细节(这种变换使以窄带低灰度输入图像值映射/ Compute log(1 + Mag); cvAddS( image_Re, cvScalar(1.0), image_Re ); / 1 + Mag cvLog( image_Re, image_Re ); / log(1 + Mag) /Rearrange the quadrants of Fourier image so that the origin is at the image center nRow = src-height; nCol = src-width; cy = nRow/2; / image center cx = nCol/2;/进行中心变换 for( j = 0; j cy; j+ ) for( i = 0; i cx; i+ ) /中心化,将整体份成四块进行对角交换 tmp13 = CV_IMAGE_ELEM( image_Re, double, j, i); CV_IMAGE_ELEM( image_Re, double, j, i) = CV_IMAGE_ELEM(image_Re, double, j+cy, i+cx); CV_IMAGE_ELEM( image_Re, double, j+cy, i+cx) = tmp13; tmp24 = CV_IMAGE_ELEM( image_Re, double, j, i+cx); CV_IMAGE_ELEM( image_Re, double, j, i+cx) =CV_IMAGE_ELEM( image_Re, double, j+cy, i); CV_IMAGE_ELEM( image_Re, double, j+cy, i) = tmp24; /归一化处理将矩阵的元素值归一为0,255 /(f(x,y)-minVal)/(maxVal-minVal)*255 double minVal = 0, maxVal = 0; / Localize minimum and maximum values cvMinMaxLoc( image_Re, &minVal, &maxVal ); / Normalize image (0 - 255) to be observed as an u8 image scale = 255/(maxVal - minVal); shift = -minVal * scale; cvConvertScale(image_Re, dst, scale, shift); cvReleaseImage(&image_Re); cvReleaseImage(&image_Im);void CmymfcDlg:OnBnClickedCimage() /图片的反转/ TODO: 在此添加控件通知处理程序代码IplImage * cImage = 0;cImage = cvCloneImage(TheImage); /这里用克隆函数将原图片复制给cImage/利用翻转函数cvFlip()将cImage反转cvFlip(cImage,NULL,0); ShowImage(cImage,IDC_ShowImg);cvReleaseImage(&cImage);void CmymfcDlg:OnBnClickedMirror() /图像的镜像/ TODO: 在此添加控件通知处理程序代码IplImage * cImage = 0;cImage = cvCloneImage(TheImage); /这里用克隆函数将原图片复制给cImage/利用翻转函数cvFlip()将cImage反转cvFlip(cImage,NULL,1); ShowImage(cImage,IDC_ShowImg);cvReleaseImage(&cImage);void CmymfcDlg:OnBnClickedCcolor() /图像的反色/ TODO: 在此添加控件通知处理程序代码IplImage * cImage = 0;cImage = cvCloneImage(TheImage); /这里用克隆函数将原图片复制给cImage/利用函数cvNot()将cImage每个像素点取反cvNot(TheImage,cImage); ShowImage(cImage,IDC_ShowImg);cvReleaseImage(&cImage);void CmymfcDlg:OnBnClickedMedianblur() /非线性滤波之中值滤波/ TODO: 在此添加控件通知处理程序代码/灰度原始图像IplImage *gray = 0; gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 ); cvCvtColor( TheImage, gray, CV_RGB2GRAY );IplImage * dstImage = 0;dstImage = cvCloneImage(gray); /这里用克隆函数将sreImage图片复制给dstImagecvSmooth(gray,dstImage,CV_MEDIAN,5,5);ShowImage(dstImage,IDC_ShowImg);cvReleaseImage(&gray);cvReleaseImage(&dstImage);void CmymfcDlg:OnBnClickedGaussian() /高斯滤波/ TODO: 在此添加控件通知处理程序代码/灰度原始图像IplImage *gray = 0; gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 ); cvCvtColor( TheImage, gray, CV_RGB2GRAY );IplImage * dstImage = 0;dstImage = cvCloneImage(gray); /这里用克隆函数将sreImage图片复制给dstImagecvSmooth(gray,dstImage,CV_GAUSSIAN,5,5);ShowImage(dstImage,IDC_ShowImg);cvReleaseImage(&gray);cvReleaseImage(&dstImage);void CmymfcDlg:OnBnClickedBothside() /双边滤波/ TODO: 在此添加控件通知处理程序代码/灰度原始图像IplImage *gray = 0; gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 ); cvCvtColor( TheImage, gray, CV_RGB2GRAY );IplImage * dstImage = 0;dstImage = cvCloneImage(gray); /这里用克隆函数将sreImage图片复制给dstImagecvSmooth(gray,dstImage,CV_BILATERAL,1,150,240,480);ShowImage(dstImage,IDC_ShowImg);cvReleaseImage(&gray);cvReleaseImage(&dstImage);void CmymfcDlg:OnBnClickedEqually() /图片的均值滤波/ TODO: 在此添加控件通知处理程序代码/灰度原始图像IplImage *gray = 0; gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 ); cvCvtColor( TheImage, gray, CV_RGB2GRAY );IplImage * dstImage = 0;dstImage = cvCloneImage(gray); /这里用克隆函数将sreImage图片复制给dstImagecvSmooth(gray,dstImage,CV_BLUR,3,3);ShowImage(dstImage,IDC_ShowImg);cvReleaseImage(&gray);cvReleaseImage(&dstImage);void CmymfcDlg:OnBnClickedCorrosion() /图片的腐蚀/ TODO: 在此添加控件通知处理程序代码/灰度原始图像IplImage *gray = 0; gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 ); cvCvtColor( TheImage, gray, CV_RGB2GRAY );IplImage * dstImage = 0;dstImage = cvCloneImage(gray); /这里用克隆函数将sreImage图片复制给dstImagecvErode(gray,dstImage,0,1); /使用cvErode()函数实现图片的腐蚀ShowImage(dstImage,IDC_ShowImg);cvReleaseImage(&gray);cvReleaseImage(&dstImage);void CmymfcDlg:OnBnClickedDilate() /图片的膨胀/ TODO: 在此添加控件通知处理程序代码/灰度原始图像IplImage *gray = 0; gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 ); cvCvtColor( TheImage, gray, CV_RGB2GRAY );IplImage * dstImage = 0;dstImage = cvCloneImage(gray); /这里用克隆函数将sreImage图片复制给dstImagecvDilate(gray,dstImage,0,1); /使用cvDilate()函数实现图片的膨胀ShowImage(dstImage,IDC_ShowImg);cvReleaseImage(&gray);cvReleaseImage(&dstImage);
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 临时分类 > 人文社科


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!