文档库 最新最全的文档下载
当前位置:文档库 › 在VC中处理动态菜单消息的一种方法

在VC中处理动态菜单消息的一种方法

在VC中处理动态菜单消息的一种方法
在VC中处理动态菜单消息的一种方法

在VC中处理动态菜单消息的一种方法

说明一个CMenu 对象;

用LoadMenu 成员函数装入菜单资源;

用TrackPopupMenu 在指定位置显示菜单并发送所选菜单项

的ID;

用DestroyMenu 销毁菜单释放资源。

---- 在某些应用程序中,只有在程序运行时才能根据

情况确定菜单项的内容和菜单项的数目。这样就无

法在编程时建立菜单资源,也就不能象上面所述的那

样用LoadMenu 装入资源。需要用另一种方法建立菜单:

说明一个CMenu 对象;

用CreatePopupMenu 建立一个空菜单,再用InsertMenu 或AppendMenu 加入菜单项;

用TrackPopupMenu 在指定位置显示菜单并发送所选菜单项

的ID;

用DestroyMenu 销毁菜单释放资源。

---- 虽然这种方法可以动态地建立菜单,但是能够向动态菜单中加入的菜单项被限制在一个有限的范围内,

且必须在编程时就确定它们的ID。这是因为按照MFC 常规的

菜单处理机制,每个菜单项都要有一个处理函数,用MFC 的消息映射使每个菜单ID 对应到相应的处理函数,从而建立菜单项与处理函数的对应关系。用户选中某一菜单项,就会触发相应的处理函数。这样一来,我们必须在编程时就知道所有的菜单项,它们的ID 与对应的处理函

,并用消息映射静态地一一建立对应关系。

---- 在设计程序时,确实可能出现菜单项数目无法限制,菜单ID 事先不能确定的情况。例如,一个应用程序有两个文档类A 与B,每个文档都可以同时打开任意次。我们希

望在一个动态菜单中,只列出显示A 类文档的窗口标题,另一个动态菜单中只列出显示B 类文档的窗口标题。当

选定一个菜单项时,对应的文档窗口显示在最上面。由于我们不能限制打开的窗口数目,也不能预知窗口标题,所以就无法确定应该编写多少处理函数以及会有哪些

单ID,当然也就无法用消息映射建立对应关系。这时,我们需要一种不使用消息映射的方法。但是,不使用消息映

射我们如何知道用户选中了哪一个菜单项呢?答案是CMenu

类的成员函数TrackPopupMenu 可以告诉我们。

---- 我们可以从手册或联机帮助中找到关于该函数的

介绍:

BOOL TrackPopupMenu(UINT nFlag,intx,int

y,CWnd* pWnd,LPCRECTlpRect=NULL);

---- 参数nFlag 用于指定弹出式菜单的位置标志与有效

鼠标键。

可以取的值为下列的一个或多个:

TPM_CENTERALIGN,TPM_LEFTALIGN,TPM_RIGHTALIGN,

TPM_LEFTBUTTON,TPM_RIGHTBUTTON

---- 参数x,y 为弹出式菜单的位置,参数pWnd 为父窗口指针。

---- 该函数在指定位置显示一个弹出式菜单,并发送以选中

菜单项ID 标识的消息。执行成功返回非零值,否则返回零。

---- 这并不是关于TrackPopupMenu 的全部信息。该函数至少

有两

个重要特性没有列入文档,而它们对于解决我们的问题是

至关重要的。第一个未写入文档的特性是:该函数的第一

个参数nFlag 还可以取另外两个值:TPM_ NONOTIFY 与

TPM_RETURNCMD。

从它们的名字可以看出来,TPM_ NONOTIFY 的作用是使TrackPopupMenu 函

数不发送菜单消息通知应用程序。TPM_RETURNCMD 的作用是使函数

将本该发送出去的菜单消息作为返回值返回。这时函数的返

回值是UINT 类型的,就是选中的菜单ID。这就是该函数第二个

未写入文档的特性

---- 下面,我们通过一个例子详细解释TrackPopupMenu 的这种用

法。这个例子解决了上面提到的选择两类文档窗口的问题,

为了简捷,只给出了一个关键的函数PopupAMenuAndDisplay(intx,inty,CStringsDocType)。

---- 该函数的前两个参数给出了菜单的位置,第三个参数是文档的类型名。函数根据类型名,找到所有打开的该类文档。将文档窗口标题加入弹出式菜单,同时将指向这个文档的指针加入指针数组ptrDoc。这时要动态地分

配给菜单项一个ID,本函数的菜单ID 从1 开始,依次增加下

去。注意菜单ID 不能从零开始,不然当用户选择菜单的第

一项与一项也未选时函数的返回值都是零。

---- 接着是关键的一步:用函数TrackPopupMenu 显示菜单。根据

该函数的参数设置,如果函数返回零,表示用户未选中任

何菜单项。否则,函数返回选中的菜单项ID。实际上就是选

中的文档窗口对应的指针在数组ptrDoc 中的下标加1。剩下的

事情就很简单了。函数返回值大于零时,从ptrDoc 中取得选中

的文档类指针。从文档类可以得到视类,再从视类得到框

