Visual-C++-实现数字化图像的分割
- 格式:docx
- 大小:92.68 KB
- 文档页数:12
用Microsoft Visual C++显示位图图片的几种方法总结一,用控件框架作为装载位图的容器来显示位图用控件作为容器框架来显示位图是很多应用程序中都会遇到和用到的,因为它的方便可控制性1)、首先,我们先了解几个用到的函数:1、CWnd::GetDlgItemCWnd* GetDlgItem( int nID ) const;void CWnd::GetDlgItem( int nID, HWND* phWnd ) const;返回值:指向给定的控件或子窗口的指针。
如果没有控件具有nID给出的整数ID,则返回NULL。
返回的指针可能是临时的,不能被保存以供将来使用。
参数:nID 指定了要获取的控件或子窗口的标识符。
phWnd 指向子窗口的指针。
说明:这个函数获得对话框或其它窗口中指定控件或子窗口的指针。
返回的指针通常被强制转换为nID所标识的控件类型。
2、CWnd::GetDCCDC* GetDC( );返回值:如果调用成功,则返回CWnd客户区的设备环境;否则,返回NULL。
这个指针可能是临时的,不能被保存以供将来使用。
说明:这个函数获得一个指针,指向一个客户区的公用的、属于类的或者私有的设备环境,依赖于为CWnd指定的类风格。
对于公用的设备环境,GetDC每次获得设备环境时都给它赋予缺省值。
对于属于类的或者私有的设备环境,GetDC保持原来的属性不变。
在随后的图形设备接口(GDI)函数中可以使用设备环境以在客户区中绘图。
除非设备环境属于一个窗口类,否则在绘图之后必须调用ReleaseDC成员函数以释放设备环境。
由于在同一时刻只有五个公用设备环境可供使用,因此如果释放设备环境时失败,可能导致其它应用程序不能访问设备环境。
如果在注册窗口类的时候,在WNDCLASS的风格中指定了CS_CLASSDC,CS_OWNDC或CS_PARENTDC,则GetDC成员函数将返回属于CWnd类的设备环境。
Visual C++MFC入门教程(经典版)visual-c++mfc入门教程(经典版)木有页眉visualc++mfc入门教程目录+--第一章vc入门|------1.1如何学好vc|------1.2认知windows消息机制|------1.3利用visualc++/mfc开发windows程序的优势|------1.4利用mfc进行开发的通用方法介绍|------1.5mfc中常用类,宏,函数介绍+--第二章图形输出|------2.1和gui有关的各种对象|------2.2在窗口中输入文字|------2.3使用点,刷子,笔进行绘图|------2.4在窗口中绘制设备有关图形,图标,设备毫无关系图形|------2.5采用各种态射方式|------2.6多边形和剪贴区域+--第三章文档视结构|------3.1文档视图框架窗口间的关系和消息传送规律|------3.2接收用户输入|------3.3使用菜单|------3.4文档,视,框架之间相互作用|------3.5利用序列化展开文件读取|------3.6mfc中所提供更多的各种视类了解+--第四章窗口控件|------4.1button|------4.2staticbox|------4.3editbox|------4.4scrollbar|------4.d利用appwizard创建并使用toolbarstatusbardialogbar|------4.egeneralwindow|------4.f关于wm_notify的采用方法+--第五章对话框|------5.1使用资源编辑器编辑对话框|------5.2创建有模式对话框|------5.3创建无模式对话框|------5.4在对话框中展开消息态射|------5.5在对话框中进行数据交换和数据检查1木有页眉|------5.6采用属性对话框|------5.7采用通用型对话框|------5.8建立以对话框为基础的应用|------5.9使用对话框作为子窗口+--第六章网络通信开发|------6.1winsock介绍|------6.2利用winsock展开并无相连接的通信+------6.3利用winsock创建存有相连接的通信《visualc++开发指南》闻怡洋/文第一章vc入门1.1如何努力学习vc这个问题很多朋友都问过我,当然流汗是必须的,但同时如果按照某种思路进行有计划的学习就会起到更好的效果。
vscode开发c编程案例在使用Visual Studio Code (VSCode)进行C语言编程时,你需要安装C语言相关的扩展,并设置一个合适的编译器。
以下是一个简单的案例,演示如何在VSCode中进行C语言编程:步骤:安装VSCode:如果你还没有安装Visual Studio Code,你可以从官方网站下载并安装。
安装C/C++扩展:打开VSCode,点击左侧的扩展图标,搜索并安装 "C/C++" 扩展。
这个扩展提供了对C和C++的支持,包括代码高亮、智能感知等功能。
安装编译器:在进行C语言编程之前,你需要安装一个C语言的编译器。
一个常用的选择是GNU Compiler Collection (GCC)。
你可以在Linux系统中使用包管理器安装,或者在Windows系统中使用MinGW。
创建C文件:在VSCode中创建一个新文件,保存并使用 ".c" 扩展名。
例如,创建一个名为 hello.c 的文件。
编写C代码:在 hello.c 文件中编写简单的C代码。
例如:cCopy code#include <stdio.h>int main() {printf("Hello, World!\n");return 0;}配置编译任务:在VSCode中,创建一个名为 tasks.json 的文件,用于配置编译任务。
在项目根目录下,使用快捷键Ctrl + Shift + B (Windows/Linux)或Cmd + Shift + B(Mac)选择"Configure Build Task",然后选择 "C/C++: gcc build active file"。
这将在项目根目录下创建一个 tasks.json 文件。
jsonCopy code{"version": "2.0.0","tasks": [{"label": "build hello","type": "shell","command": "gcc","args": ["-g","${file}","-o","${fileDirname}/out/${fileBasenameNoExtension}"],"group": {"kind": "build","isDefault": true}}]}这个配置文件指定了使用GCC编译器将当前打开的C文件编译为可执行文件,并保存在 out 文件夹中。
用visual studio code编写c语言程序VisualStudioCode是一款免费开源的代码编辑器,它支持多种编程语言,包括C语言。
在本文中,我们将介绍如何使用Visual Studio Code编写C语言程序。
1. 安装Visual Studio Code首先,您需要下载并安装Visual Studio Code。
您可以在官方网站上下载,也可以使用其他第三方软件仓库进行安装。
2. 安装C/C++扩展在Visual Studio Code中,您需要安装一个C/C++扩展,以便编写和调试C语言程序。
您可以在“扩展”选项卡中搜索并安装C/C++扩展。
3. 创建一个新的C语言项目在Visual Studio Code中,您可以使用“终端”选项卡创建一个新的C语言项目。
打开终端并输入以下命令:mkdir myprojectcd myprojecttouch main.c这将创建一个名为“myproject”的文件夹,并在其中创建一个名为“main.c”的文件。
4. 编写C语言代码在“main.c”文件中,您可以编写您的C语言代码。
例如,以下是一个简单的“Hello, World!”程序:#include <stdio.h>int main(){printf('Hello, World!');return 0;}5. 编译和运行C语言程序在Visual Studio Code中,您可以使用“终端”选项卡编译和运行C语言程序。
在终端中输入以下命令:gcc main.c -o main./main这将编译和运行您的C语言程序,并在终端中输出“Hello, World!”的消息。
总结使用Visual Studio Code编写C语言程序非常简单。
只需安装Visual Studio Code和C/C++扩展,创建一个新的C语言项目,编写C语言代码,然后使用终端编译和运行程序即可。
1.2 Visual C++开发环境简介1.2.1 Visual C++集成开发环境简介Visual C++是Microsoft公司提供的在Windows环境下进行应用程序开发的C/C++编译器。
相比其它的编译工具而言,Visual C++在提供可视化的编程方法的同时,也适用于编写直接对系统进行层底操作的程序。
Visual C++6.0是Microsoft公司出品的基于Windows的C++开发工具,它是Microsoft Visual Studio套装软件的一个有机组成部分,在以前版本的基础上又增加了或增强了许多特性。
Visual C++软件包包含了许多单独的组件,如编辑器、编译器、链接器、生成实用程序、调试器、以及各种各样为开发Microsoft Windows下的C/C++ 程序而设计的工具。
Visual Stutio把所有的Visual C++工具结合在一起,集成一个整体,通过一个由窗口、对话框、菜单、工具栏、快捷键及宏组成的和谐系统,你可以观察和控制整个开发进程。
一般情况下,术语Visual C++既指整个产品,又指它的开发环境。
Visual C++集成开发环境如图1.9所示。
图1.9 Visual C++集成开发环境1.2.2 Visual C++集成开发环境的使用一个程序从编写到运行出结果要经过编辑、预处理、编译、连接、加载和执行六个阶段。
在Visual C++集成开发环境中可以完成以上所有功能。
以下就一个简单的程序在Visual C++集成开发环境上的编辑和编译的过程来说明Visual C++集成开发环境的使用方法。
该程序的功能是在屏幕上输出一行字符串“hello,world!”。
首先要新建一个源文件进行编辑。
1.新建和输入源程序如果在Visual C++集成开发环境中存在正在编译的工作区,在新建源程序之前首先要关闭这个工作区。
鼠标点击菜单栏的“File”,菜单,打开“File”下拉菜单条,首先查看菜单选项“Close Workspace”选项,确定其为不可用状态(灰色)。
VisualC集成开发环境VisualC是微软推出的一套集成开发环境(IDE),用于开发基于Windows平台的应用程序。
它提供了一整套工具和功能,使开发人员能够轻松地编写、调试和部署各种类型的应用程序。
在本文中,我们将详细介绍VisualC集成开发环境的功能、特点和使用方法。
功能和特点VisualC集成开发环境具有许多强大的功能和特点,使其成为开发Windows应用程序的理想选择。
以下是其主要功能和特点:1.代码编辑器:VisualC内置了强大的代码编辑器,支持语法高亮、代码折叠、自动补全等功能,使开发人员可以更高效地编写代码。
2.调试器:VisualC提供了强大的调试器,支持逐步调试、观察变量值、设置断点等功能,帮助开发人员找出和修复代码中的问题。
3.项目管理:VisualC支持创建和管理项目,包括控制台应用程序、Windows桌面应用程序、库项目等,使开发人员可以轻松组织和管理代码。
4.GUI设计器:VisualC提供了GUI设计器,支持可视化设计界面,使开发人员可以直观地设计用户界面,并生成相应的代码。
5.集成开发环境:VisualC集成了多种开发工具和组件,包括编译器、链接器、资源编辑器等,使开发人员可以在同一个界面内完成整个开发过程。
6.扩展性:VisualC支持丰富的扩展插件,开发人员可以根据自己的需求安装和使用各种扩展,扩展VisualC的功能和特性。
7.跨平台:VisualC不仅支持Windows开发,还可以用于开发跨平台的应用程序,包括移动应用程序、Web应用程序等。
使用方法安装VisualC集成开发环境要使用VisualC集成开发环境,首先需要下载并安装Visual Studio。
可以从微软官方网站上下载Visual Studio的安装程序,并根据提示逐步安装。
创建项目在打开Visual Studio后,可以选择新建项目,选择项目类型(如控制台应用程序、Windows桌面应用程序等)以及项目名称和保存路径,然后点击“确定”按钮,即可创建一个新项目。
Visual C++ 实现数字化图像的分割一、前言用计算机进行数字图像处理的目的有两个,一是产生更适合人类视觉观察和识别的图像,二是希望计算机能够自动进行识别和理解图像。
无论是为了何种目的,图像处理的关键一步是对包含有大量各式各样景物信息的图像进行分解。
分解的最终结果就是图像被分成一些具有各种特征的最小成分,这些成分就称为图像的基元。
产生这些基元的过程就是图像分割的过程。
图像分割作为图像处理领域中极为重要的内容之一,是实现图像分析与理解的基础。
从概念上来说,所谓图像分割就是按照一定的原则将一幅图像或景物分为若干个部分或子集的过程。
目前图像处理系统中我们只能得到二维图像信息,因此只能进行图像分割而不是景物分割(景物是三维信息);图像分割也可以理解为将图像中有意义的特征区域或者需要应用的特征区域提取出来,这些特征区域可以是像素的灰度值、物体轮廓曲线、纹理特性等,也可以是空间频谱或直方图特征等。
在图像中用来表示某一物体的区域,其特征都是相近或相同的,但是不同物体的区域之间,特征就会急剧变化。
目前已经提出的图像分割方法很多,从分割依据的角度来看,图像的分割方法可以分为相似性分割和非连续性分割。
相似性分割就是将具有同一灰度级或相同组织结构的像素聚集在一起,形成图像的不同区域;非连续性分割就是首先检测局部不连续性,然后将它们连接在一起形成边界,这些边界将图像分成不同的区域。
由于不同种类的图像,不同的应用场合,需要提取的图像特征是不同的,当然对应的图像特征提取方法也就不同,因此并不存在一种普遍适应的最优方法。
图像分割方法又可分为结构分割方法和非结构分割方法两大类。
结构分割方法是根据图像的局部区域象素的特征来实现图像分割,如阈值分割、区域生长、边缘检测、纹理分析等,这些方法假定事先知道这些区域的特性,或者在处理过程中能够求得这些特性,从而能够寻找各种形态或研究各像素群。
非结构分割法包括统计模式识别、神经网络方法或其它利用景物的先验知识实现的方法等等。
这些内容由于专业性很强,就不在本文讨论内容中了,有兴趣的读者可以参考图像处理的专业书籍。
总之,图像分割可以分为图像的边缘提取和图像的二值化二部分内容,下面我们首先来讨论一下各种常用的图像边缘提取的方法。
二、图像边缘检测数字图像的边缘检测是图像分割、目标区域的识别、区域形状提取等图像分析领域十分重要的基础,是图像识别中提取图像特征的一个重要属性,图像理解和分析的第一步往往就是边缘检测,目前它以成为机器视觉研究领域最活跃的课题之一,在工程应用中占有十分重要的地位。
物体的边缘是以图像的局部特征不连续的形式出现的,也就是指图像局部亮度变化最显著的部分,例如灰度值的突变、颜色的突变、纹理结构的突变等,同时物体的边缘也是不同区域的分界处。
图像边缘有方向和幅度两个特性,通常沿边缘的走向灰度变化平缓,垂直于边缘走向的像素灰度变换剧烈,根据灰度变化的特点,可分为阶跃型、房顶型和凸缘型,如图一所示,这些变化对应图像中不同的景物。
需要读者注意的是,实际分析中图像要复杂的多,图像边缘的灰度变化情况并不仅限于上述标准情况。
(a)阶跃型(b) 房顶型(c) 凸缘型图一边缘灰度变换的几种类型由于边缘是图像上灰度变化最剧烈的地方,传统的边缘检测就是利用了这个特点,对图像各个像素点进行微分或求二阶微分来确定边缘像素点。
一阶微分图像的峰值处对应着图像的边缘点;二阶微分图像的过零点处对应着图像的边缘点。
根据数字图像的特点,处理图像过程中常采用差分来代替导数运算,对于图像的简单一阶导数运算,由于具有固定的方向性,只能检测特定方向的边缘,所以不具有普遍性。
为了克服一阶导数的缺点,我们定义了图像的梯度为梯度算子为,它是图像处理中最常用的一阶微分算法,式子中表示图像的灰度值,图像梯度的最重要性质是梯度的方向是在图像灰度最大变化率上,它恰好可以放映出图像边缘上的灰度变化。
图像边缘提取的常用梯度算子有Robert算子、Sobel算子、Prewitt算子、Krisch算子等。
下面以边缘检测Sobel算子为例来讲述数字图像处理中边缘检测的实现:对于数字图像,可以用一阶差分代替一阶微分;△xf(x,y)=f(x,y)-f(x-1,y);△yf(x,y)=f(x,y)-f(x,y-1);求梯度时对于平方和运算及开方运算,可以用两个分量的绝对值之和表示,即:Sobel梯度算子是先做成加权平均,再微分,然后求梯度,即:△xf(x,y)= f(x-1,y+1) + 2f(x,y+1) + f(x+1,y+1)- f(x-1,y-1) - 2f(x,y-1) - f(x+1,y-1);△yf(x,y)= f(x-1,y-1) + 2f(x-1,y) + f(x-1,y+1)- f(x+1,y-1) - 2f(x+1,y) - f(x+1,y+1);G[f(x,y)]=|△xf(x,y)|+|△yf(x,y)|;上述各式中的像素之间的关系见图二图二 Sober算子中各个像素点的关系图我在视图类中定义了响应菜单命令的边缘检测Sobel算子实现灰度图像边缘检测的函数(图像数据的获取可以参见我在天极网上发表的的相关文章):void CDibView::OnMENUSobel(){CClientDC pDC(this);HDC hDC=pDC.GetSafeHdc();//获取当前设备上下文的句柄;SetStretchBltMode(hDC,COLORONCOLOR);HANDLE data1handle;LPDIBHDRTMAPINFOHEADER lpDIBHdr;CDibDoc *pDoc=GetDocument();HDIB hdib;unsigned char *lpDIBBits;unsigned char *data;hdib=pDoc->m_hDIB;//得到图象数据;lpDIBHdr=(LPDIBHDRTMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);lpDIBBits= lpDIBHdr +* (LPDWORD)lpDIBHdr + 256*sizeof(RGBQUAD);//得到指向位图像素值的指针;data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpDIBHdr->biWidth*8)*lpDIBHdr->biHeight); //申请存放处理后的像素值的缓冲区data=(unsigned char*)GlobalLock((HGLOBAL)data1handle);AfxGetApp()->BeginWaitCursor();int i,j,buf,buf1,buf2;for( j=0; jbiHeight; j++)//以下循环求(x,y)位置的灰度值for( i=0; ibiWidth; i++){if(((i-1)>=0)&&((i+1)biWidth)&&((j-1)>=0)&&((j+1)biHeight)){//对于图像四周边界处的向素点不处理buf1=(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1))+2*(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j))+(int)(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1));buf1=buf1-(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1))-2*(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j))-(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1));//以上是对图像进行水平(x)方向的加权微分buf2=(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1))+2*(int)(int)*(lpDIBBits+(i)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1))+(int)(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1));buf2=buf2-(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1))-2*(int)(int)*(lpDIBBits+(i)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1))-(int)(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1));//以上是对图像进行垂直(y)方向加权微分buf=abs(buf1)+abs(buf2);//求梯度if(buf>255) buf=255;if(buf<0)buf=0;*(data+i*WIDTHBYTES(lpDIBHdr->biWidth*8)+j)=(BYTE)buf;}else *(data+i*lpDIBHdr->biWidth+j)=(BYTE)0;}for( j=0; jbiHeight; j++)for( i=0; ibiWidth; i++)*(lpDIBBits+i*WIDTHBYTES(lpDIBHdr->biWidth*8)+j)=*(data+i*WIDTHBYTES(lpDIBHdr->biWidth*8)+j); //处理后的数据写回原缓冲区StretchDIBits (hDC,0,0,lpDIBHdr->biWidth,lpDIBHdr->biHeight,0,0,lpDIBHdr->biWidth,lpDIBHdr->biHeight,lpDIBBits,(LPDIBHDRTMAPINFO)lpDIBHdr,DIB_RGB_COLORS,SRCCOPY);}上述的数学分析读者可能看起来有些吃力,不过不要紧,对与边缘检测,大家只要知道有若干个检测模板(既边缘检测矩阵)可以直接实现检测功能就行了,现在将常用的检测实现公式列出如下(检测模版可以从相应的算法很容易的得到):Roberts算子:G[i,i]=|f[i,j]-f[i+1,j+1]|+|f[i+1,j]-f[i,j+1]|;Sobe算子:G[i,i]=|f[i-1,j+1]+2f[i,j+1]+f[i+1,j+1]-f[i-1,j-1]-2f[i,j-1]-f[i+1,j-1]|+|f[i-1,j-1]+2f[i-1,j]+f[i-1,j+1]-f[i+1,j-1]-2f[i+1,j]-f[i+1,j+1]|;其中G[i,j]表示处理后(i,j)点的灰度值,f[i,j]表示处理前该点的灰度值。