架类,最后激活该框架就达到了要求。

---- 无论用户打开了多少文档窗口PopupAMenuAndDisplay 都

可以正

确地处理。

---- 下面就是该函数的具体实现:

void CMainFrame::PopupAMenuAndDisplay

(intx,inty,CStringsDocType)

{

CMenu menu; //说明一个菜单实例

menu.CreatePopupMenu(); //建立一个动态弹出式菜单

CPtrArrayptrDoc; //文档指针数组

intnMenuID=1; //菜单ID

POSITION curTemplatePos = AfxGetApp()-

>GetFirstDocTemplatePosition(); //取得文档模板

while(curTemplatePos != NULL){

CDocTemplate* curTemplate =

AfxGetApp()- >GetNextDocTemplate(curTemplatePos);

CStringstr;

curTemplate->GetDocString(str,

CDocTemplate::docName);

if(str == sDocType){ //寻找指定模板

CDocument* pDoc;

POSITION docPos=curTemplate-

>GetFirstDocPosition();

//取该模板类的所有文档实例

while(docPos!=NULL&&(pDoc=curTemplate- > GetNextDoc(docPos))!

=NULL){

//在动态菜单中加入一个菜单项

menu.AppendMenu(MF_STRING|MF_ENABLED, nMenuID++,pDoc-

>GetTitle());

ptrDoc.Add(pDoc); //文档指针加入数组

}

}

}

//请注意TrackPopupMenu的这种用法

intnSelection=menu.TrackPopupMenu

(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL|

TPM_NONOTIFY|TPM_RETURNCMD, x,y, this);

menu.DestroyMenu(); //销毁菜单

if(nSelection>0){ //如果选择了菜单中的某一项

//从Doc找到对应的视

POSITION viewPos=((CDocument*)

ptrDoc[nSelection-1])- >GetFirstViewPosition();

CView* pView=((CDocument*)ptrDoc[nSelection-1])-

>GetNextView(viewPos);

//从视找到活动窗口并激活它

MDIActivate(pView- >GetParentFrame());

}

}

---- 通过这个例子可以看到这种方法的特点是不使用消息映

射,而是直接从TrackPopupMenu 的返回值中取得菜单消息进行处

理。它的优点是允许动态地指定菜单项与菜单ID,因此具有

最大的灵活性。当然,这需要使用TrackPopuoMenu 函数未写入文档

的两个特性。不过,我们不必担心微软会在将来的API 中去掉

这些特性。因为这样恐怕也将使它的一些老程序的弹出式菜

单发生问题。

数字图像处理四个实验报告,带有源程序

数字图像处理 实验指导书 学院:通信与电子工程学院 专业:电子信息工程 班级: 学号: 姓名: XX理工大学

实验一 MATLAB数字图像处理初步 一、实验目的与要求 1.熟悉及掌握在MATLAB中能够处理哪些格式图像。 2.熟练掌握在MATLAB中如何读取图像。 3.掌握如何利用MATLAB来获取图像的大小、颜色、高度、宽度等等相关信息。 4.掌握如何在MATLAB中按照指定要求存储一幅图像的方法。 5.图像间如何转化。 二、实验原理及知识点 1、数字图像的表示和类别 一幅图像可以被定义为一个二维函数f(x,y),其中x和y是空间(平面)坐标,f 在任何坐标处(x,y)处的振幅称为图像在该点的亮度。灰度是用来表示黑白图像亮度的一个术语,而彩色图像是由单个二维图像组合形成的。例如,在RGB彩色系统中,一幅彩色图像是由三幅独立的分量图像(红、绿、蓝)组成的。因此,许多为黑白图像处理开发的技术适用于彩色图像处理,方法是分别处理三副独立的分量图像即可。 图像关于x和y坐标以及振幅连续。要将这样的一幅图像转化为数字形式,就要求数字化坐标和振幅。将坐标值数字化成为取样;将振幅数字化成为量化。采样和量化的过程如图1所示。因此,当f的x、y分量和振幅都是有限且离散的量时,称该图像为数字图像。 作为MATLAB基本数据类型的数值数组本身十分适于表达图像,矩阵的元素和图像的像素之间有着十分自然的对应关系。 图1 图像的采样和量化 根据图像数据矩阵解释方法的不同,MA TLAB把其处理为4类: 亮度图像(Intensity images) 二值图像(Binary images) 索引图像(Indexed images) RGB图像(RGB images)

数字图像处理实验指导书模板

《数字图像处理》实验指导书 编写: 罗建军 海南大学三亚学院 10月

目录 一、概述 ....................................................................... 错误!未定义书签。 二、建立程序框架 ....................................................... 错误!未定义书签。 三、建立图像类 ........................................................... 错误!未定义书签。 四、定义图像文档实现图像读/写.............................. 错误!未定义书签。 五、实现图像显示 ....................................................... 错误!未定义书签。 六、建立图像处理类................................................... 错误!未定义书签。 七、实现颜色处理功能............................................... 错误!未定义书签。 (一) 亮度处理................................................................. 错误!未定义书签。 (二) 对比度处理............................................................. 错误!未定义书签。 (三) 色阶处理................................................................. 错误!未定义书签。 (四) 伽马变换................................................................. 错误!未定义书签。 (五) 饱和度处理............................................................. 错误!未定义书签。 (六) 色调处理................................................................. 错误!未定义书签。 八、实现几何变换功能............................................... 错误!未定义书签。 (一) 图像缩放................................................................. 错误!未定义书签。 (二) 旋转......................................................................... 错误!未定义书签。 (三) 水平镜像................................................................. 错误!未定义书签。 (四) 垂直镜像................................................................. 错误!未定义书签。 (五) 右转90度................................................................. 错误!未定义书签。 (六) 左转90度................................................................. 错误!未定义书签。 (七) 旋转180度............................................................... 错误!未定义书签。 九、实现平滑锐化功能............................................... 错误!未定义书签。 十、图像处理扩展编程............................................... 错误!未定义书签。

数字图像处理程序

数字图像处理程序

数字图像处理实验 图像处理实验(一)直方图 灰度变换是图像增强的一种重要手段,使图像对比度扩展,图像更加清晰,特 征更加明显。 灰度级的直方图给出了一幅图像概貌的描述,通过修改灰度直方图来得到图像 增强。 1、灰度直方图 (1)计算出一幅灰度图像的直方图 clear close all I=imread('004.bmp'); imhist(I) title('实验一(1)直方图'); (2)对灰度图像进行简单的灰度线形变换, figure subplot(2,2,1) imshow(I); title('试验2-灰度线性变换'); subplot(2,2,2) histeq(I); (3)看其直方图的对应变化和图像对比度的变化。 原图像 f(m,n) 的灰度范围 [a,b] 线形变换为图像 g(m,n),灰度范围[a’,b’]公式:g(m,n)=a’+(b’-a’)* f(m,n) /(b-a) figure subplot(2,2,1) imshow(I) J=imadjust(I,[0.3,0.7],[0,1],1); title(' 实验一(3)用g(m,n)=a’+(b’-a’)* f(m,n) /(b-a)进行变换 '); subplot(2,2,2) imshow(J) subplot(2,2,3) imshow(I) J=imadjust(I,[0.5 0.8],[0,1],1); subplot(2,2,4) imshow(J) (4) 图像二值化(选取一个域值,(5) 将图像变为黑白图像) figure subplot(2,2,1)

数字图像处理实验报告

数字图像处理实验报告

实验一数字图像处理编程基础 一、实验目的 1. 了解MA TLAB图像处理工具箱; 2. 掌握MA TLAB的基本应用方法; 3. 掌握MA TLAB图像存储/图像数据类型/图像类型; 4. 掌握图像文件的读/写/信息查询; 5. 掌握图像显示--显示多幅图像、4种图像类型的显示方法; 6. 编程实现图像类型间的转换。 二、实验内容 1. 实现对图像文件的读/写/信息查询,图像显示--显示多幅图像、4种图像类型的显示方法、图像类型间的转换。 2. 运行图像处理程序,并保存处理结果图像。 三、源代码 I=imread('cameraman.tif') imshow(I); subplot(221), title('图像1'); imwrite('cameraman.tif') M=imread('pout.tif') imview(M) subplot(222), imshow(M); title('图像2'); imread('pout.bmp') N=imread('eight.tif') imview(N) subplot(223), imshow(N); title('图像3'); V=imread('circuit.tif') imview(V) subplot(224), imshow(V); title('图像4');

N=imread('C:\Users\Administrator\Desktop\1.jpg') imshow(N); I=rgb2gary(GRB) [X.map]=gary2ind(N,2) RGB=ind2 rgb(X,map) [X.map]=gary2ind(I,2) I=ind2 gary(X,map) I=imread('C:\Users\dell\Desktop\111.jpg'); subplot(231),imshow(I); title('原图'); M=rgb2gray(I); subplot(232),imshow(M); [X,map]=gray2ind(M,100); subplot(233),imshow(X); RGB=ind2rgb(X,map); subplot(234),imshow(X); [X,map]=rbg2ind(I); subplot(235),imshow(X); 四、实验效果

数字图像处理实验

学院计算机与通信工程学院专业生物医学工程专业 班级51111 学号5111133 姓名杨静 指导教师贾朔 2014年04月21日

实验一图像的基本运算 一、实验目的: 1、掌握图像处理中的点运算、代数运算、逻辑运算和几何运算及应用。 2、掌握各种运算对于图像处理中的效果。 二、实验内容: 1、(1)选择一幅图像lena8.jpg,设置输入/输出变换的灰度级范围,a=0.2,b=0.6,c=0.1,d=0.9. (2)设置非线性扩展函数的参数c=2. (3)采用灰度级倒置变换函数s=255-r进行图像变换 (4)设置二值化图像的阈值,分别为level=0.4,level=0.7 解:参考程序如下: I=imread('C:\lena8.jpg'); figure; subplot(2,3,1); imshow(I); title('原图'); J=imadjust(I,[0.3;0.6],[0.1;0.9]); %设置灰度变换的范围 subplot(2,3,2); imshow(J); title('线性扩展'); I1=double(I); %将图像转换为double类型 I2=I1/255; %归一化此图像 C=2; K=C*log(1+I2); %求图像的对数变换 subplot(2,3,3); imshow(K); title('非线性扩展'); M=im2bw(I,0.5); M=~M; %M=255-I; %将此图像取反 %Figure subplot(2,3,4); imshow(M); title('灰度倒置'); N1=im2bw(I,0.4); %将此图像二值化,阈值为0.4 N2=im2bw(I,0.7); %将此图像二值化,阈值为0.7 subplot(2,3,5); imshow(N1); title('二值化阈值0.4'); subplot(2,3,6); imshow(N2); title('二值化阈值0.7');

数字图像处理实验报告

数字图像处理实验 报告 学生姓名:学号: 专业年级: 09级电子信息工程二班

实验一常用MATLAB图像处理命令 一、实验内容 1、读入一幅RGB图像,变换为灰度图像和二值图像,并在同一个窗口内分成三个子窗口来分别显示RGB图像和灰度图像,注上文字标题。 实验结果如右图: 代码如下: Subplot (1,3,1) i=imread('E:\数字图像处理\2.jpg') imshow(i) title('RGB') Subplot (1,3,2) j=rgb2gray(i) imshow(j) title('灰度') Subplot (1,3,3) k=im2bw(j,0.5) imshow(k) title('二值') 2、对两幅不同图像执行加、减、乘、除操作,在同一个窗口内分成五个子窗口来分别显示,注上文字标题。 实验结果如右图: 代码如下: Subplot (3,2,1) i=imread('E:\数字图像处理 \16.jpg') x=imresize(i,[250,320]) imshow(x) title('原图x') Subplot (3,2,2) j=imread(''E:\数字图像处理 \17.jpg') y=imresize(j,[250,320]) imshow(y) title('原图y') Subplot (3,2,3) z=imadd(x,y) imshow(z)

title('相加结果');Subplot (3,2,4);z=imsubtract(x,y);imshow(z);title('相减结果') Subplot (3,2,5);z=immultiply(x,y);imshow(z);title('相乘结果') Subplot (3,2,6);z=imdivide(x,y);imshow(z);title('相除结果') 3、对一幅图像进行灰度变化,实现图像变亮、变暗和负片效果,在同一个窗口内分成四个子窗口来分别显示,注上文字标题。 实验结果如右图: 代码如下: Subplot (2,2,1) i=imread('E:\数字图像处理 \23.jpg') imshow(i) title('原图') Subplot (2,2,2) J = imadjust(i,[],[],3); imshow(J) title('变暗') Subplot (2,2,3) J = imadjust(i,[],[],0.4) imshow(J) title('变亮') Subplot (2,2,4) J=255-i Imshow(J) title('变负') 二、实验总结 分析图像的代数运算结果,分别陈述图像的加、减、乘、除运算可能的应用领域。 解答:图像减运算与图像加运算的原理和用法类似,同样要求两幅图像X、Y的大小类型相同,但是图像减运算imsubtract()有可能导致结果中出现负数,此时系统将负数统一置为零,即为黑色。 乘运算实际上是对两幅原始图像X、Y对应的像素点进行点乘(X.*Y),将结果输出到矩阵Z中,若乘以一个常数,将改变图像的亮度:若常数值大于1,则乘运算后的图像将会变亮;叵常数值小于是,则图像将会会暗。可用来改变图像的灰度级,实现灰度级变换,也可以用来遮住图像的某些部分,其典型应用是用于获得掩膜图像。 除运算操作与乘运算操作互为逆运算,就是对两幅图像的对应像素点进行点(X./Y), imdivide()同样可以通过除以一个常数来改变原始图像的亮度,可用来改变图像的灰度级,其典型运用是比值图像处理。 加法运算的一个重要应用是对同一场景的多幅图像求平均值 减法运算常用于检测变化及运动的物体,图像相减运算又称为图像差分运算,差分运算还可以用于消除图像背景,用于混合图像的分离。

数字图像处理实验一(附源程序)

数字图像处理—实验一 一.实验内容: 图像灰度变换 二.实验目的: 学会用Matlab 软件对图像灰度进行变换;感受各种不同的灰度变换方法对最终图像效果的影响。 三.实验步骤: 1.获取实验用图像:rice.jpg. 使用imread 函数将图像读入Matlab 。 2.产生灰度变换函数T1,使得: 0.3r r < 0.35 s = 0.105 + 2.6333(r – 0.35) 0.35 ≤ r ≤ 0.65 1 + 0.3(r – 1) r > 0.65 用T1对原图像rice.jpg 进行处理,使用imwrite 函数保存处理后的新图像。 3.产生灰度变换函数T2,使得: s = 用T2对原图像rice.jpg 进行处理,使用imwrite 保存处理后的新图像。 4.分别用 s = r 0.6; s = r 0.4; s = r 0.3 对kids.tiff 图像进行处理。为简便起见,请 使用Matlab 中的imadjust 函数。使用imwrite 保存处理后的新图像。 5.对circuit.jpg 图像实施反变换(Negative Transformation )。s =1-r; 使用 imwrite 保存处理后的新图像。 6.对rice.jpg 图像实施灰度切片(Gray-level slicing )。具体要求如下: 当0.2 ≤ r ≤ 0.4时,将r 置为0.6, 当r 位于其他区间时, 保持其灰度与原图像一样。使用imwrite 保存处理后的新图像。 7.利用灰度变换对Picture.jpg 做增强处理,突出图中的人物,改善整个图像过 于灰暗的背景。通过调节参数,观察变换后的图像与原始图像的变化,寻找出最佳的灰度变换结果。写出所采用的拉伸表达式。(提示:用imhist 观察图像直方图,利用分段线性灰度变换。 )

数字图像处理实验程序MATLAB.

实验一 内容(一) (1)彩色图像变灰度图像 A=imread('1.jpg'); B=rgb2gray(A); figure subplot(1,2,1), imshow(A) title('原图') subplot(1,2,2), imshow(B) title('原图灰度图像') (2)彩色图像变索引图像 A=imread('1.jpg'); figure subplot(1,2,1), imshow(A) title('原图') [X,map]=rgb2ind(A,128); subplot(1,2,2), imshow(X,map) title('原图索引图像') (3)彩色图像变二值图像 A=imread('1.jpg'); figure subplot(1,2,1), imshow(A) title('原图') C=im2bw(A,0.2); subplot(1,2,2), imshow(C) title('原图二值图像') (4)灰度图像变索引图像(一) A=imread('1.jpg'); figure B=rgb2gray(A); subplot(1,2,1), imshow(B) title('灰度图像') C=grayslice(B,39); subplot(1,2,2), imshow(C) title('灰度变索引图像')

(5)灰度图像变索引图像(二) A=imread('1.jpg'); figure B=rgb2gray(A); subplot(1,2,1), imshow(B) title('灰度图像') [X,map]=gray2ind(B,63); subplot(1,2,2), imshow(X,map) title('灰度变索引图像') (6)灰度图像变彩色图像 A=imread('1.jpg'); figure B=rgb2gray(A); subplot(1,2,1), imshow(B) title('灰度图像') C=gray2rgb(B,map); subplot(1,2,2), imshow(C) title('灰度变彩色图像') 内容(二) (1)灰度平均值 A=imread('1.jpg'); figure B=rgb2gray(A); subplot(1,2,1), imshow(B) title('灰度图像') B=double(B); [m,n]=size(B); sumg=0.0; for i=1:m; for j=1:n; sumg=sumg+B(i,j); end end avg=sumg/(m*n) % 均值 maxg=max(max(B)) % 区域最大灰度ming=min(min(B)) % 区域最小灰度 (2)彩色平均值

数字图像处理实验一

实验一图像变换 一.实验目的 1.了解图像变换的意义和手段 2.熟悉离散傅里叶变换、离散余弦变换、离散小波变换的基本性质; 3.熟练掌握图像变换的方法及应用; 4.通过实验了解二维频谱的分布特点; 5.通过本实验掌握利用MATLAB编程实现数字图像的变换。 二.实验原理 1.应用各种离散变换进行图像处理 2.离散余弦变换(DCT)的定义 3. 离散小波变换定义 三.实验步骤 1.启动MATLAB程序;程序组中“work”文件夹中应有待处理的图像文件; 2.利用MatLab工具箱中的函数编制FFT频谱显示的函数; 3 .调入、显示“实验一”获得的图像; 4.对图像做FFT并利用自编的函数显示其频谱; 5.讨论不同的图像内容与FFT频谱之间的对应关系。 6.记录和整理实验报告。 四.实验程序与内容 clc; figure(1); load imdemos saturn2; title('原图像'); imshow(saturn2); figure(2); s=fftshift(fft2(saturn2)); imshow(log(abs(s)),[]); title('原图像傅立叶频谱'); figure(1); A=imread('liubh.jpg');

B=rgb2gray(A); imshow(B); title('原图像'); s=fftshift(fft2(B)); figure(2); imshow(log(abs(s)),[]); title('彩色图像的傅立叶频谱'); RGB=imread('liubh.jpg'); figure(1);

数字图像处理实验指导书-matlab实验其他

数字图像处理实验报告 一、 实验目的 1熟悉MATLAB 基本图像操作; 2结合实例学习如何在程序中增加图像处理算法; 3理解和掌握图像的线性变换和直方图均衡化的原理和应用; 4了解平滑处理的算法和用途,学习使用均值滤波、中值滤波和拉普拉斯锐化进行图像增强处理的程序设计方法; 5了解噪声模型及对图像添加噪声的基本方法。 二、 实验原理 1 灰度线性变换就是将图像中所有点的灰度按照线性灰度变换函数进行变换。 )],([),(y x f T y x g = ?? ? ??<≤+-<≤+-≤≤=255),(]),([),( ]),([),(0 ) ,(),(y x f b g b y x f b y x f a g a y x f a y x f y x f y x g b a γβα n y m x ,2,1 ,,,2,1== 2 直方图均衡化通过点运算将输入图像转换为在每一级上都有相等像素点数的输出图 像。按照图像概率密度函数PDF 的定义: 1,...,2,1,0 )(-== L k n n r p k k r 通过转换公式获得: 1,...,2,1,0 )()(0 -====∑∑ ==L k n n r p r T s k j k j j j r k k 3 均值(中值)滤波是指在图像上,对待处理的像素给定一个模板,该模板包括了其周围的临近像素。将模板中的全体像素的均值(中值)来代替原来像素值的方法。 4 拉普拉斯算子如下: ???? ??????--------111181111 拉普拉斯算子首先将自身与周围的8个像素相减,表示自身与周围像素的差异,再将 这个差异加上自身作为新像素的灰度。 三、 实验步骤 1 启动MA TLAB 程序,对图像文件分别进行灰度线性变换、直方图均衡化、均值滤波、中值滤波和拉普拉斯锐化操作;添加噪声,重复上述过程观察处理结果。 2 记录和整理实验报告

数字图像处理实验 实验八答案

1)A=imread('E:\数字图像处理\实验七\Fig_lenna_RGB.bmp'); A=im2double(A); [m,n,q]=size(A); R=A(:,:,1); G=A(:,:,2); B=A(:,:,3); H=zeros(m,n); for i1=1:m for i2=1:n num=0.5*(R(i1,i2)-G(i1,i2)+R(i1,i2)-B(i1,i2)); den=sqrt((R(i1,i2)-G(i1,i2))^2+(R(i1,i2)-B(i1,i2))*(G(i1,i2)-B(i1,i2))); theta=acos(num/den)*180/pi; if(B(i1,i2)<=G(i1,i2)) H(i1,i2)=theta; else H(i1,i2)=360-theta; end min1=min(R(i1,i2),G(i1,i2)); min1=min(B(i1,i2),min1); S(i1,i2)=1-3/(R(i1,i2)+G(i1,i2)+B(i1,i2))*min1; end end I=(R+G+B)/3; subplot(1,3,1),imshow(H),title('色度图H'); subplot(1,3,2),imshow(S),title('饱和图S'); subplot(1,3,3),imshow(I),title('强度图I');

2) A=imread('C:\Users\fengjue\Desktop\1.tif'); A=im2double(A); [m,n,q]=size(A); R=A(:,:,1); G=A(:,:,2); B=A(:,:,3); H=zeros(m,n); for i1=1:m for i2=1:n value1=I(i1,i2)*(1+S(i1,i2)*cos(H(i1,i2))/cos(pi/3-H(i1,i2)/180*pi)); value2=I(i1,i2)*(1-S(i1,i2)); switch(floor(H(i1,i2)/120)) case 0 im2(i1,i2,1)=value1; im2(i1,i2,2)=3*I(i1,i2)-R(i1,i2)-B(i1,i2); im2(i1,i2,3)=value2; case 1 H(i1,i2)=H(i1,i2)-120; im2(i1,i2,1)=value2; im2(i1,i2,2)=value1; im2(i1,i2,3)=3*I(i1,i2)-R(i1,i2)-G(i1,i2); case 2 H(i1,i2)=H(i1,i2)-240; im2(i1,i2,1)=value2; im2(i1,i2,2)=value1; im2(i1,i2,3)=3*I(i1,i2)-R(i1,i2)-G(i1,i2); end end end

数字图像处理实验代码

// RawToBmpDlg.cpp : 实现文件 // #include "stdafx.h" #include "RawToBmp.h" #include "RawToBmpDlg.h" #include "afxdialogex.h" #include "iostream" using namespace std; #ifdef _DEBUG #define new DEBUG_NEW #endif #define MAX 64 // 用于应用程序“关于”菜单项的CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: 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()

// CRawToBmpDlg 对话框 CRawToBmpDlg::CRawToBmpDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CRawToBmpDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CRawToBmpDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT_RAW, m_EditRaw); DDX_Control(pDX, IDC_EDIT_BMP, m_EditBmp); } BEGIN_MESSAGE_MAP(CRawToBmpDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(ID_CONVERT, &CRawToBmpDlg::OnBnClickedConvert) END_MESSAGE_MAP() // CRawToBmpDlg 消息处理程序 BOOL CRawToBmpDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid;

数字图像处理实验报告——图像分割实验

实验报告 课程名称数字图像处理导论专业班级 ____________________ 姓名 _______________________ 学号 _______________________ 电气与信息学院 和谐勤奋求是创新

实验题目图像分割实验 实验室DSP室&信号室实验时间 实验类别设计同组人数 2 成绩指导教师签字: .实验目的 1. 理解图像分割的基本概念; 2. 理解图像边缘提取的基本概念; 3. 掌握进行边缘提取的基本方法; 4. 掌握用阈值法进行图像分割的基本方法。 .实验内容 1. 分别用RobertS,Sobel和拉普拉斯高斯算子对图像进行边缘检测。比较三种算子处理的不同之处; 2. 设计一个检测图1中边缘的程序,要求结果类似图2 ,并附原理说明。 3. 任选一种阈值法进行图像分割. 三.实验具体实现 1. 分别用RObertS,Sobel 处; 和拉普拉斯高斯算子对图像进行边缘检测。比较三种算子处理的不同之l=imread('mri.tif); imshow(l) BW1=edge(I,'roberts'); figure ,imshow(BW1),title(' BW2=edge(l,'sobel'); figure,imshow(BW2),title(' BW3=edge(l,'log'); figure,imshow(BW3),title(' 用RObertS算子') 用Sobel算子') 用拉普拉斯高斯算子') 图1

比较提取边缘的效果可以看出, sober 算子是一种微分算子,对边缘的定位较精确,但是会漏 去一些边缘细节。而 LaPIaCia n-GaUSSia n 算子是一种二阶边缘检测方法,它通过寻找图象灰度值中 二阶过零点来检测边缘并将边缘提取出来,边缘的细节比较丰富。通过比较可以看出 LaPIaCian-Gaussian 算子比sober 算子边缘更完整,效果更好。 2. 设计一个检测图1中边缘的程序,要求结果类似图 2 , 并附原理说明。 i=imread('m83.tif); SUbPlot(1,2,1); imhist(i); title(' 原始图像直方图'); thread=130∕255; subplot(1,2,2);

数字图像处理实验报告(全部)

数 字 图 像 处 理 实 验班级:05611002 报学号:1120101383告姓名:张欣 数字图像的运算1.1 直方图

一.实验目的 1.熟悉matlab图像处理工具箱及直方图函数的使用; 2.理解和掌握直方图原理和方法; 二.实验设备:1.PC机一台;2.软件matlab。 三.程序设计 在matlab环境中,程序首先读取图像,然后调用直方图函数,设置相关参数,再输出处理后的图像。 I=imread('cameraman.tif');%读取图像 subplot(1,2,1),imshow(I) %输出图像 title('原始图像') %在原始图像中加标题 subplot(1,2,2),imhist(I) %输出原图直方图 title('原始图像直方图') %在原图直方图上加标题 四.实验步骤 1. 启动matlab双击桌面matlab图标启动matlab环境; 2. 在matlab命令窗口中输入相应程序。书写程序时,首先读取图像,一般调用matlab自 带的图像,如:cameraman图像;再调用相应的直方图函数,设置参数;最后输出处理后的图像; 3.浏览源程序并理解含义; 4.运行,观察显示结果; 5.结束运行,退出; 五.实验结果:观察图像matlab环境下的直方图分布。 (a)原始图像 (b)原始图像直方图 六.实验报告要求 1、给出实验原理过程及实现代码: I=imread('coins.png');%读取图像 subplot(1,2,1),imshow(I) %输出图像 title('原始图像') %在原始图像中加标题 subplot(1,2,2),imhist(I) %输出原图直方图 title('原始图像直方图') %在原图直方图上加标题 2、输入一幅灰度图像,给出其灰度直方图结果,并进行灰度直方图分布原理分析。

数字图像处理MATLAB程序【完整版】

第一部分数字图像处理

实验一图像的点运算 实验1.1直方图 一.实验目的 1 ?熟悉matlab图像处理工具箱及直方图函数的使用; 2?理解和掌握直方图原理和方法; 二.实验设备 1. PC 机一台; 2.软件matlab。 三.程序设计 在matlab环境中,程序首先读取图像,然后调用直方图函数,设置相关参数,再输出处理后的图像。l=imread('camerama n.tif);% 读取图像 subplot(1,2,1),imshow(l) % 输出图像 title(' 原始图像')% 在原始图像中加标题subplot(1,2,2),imhist(l) % 输出原图直方图 title(' 原始图像直方图')%在原图直方图上加标题 四.实验步骤 1. 启动matlab 双击桌面matlab图标启动matlab 环境; 2. 在matlab命令窗口中输入相应程序。书写程序时,首先读取图像,一般调用matlab自带的图像, 如:cameraman图像;再调用相应的直方图函数,设置参数;最后输出处理后的图像; 3?浏览源程序并理解含义; 4. 运行,观察显示结果; 5. 结束运行,退出; 五.实验结果 观察图像matlab环境下的直方图分布。 (a)原始图像(b) 原始图像直方图 六.实验报告要求 1、给出实验原理过程及实现代码; 2、输入一幅灰度图像,给出其灰度直方图结果,并进行灰度直方图分布原理分析。

实验1.2灰度均衡 一.实验目的 1 .熟悉matlab图像处理工具箱中灰度均衡函数的使用; 2?理解和掌握灰度均衡原理和实现方法; 二.实验设备 1. PC机一台; 2. 软件matlab ; 三.程序设计 在matlab环境中,程序首先读取图像,然后调用灰度均衡函数,设置相关参数,再输出处理后的图像。l=imread('camerama n.tif);% 读取图像 subplot(2,2,1),imshow(l) % 输出图像title(' 原始图像')% 在原始图像中加标题subplot(2,2,3),imhist(l) % 输出原图直方图 title(' 原始图像直方图')%在原图直方图上加标题a=histeq(l,256); % 直方图均衡化,灰度级为256 subplot(2,2,2),imshow(a) % 输出均衡化后图像title(' 均衡化后图像')%在均衡化后图像中加标题 subplot(2,2,4),imhist(a) % 输出均衡化后直方图 title(' 均衡化后图像直方图')%在均衡化后直方图上加标题 四.实验步骤 1. 启动matlab 双击桌面matlab图标启动matlab 环境; 2. 在matlab命令窗口中输入相应程序。书写程序时,首先读取图像,一般调用matlab自带的图像, 如:cameraman图像;再调用相应的灰度均衡函数,设置参数;最后输出处理后的图像; 3?浏览源程序并理解含义; 4. 运行,观察显示结果; 5. 结束运行,退出; 五.实验结果 观察matlab环境下图像灰度均衡结果及直方图分布。 均衡化后图像

数字图像处理实验

数字图像处理实验指导书 电气信息综合实验中心

(一)MATLAB在图像处理中的应用 原理:MATLAB 语言是由美国MathWorks 公司推出的计算机软件,现已成为国际公认的最优秀的科学计算与数学应用软件之一,它集数值分析、矩阵运算、信号处理和图形显示于一体,构成了一个方便的、界面友好的用户环境,而且还具有可扩展性特征。MathWorks 公司针对不同领域的应用,推出了信号处理、控制系统、神经网络、图像处理、小波分析、鲁棒控制、非线性系统控制设计、系统辨识、优化设计、统计分析、财政金融、样条、通信等30 多个具有专门功能的工具箱,这些工具箱是由该领域内的学术水平较高的专家编写的,无需用户自己编写所用的专业基础程序,可直接对工具箱进行运用。同时,工具箱内的函数源程序也是开放性的,多为M 进行文件,用户可以查看这些文件的代码并进行更改,MALAB 支持用户对其函数二次开发,用户的应用程序也可以作为新的函数添加到相应的工具箱中。MATLAB中的数字图像是以矩阵形式表示的,这意味着MATLAB 强大的矩阵运算能力用于图像处理非常有利,矩阵运算的语法对MATLAB 中的数字图像同样适用。 数字图像处理工具箱函数包括以下15 类:、⑴、图像显示函数;⑵、图像文件输入、输出函数;⑶、图像几何操作函数;⑷、图像像素值及统计函数;⑸、图像分析函数;⑹、图像增强函数;⑺、线性滤波函数;⑻、二维线性滤波器设计函数;⑼、图像变换函数;⑽、图像邻域及块操作函数;⑾、二值图像操作函数;⑿、基于区域的图像处理函数;⒀、颜色图操作函数;⒁、颜色空间转换函数;⒂、图像类型和类型转换函数。MATLAB 图像处理工具箱支持四种图像类型,分别为真彩色图像、索引色图像、灰度图像、二值图像,由于有的函数对图像类型有限制,这四种类型可以用工具箱的类型转换函数相互转换。MATLAB 可操作的图像文件包括BMP、HDF、JPEG、PCX、TIFF、XWD 等格式。 实验内容:MATLAB操作基础 包括MATLAB的安装及界面使用。 参考资料:

数字图像处理实验一二

实验一数字图像的基本处理 预习要求: 1、熟悉MATLAB的使用环境; 2、熟悉数字图像的矩阵表示形式; 3、掌握二维离散傅里叶变换。 一、实验目的 掌握MATLAB中数字图像的存储、读取和显示 掌握MATLAB中的基本数据、图像类型,以及类型之间的相互转换 掌握二维离散傅里叶变换的常用函数 二、实验原理 1、MATLAB中数字图像的存储、读取和显示 读取图像通过imread来执行,语法为: f=imread(‘filename’); 其中,filename参数表示输入的文件名,包括路径和文件名,函数返回值f是一个图像数组。MATLAB支持的图像类型有TIFF、JPEG、GIF、BMP、PNG和XWD等。 保存图像使用函数imwrite来执行,语法有以下几种: imwrite(f, ’filename’); %默认方式,文件格式由后缀名来指定 imwrite(f, ’filename’, ’tif’); %由第三个参数指定保存文件的格式 imwrite(f, ‘filename.jpg’ , ‘quality’, q); %保存JPEG文件,指定JPEG的压缩质量显示图像使用imshow来执行,基本语法为: imshow(f, G); %f是图像数组,G是该图像显示的灰度级数,默认灰度级数256 imshow(f, [low high]); %所有大于high的显示为白色,小于low的显示为黑色 imshow(f, [ ]); %low设置为f的最小值,high设置为f的最大值当用imshow显示另一幅图像g时,MATLAB会在屏幕上用新图替换旧图像,为保持第一幅图像同事显示第二幅图像,可以使用figure函数:figure, imshow( g ) 2、MATLAB中的数据类型级相互转换 MATLAB中常用的数据类型有:double, uint8, uint16, uint32, int8, int16, int32, single, char, logical等。支持的图像类型有亮度图像、二值图像、索引图像和RGB图像。 表1 常用的图像格式 格式名称描述可识别的扩展符 TIFF 加标识的图像文件格式.tif, .tiff JPEG 联合图像专家组.jpg, .jpeg GIF 图形交换格式.gif BMP Windows位图.bmp PNG 可移植的网络图形.png 常用的图像类型转换函数: g=im2uint8(f); %图像转换到uint8类型 g=im2gray(f, [ fmin, fmax ]); %图像转换到double类型,值在[0,1]区间,规定fmin,fmax 是为了在转换时将f中小于fmin的值在g中转换为0,大于fmax的值转换为1。图像的

相关文档
相关文档 最新文档