数字图像处理课设报告
- 格式:docx
- 大小:4.31 MB
- 文档页数:19
《数字图像处理》课程设计报告——手写阿拉伯数字的识别1、课程设计目的1)、提高分析问题、解决问题的能力,进一步巩固数字图像处理系统中的基本原理与方法。
2)、掌握文献检索的方法与技巧。
3)、熟悉掌握一门计算机语言,可以进行数字图像的应用处理的开发设计。
2、方法综述字符识别处理的信息可分为两大类:一类是文字信息,处理的主要是用各国家、各民族的文字(如:汉字,英文等)书写或印刷的文本信息,目前在印刷体和联机手写方面技术已趋向成熟,并推出了很多应用系统;另一类是数据信息,主要是由阿拉伯数字及少量特殊符号组成的各种编号和统计数据,如:邮政编码、统计报表、财务报表、银行票据等等,处理这类信息的核心技术是手写数字识别。
本次实验是对手写的阿拉伯数字进行识别,主要步骤包括预处理模块(其中用到图像分割方法),特征提取和利用人工神经网络(具体运用BP 神经网络方法)进行数字的识别。
2.1图像分割:图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。
它是由图像处理到图像分析的关键步骤。
现有的图像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。
2.1.1基于阈值的分割方法灰度阈值分割[1]法是一种最常用的并行区域技术,它是图像分割中应用数量最多的一类。
阈值分割方法实际上是输入图像f到输出图像g的如下变换:其中,T为阈值,对于物体的图像元素g(i,j)=l,对于背景的图像元素g(i,j)=0。
由此可见,阈值分割算法的关键是确定阈值,如果能确定一个合适的阈值就可准确地将图像分割开来。
阈值确定后,将阈值与像素点的灰度值比较和像素分割可对各像素并行地进行,分割的结果直接给出图像区域。
阈值分割的优点是计算简单、运算效率较高、速度快。
在重视运算效率的应用场合(如用于硬件实现),它得到了广泛应用。
人们发展了各种各样的阈值处理技术,包括全局阈值、自适应阈值、最佳阈值等等。
数字图像处理实验指导书学院:通信与电子工程学院专业:电子信息工程班级:学号:姓名: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)(1) 亮度图像一幅亮度图像是一个数据矩阵,其归一化的取值表示亮度。
若亮度图像的像素都是uint8类或uint16类,则它们的整数值范围分别是[0,255]和[0,65536]。
若图像是double类,则像素取值就是浮点数。
1. 课程设计目的1、提高分析问题、解决问题的能力,进一步巩固数字图像处理系统中的基本原理与方法。
2、熟悉掌握一门计算机语言,可以进行数字图像的应用处理的开发设计。
2.课程设计内容及实现2.1、网页安全色(Web-Safe Colors)为了完成这项工作,必须找到一个合适的程序,这个程序可以把指定的JPG图像生成RGB元素的图像。
例如,MATLAB的图像处理工具箱可以实现这一点,但你也可以使用图像编辑程序像Adobe的Photo-Shop或Corel的Photo-Paint。
为了实现把图像转换为RGB 这一目标,也可以手动修改。
(a)编写计算机程序,把任意的RGB彩色图像转换到Web安全的RGB图像(Web安全颜色定义见图6.10)。
(b)下载图像图6.8,转换为网络安全色的RGB彩色图像。
图6.8是JPG格式,所以结果返回也为JPG(请看本项目的开始注释)。
解释你的结果和图6.8之间的差异。
2.1.1程序清单:I=imread('Fig6.08.jpg');subplot(121);imshow(I);title('原图');I1=fix((I/51)*51);subplot(122);imshow(I1);title('web-safe colors');2.1.2运行结果如图1图1 网页安全色结果分析:结果图出现明显的方格,每个方格就是一个网页安全色,方格内的颜色一致。
原图则是普通的RGB,假使在原图的相同区域划分出和结果图相对应的方格,则此方格里的颜色是一个渐变的颜色,并非同一种颜色。
2.2、伪彩色图像处理(Pseudo-Color Image Processing )(a)实现图6.23的特性,你可以为输入图像指定两个范围的灰度值,然后你的程序将输出的RGB图像,它的像素有一个指定的颜色,对应于输入图像的一个范围的灰度级,RGB 图像中剩余的像素具有和输入图像相同的灰度。
电子科技大学数字图像处理课程设计课题名称数字图像处理院(系)通信与信息工程学院专业通信工程姓名学号起讫日期指导教师2015年12月15日目录摘要: (03)课题一:图像的灰度级分辨率调整 (04)课题二:噪声的叠加与频域低通滤波器应用 (06)课题三:顶帽变换在图像阴影校正方面的应用 (13)课题四:利用Hough变换检测图像中的直线 (15)课题五:图像的阈值分割操作及区域属性 (20)课题六:基于MATLAB®的GUI程序设计 (23)结束语: (36)参考文献: (37)基于MATLAB®的数字图像处理课题设计摘要本文首先对数字图像处理的相关定义、概念、算法与常用变换进行了介绍;并通过七个课题实例,借助MATLAB®的图像处理工具箱(Computer Vision System Toolbox)对这些案例逐一实现,包括图像的灰度值调整、图像噪声的叠加、频域低通滤波器、阈值分割、Hough变换等,常用的图像变化与处理;然后通过MATLAB®的GUI程序设计,对部分功能进行模块化整合,设计出了数字图像处理的简易软件;最后给出了软件的帮助文件以及该简易程序的系统结构和m代码。
关键词:灰度值调整噪声图像变换MATLAB® GUI设计课题一:图像的灰度级分辨率调整设计要求:128,64,32,16,8,4,2,并在同一个figure窗口将图像的灰度级分辨率调整至{}上将它们显示出来。
设计思路:灰度级分辨率又称色阶,是指图像中可分辨的灰度级的数目,它与存储灰度级别所使用的数据类型有关。
由于灰度级度量的是投射到传感器上的光辐射值的强度,所以灰度级分辨率又称为辐射计量分辨率。
随着图像灰度级分辨率的的逐渐降低,图像中所包含的颜色数目将变得越来越少,从而在颜色维度造成图像信息量的退化。
MATLAB®提供了histeq函数用于图像灰度值的改变,调用格式如下:J = histeq(I,n)其中J为变换后的图像,I为输入图像,n为变换的灰度值。
《数字图像处理》课程建设汇报杨淑莹(教授、博士)天津理工大学计算机与通信工程学院课程简介数字图像处理是计算机、通信、信息、控制等相关专业的核心课,同时也是绝大部分专业的选修课。
是信息科学中发展最快的热点研究方向。
图像处理技术已渗透到计算机、通信、交通运输、医学、军事等多个领域,与人们的生活紧密相关。
培养目标培养具有系统、扎实的图像处理理论基础;在图像信息的处理及应用等方面具有较深的专业知识、较强的应用能力和实践动手能力;良好的编程素质;培养创新精神;能够从事数字图像处理工作的应用型高级专门人才。
《数字图像处理》课程是高等学校计算机技术类在本科教学计划中一门重要的专业课程。
人类从外界获得的信息约有75%是从图像中获得的。
随着现代电子、计算机、软件等技术的高速发展,图像处理技术的应用领域越来越广泛,对推动社会发展、改善人们的生活起到了重要的作用。
《数字图像处理》课程起点高、难度大,理论性和实践性很强。
传统教学以理论介绍为主,强调理论的体系和概念,忽视理论的实现步骤,基本的编程代码。
造成学生在学习时,感到理论概念抽象,理解仅限于表面认识,很难看到理论的实际应用效果。
面临实际问题时,学生往往不知所措,不知从何下手,更谈不上创新应用。
《数字图像处理》课程教学要求所授内容离不开计算机编程实现。
不能单纯以理论介绍为主,忽视理论的实现步骤,编程代码。
要让学生看到理论的实际应用效果。
课堂上不能只介绍理论,使学生理论与实际相脱离,在实践中无从下手。
课堂上也不能花大量的时间讲解复杂的程序。
20世纪90年代,大多高校采用翻译的国外教材进行纯理论教学。
随着计算机技术的发展,翻译教材内容苦涩难懂,理论与实际相脱节,与理论技术快速发展的矛盾更加突出。
虽然这门课程在教学模式上和教材方面都处于不断完善与发展的阶段,但总体形式上还存在以下二个问题:大部分教学偏于理论,少于实践方法的介绍。
学习者往往会被苦涩难懂的理论迷惑,见不到理论的效果,不利于对理论体系的快速掌握。
1.课程设计目的1、提高分析问题、解决问题的能力,进一步巩固数字图像处理系统中的基本原理与方法。
2、熟悉掌握一门计算机语言,可以进行数字图像的应用处理的开发设计。
2.课程设计内容及实现、二维快速傅立叶变换:本项目的重点是:这个项目的目的是开发一个2-D FFT程序“包”,将用于在其他几个项目。
您的实现必须有能力:(a)乘以(-1),x + y的中心变换输入图像进行滤波。
(b) 一个真正的函数相乘所得到的(复杂的)的阵列(在这个意义上的实系数乘以变换的实部和虚部)。
回想一下,对相应的元件上完成两幅图像的乘法。
(c) 计算傅立叶逆变换。
(d) 结果乘以(-1)x + y的实部。
(e) 计算频谱。
基本上,这个项目实现了图。
如果您正在使用MATLAB,那么您的傅立叶变换程序将不会受到限制,其大小是2的整数次幂的图像。
如果要实现自己的计划,那么您所使用的FFT 例程可能被限制到2的整数次幂。
在这种情况下,你可能需要放大或缩小图像到适当的大小,使用你的程序开发项目02-04逼近:为了简化这个和以下的工程(除项目04-05),您可以忽略图像填充(4.6.3节)。
虽然你的结果不会完全正确,将获得显着的简化,不仅在图像的大小,而且在需要裁剪的最终结果。
由这种近似的原则将不会受到影响结果如下:主要代码f=imread('(a).jpg');H=imread('(a).jpg');subplot(3,2,1);imshow(f);title('(a)原图像');[M1,N1]=size(f);f=im2double(f);[M2,N2]=size(H);H=im2double(H); %把灰度图像I1的数据类型转换成转换成双精度浮点类型for x=1:M1for y=1:N1f(x,y)=(-1)^(x+y)*f(x,y); %用(-1)^(x+y)乘以输入图像,来实现中心化变换endendF=fft2(f); %使用函数fft2可计算傅立叶变换subplot(3,2,3);imshow(F);title('(b)傅立叶变换的图像');if(M2==1)&&(N2==1)G=F(x,y)*H(x,y);elseif((M1==M2)&&(N1==N2))for x=1:M1for y=1:N1G(x,y)=F(x,y)*H(x,y);endendelseerror('输入图像有误','ERROR');end %通过两个图像的乘法程序,实现对相应元素的相乘g=ifft2(G);subplot(3,2,4);imshow(g);title('(c)傅立叶逆变换的图像');for x=1:M1for y=1:N1g(x,y)=(-1)^(x+y)*g(x,y);endendg=real(g);S=log(1+abs(F)); %计算傅立叶幅度谱并做对数变换subplot(3,2,5);plot(S); %二维图像显示幅度谱title('(d)二维图像显示幅度谱');Q=angle(F); %计算傅立叶变换相位谱subplot(3,2,6);plot(Q);title('(e)二维图像显示相位谱'); %二维图像显示相位谱结果截图图1 傅里叶变换及频谱图结果分析:图1中(a)是原始灰度图像,对原图进行傅里叶变换,用(-1)^(x+y)乘以输入图像,来实现中心化变换得到(b),(c)为傅里叶变换的逆变换得到的图像。
一.课程题目:Photoshop + 直方图均衡化二.设计目的:数字图像处理课程设计是在完成数字图像处理的相关理论的学习后,进行的综合性训练课程,其目的主要包括:1、使学生进一步巩固数字图像处理的基本概念、理论、分析方法和实现方法;2、增强学生应用VC++编写数字图像处理的应用程序及分析、解决实际问题的能力;3、尝试将所学的内容解决实际工程问题,培养学生的工程实践能力,提高工科学生的就业能力三.设计内容:( 备注:该课程设计是基于之前数字图像处理实验,其中新加入的功能涉及到之前的基础,需要调用其处理函数,故保留其实验功能并进行扩展。
设计中涉及的一些知识已经在实验时介绍过,此处只对新加入功能进行分析)打开图像—打开一幅BMP格式的图像,若打开的不是该格式,提示错误。
代码略;图像平滑—主要用来修饰边缘过于清晰,或者对比度过于强烈的图像,通过取平均值减少相邻像素间的差异,从而产生平滑的过渡效果。
作用:削弱相邻像素间颜色的差异,达到柔化图像的效果。
代码略;图像锐化—主要用来通过增强相邻像素间的对比度,使图像具有明显的轮廓,并变得更加清晰。
效果与“图像平滑”的效果正好相反。
代码略;底片化---底片上的颜色与色彩鲜艳的照片的颜色是正好相反的,即反色。
代码略;二值化—主要是用来将整幅图像呈现出明显的黑白效果。
代码略;垂直翻转垂直翻转是指把定义好的图像区域上下翻转地显示在屏幕上。
器方法是保持每行像素信息不变,改变行的顺序,将第一行的像素与倒数第一行的像素进行互换,第二行的与倒数第二行的互换……依次类推,从而实现图像的垂直翻转。
具体算法如下:for(i=0;i<nh/2;i++)for(j=0;j<nw;j++){temp=m_dib.m_pdata[i*nh+j];m_dib.m_pdata[i*nh+j]=m_dib.m_pdata[j+(nh-i-1)*nw];m_dib.m_pdata[j+(nh-i-1)*nw]=temp;}垂直翻转的效果图如下:水平镜像水平翻转是指将图像左右翻转地显示在屏幕上。
数字图像处理课程设计报告姓名:学号:班级: .net设计题目:图像处理教师:赵哲老师提交日期: 12月29日一、设计内容:主题:《图像处理》详细说明:对图像进行处理(简单滤镜,模糊,锐化,高斯模糊等),对图像进行处理(上下对称,左右对称,单双色显示,亮暗程度调整等),对图像进行特效处理(反色,实色混合,色彩平衡,浮雕效果,素描效果,雾化效果等),二、涉及知识内容:1、二值化2、各种滤波3、算法等三、设计流程图四、实例分析及截图效果:运行效果截图:第一步:读取原图,并显示close all;clear;clc;% 清楚工作窗口clc 清空变量clear 关闭打开的窗口close allI=imread('1.jpg');% 插入图片1.jpg 赋给Iimshow(I);% 输出图II1=rgb2gray(I);%图片变灰度图figure%新建窗口subplot(321);% 3行2列第一幅图imhist(I1);%输出图片title('原图直方图');%图片名称一,图像处理模糊H=fspecial('motion',40);%% 滤波算子模糊程度40 motion运动q=imfilter(I,H,'replicate');%imfilter实现线性空间滤波函数,I图经过H滤波处理,replicate反复复制q1=rgb2gray(q);imhist(q1);title('模糊图直方图');二,图像处理锐化H=fspecial('unsharp');%锐化滤波算子,unsharp不清晰的qq=imfilter(I,H,'replicate');qq1=rgb2gray(qq);imhist(qq1);title('锐化图直方图');三,图像处理浮雕(来源网络)%浮雕图l=imread('1.jpg');f0=rgb2gray(l);%变灰度图f1=imnoise(f0,'speckle',0.01);%高斯噪声加入密度为0.01的高斯乘性噪声 imnoise噪声污染图像函数 speckle斑点f1=im2double(f1);%把图像数据类型转换为双精度浮点类型h3=1/9.*[1 1 1;1 1 1;1 1 1];%采用h3对图像f2进行卷积滤波f4=conv2(f1,h3,'same');%进行sobel滤波h2=fspecial('sobel');g3=filter2(h2,f1,'same');%卷积和多项式相乘 same相同的k=mat2gray(g3);% 实现图像矩阵的归一化操作四,图像处理素描(来源网络)f=imread('1.jpg');[VG,A,PPG] = colorgrad(f);ppg = im2uint8(PPG);ppgf = 255 - ppg;[M,N] = size(ppgf);T=200;ppgf1 = zeros(M,N);for ii = 1:Mfor jj = 1:Nif ppgf(ii,jj)<Tppgf1(ii,jj)=0;elseppgf1(ii,jj)=235/(255-T)*(ppgf(ii,jj)-T);endendendppgf1 = uint8(ppgf1);H=fspecial('unsharp');Motionblur=imfilter(ppgf1,H,'replicate');figure;imshow(ppgf1);调用function [VG, A, PPG] = colorgrad(f, T)if (ndims(f)~=3) || (size(f,3)~=3)error('Input image must be RGB');endsh = fspecial('sobel');sv = sh';Rx = imfilter(double(f(:,:,1)), sh, 'replicate');Ry = imfilter(double(f(:,:,1)), sv, 'replicate');Gx = imfilter(double(f(:,:,2)), sh, 'replicate');Gy = imfilter(double(f(:,:,2)), sv, 'replicate');Bx = imfilter(double(f(:,:,3)), sh, 'replicate');By = imfilter(double(f(:,:,3)), sv, 'replicate');gxx = Rx.^2 + Gx.^2 + Bx.^2;gyy = Ry.^2 + Gy.^2 + By.^2;gxy = Rx.*Ry + Gx.*Gy + Bx.*By;A = 0.5*(atan(2*gxy./(gxx-gyy+eps)));G1 = 0.5*((gxx+gyy) + (gxx-gyy).*cos(2*A) + 2*gxy.*sin(2*A));A = A + pi/2;G2 = 0.5*((gxx+gyy) + (gxx-gyy).*cos(2*A) + 2*gxy.*sin(2*A)); G1 = G1.^0.5;G2 = G2.^0.5;VG = mat2gray(max(G1, G2));RG = sqrt(Rx.^2 + Ry.^2);GG = sqrt(Gx.^2 + Gy.^2);BG = sqrt(Bx.^2 + By.^2);PPG = mat2gray(RG + GG + BG);if nargin ==2VG = (VG>T).*VG;PPG = (PPG>T).*PPG;endf1=rgb2gray(f);imhist(f1);title('素描图直方图');五,图像处理实色混合(来源网络)%实色混合I(I<=127)=0; %对像素进行处理,若值小于等于127,置0 I(I>127)=255; %对像素进行处理,若值大于127,置255 imshow(I);title('像素图');I1=rgb2gray(f);imhist(I1);title('像素图直方图');六,图像处理反色图f=imread('1.jpg');q=255-q;imshow(q);title('反色图');imhist(q1);title('反色图直方图');七,图像处理上下对称A=imread('1.jpg');B=A;[a,b,c]=size(A);a1=floor(a/2); b1=floor(b/2); c1=floor(c/2);B(1:a1,1:b,1:c)=A(a:-1:a-a1+1,1:b,1:c);figureimshow(B)title('上下对称');A=rgb2gray(A);figureimhist(A)title('上下对称直方图');八,图像处理类左右对称C=imread('1.jpg');A=C;C(1:a,1:b1,1:c)=A(1:a,b:-1:b+1-b1,1:c);figureimshow(C)title('左右对称');A=rgb2gray(A);figureimhist(A);title('左右对称直方图');九,图像处理单双色显示a=imread('1.jpg');a1=a(:,:,1);a2=a(:,:,2); a3=a(:,:,3);aa=rgb2gray(a);a4=cat(3,a1,aa,aa); a5=cat(3,a1,a2,aa);figuresubplot(121);imshow(a4);title('单色显示');subplot(122);imshow(a5);title('双色显示');a4=rgb2gray(a4);a5=rgb2gray(a5);figuresubplot(121);imhist(a4);title('单色显示直方图');subplot(122);imhist(a5);title('双色显示直方图');十,图像处理亮暗度调整a=imread('1.jpg');a1=0.8*a;figuresubplot(121);imshow(a1);title('暗图');subplot(122);imshow(a2);title('亮图')q3=rgb2gray(a1);q4=rgb2gray(a2);figuresubplot(121);mhist(q3);title('暗图直方图') subplot(122);imhist(q4);title('亮图直方图')十一,图像处理雾化处理q=imread('1.jpg');m=size(q,1);n=size(q,2);r=q(:,:,1);g=q(:,:,2);b=q(:,:,3);for i=2:m-10for j=2:n-10k=rand(1)*10;%产生一个随机数作为半径di=i+round(mod(k,33));%得到随机横坐标dj=j+round(mod(k,33));%得到随机纵坐标r(i,j)=r(di,dj);%将原像素点用随机像素点代替 g(i,j)=g(di,dj);b(i,j)=b(di,dj);endenda(:,:,1)=r;a(:,:,2)=g;a(:,:,3)=b;imshow(a)title('雾化处理图');q=rgb2gray(a);figureimhist(q);title('雾化处理图直方图');十二,图像处理高斯滤波I = imread('1.jpg');G =fspecial('gaussian', [5 5], 2);% fspecial生成一个高斯滤波器Ig =imfilter(I,G,'same');%imfilter使用该滤波器处理图片imshow(Ig);title('高斯滤波');I1=rgb2gray(Ig);imhist(I1);title('高斯滤波直方图');十三,图像处理色彩平衡(来自网络)im=imread('1.jpg');im2=im;%存储元图像im1=rgb2ycbcr(im);%将im RGB图像转换为YCbCr空间。
《数字图像处理》课程设计报告( 2011 - 2012学年第 2 学期)专业班级:遥感09-02班姓名:董朝朝学号:310905060206指导老师:刘春国---------------------------------------------- 实习成绩:教师评语:教师签名:年月日实验项目:均值滤波一、实验内容1.位图文件读取、显示和存储,通过自己搭建一个Visual C++应用工程的基本流程,创建了一个基于MFC的Visual C++数字图像处理平台,实现了位图文件的读写、显示、存储操作。
2.均值滤波算法的原理:均值滤波采用的主要方法为领域平均法。
基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度个g(x,y),即个g(x,y)=1/m ∑f(x,y) m为该模板中包含当前像素在内的像素总个数。
我的具体做法:我用的是3*3的模板。
先把3*3的模板覆盖从开始的区域,然后在在其覆盖的区域中算出平均值。
在把算出来的平均值填写到中间的处理的像素上。
以此类推一步步的处理其他像素。
注明:在边缘化的像素没有做处理。
二、算法实现的主要内容1.打开消息函数代码:CString strFileName;static char szFilter[]="BMP文件(*.bmp)|*.bmp||";CFileDialog dlg(TRUE, "bmp", NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);if(dlg.DoModal()!=IDOK) return;strFileName=dlg.GetPathName();(this->GetDocument())->SetTitle(strFileName);if(!dib.LoadBmpFile(strFileName,m_pBitmap,m_dwHeight,m_dwWidth,m_flag))return;Invalidate(true);显示图像代码:RECT rectDoc;GetClientRect(&rectDoc);CSize pageSize(rectDoc.right, rectDoc.bottom);CSize lineSize(100,1);CSize docSize(0,0);RECT rect;GetClientRect(&rect);BYTE *pImageDisp = NULL;BITMAPINFO *pBmpInfo = NULL;//设置在指定设备内容中(显卡内存)的拉伸模式pDC->SetStretchBltMode(COLORONCOLOR);if(m_pBitmap){dib.TransToBmp(m_dwHeight, m_dwWidth, m_pBitmap, pImageDisp, m_flag);dib.CreateBITMAPINFO(pBmpInfo, m_dwHeight, m_dwWidth, m_flag);//拷贝内存数据到显示器StretchDIBits(pDC->GetSafeHdc(),rect.left, rect.top,m_dwWidth, m_dwHeight,0,0,m_dwWidth, m_dwHeight,pImageDisp,pBmpInfo,DIB_RGB_COLORS,SRCCOPY);docSize.cx = rectDoc.left + m_dwWidth;docSize.cy = rectDoc.top + m_dwHeight;}SetScrollSizes(MM_TEXT,docSize,pageSize,lineSize);if(pImageDisp) delete pImageDisp;if(pBmpInfo) delete pBmpInfo;保存函数代码:CString strFileName;static char szFilter[] = "BMP文件(*.bmp)|*.bmp||";CFileDialog dlg(false, "bmp", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);if(dlg.DoModal() != IDOK) return;strFileName = dlg.GetPathName();if(!dib.WriteBmpFile(strFileName, m_pBitmap, m_dwHeight, m_dwWidth, m_flag)) return;均值滤波主要代码:void CMy123View::Onjunzhi(){BYTE *pData = new BYTE[m_dwWidth*m_dwHeight];BYTE *JUNZHI=new BYTE[m_dwWidth*m_dwHeight];memcpy(pData, m_pBitmap, m_dwWidth*m_dwHeight);DWORD i,j;int lineByte = (m_dwWidth * m_flag / 8 + 3) / 4 * 4;int pixelByte = m_flag/ 8;for(i = 1; i < m_dwHeight-1; i++){for(j = 1; j < m_dwWidth-1; j++){*(JUNZHI+i*lineByte+j*pixelByte)=(*(pData+i*lineByte+j*pixelByte)+ *(pData+(i-1)*lineByte+j*pixelByte)+ *(pData+(i+1)*lineByte+j*pixelByte)+*(pData+i*lineByte+(j-1)*pixelByte)+ *(pData+i*lineByte+(j+1)*pixelByte)+ *(pData+(i-1)*lineByte+(j-1)*pixelByte)+ *(pData+(i-1)*lineByte+(j+1)*pixelByte)+*(pData+(i+1)*lineByte+(j-1)*pixelByte)+ *(pData+(i+1)*lineByte+(j+1)*pixelByte))/9; } // TODO: Add your command handler code here}memcpy(m_pBitmap, JUNZHI, m_dwWidth*m_dwHeight);if(pData) delete []pData;Invalidate(TRUE);}三、处理结果原始图像均值滤波之后的图像四、实习体会通过本次的实习,我熟悉了均值滤波的算法的原理,通过用c++编程实现灰度图像均值滤波功能,我知道这种滤波是牺牲了图像的清晰度来达到处理噪声的目的,其主要应该用于椒盐噪声,在这次的实习中,我熟悉了C++的编程环境,培养了学习C++的兴趣,同时提高了自己的学习能力,自己解决问题的能力,为以后的更深一步的学习奠定了良好的基础,我更加想学好而且坚定信念一定能学好C++。
江南大学《数字图像处理技术》课程设计报告设计题目:数字图像处理系统班级:数字媒体班姓名:学号:指导老师:日期:2013.7.2一、课程设计目的要求:1、提高分析图像处理问题的能力,进一步巩固在《数字图像处理技术》课程中所学的基本原理与方法。
2、掌握并使用一门计算机语言,进行数字图像处理的应用设计。
二、设计的内容:根据本次课设完成的系统的主要功能如下:利用matlab的GUI 程序设计一个简单的图像处理程序,含有如下基本功能:1、图像的读取、存储、剪切和粘贴2、图像转化为灰度图像3、图像大小的计算4、直方图均衡化规定化的计算5、图像求反、动态压缩6、直接灰度调整7、空域滤波(均值、中值、对比度增强滤波)8、非线性锐化滤波(log滤波、prewitt滤波、sobel卷积、sobel滤波)9、频域增强(高通、低通滤波)三、总体方案设计:(1)、软件的总体设计界面布局如下图:系统的总体设计界面主要分为2个区域:显示区域和操作区域。
显示区域:在原始图像的基础上显示效果图。
操作区域:通过功能菜单实现图像的各种处理。
设计完成后运行的软件界面如下:(2)、功能模块的划分:1、图像的读取、存储、退出2、编辑(还原、剪切、粘贴)3、图像(图像大小的计算、旋转、直方图均衡化规定化的计算、图像求反、动态压缩)4、滤波(直接灰度调整、空域滤波、非线性锐化滤波、频域增强)(3)、系统运行环境:Windows 7 or SP1、Windows Vista SP2、Windows XP SP3、Windows XP x64 Edition SP2、Windows Server 2008 SP2 or R2、Windows Server 2003 R2 ,CPU要求:X86架构且支持SSE2指令集,硬盘空间:典型安装需要3-4G,内存:最低1G,推荐2G。
(4)、选用的工具:matlab7.0,win7X64(5)、主要实现功能的原理:直方图均衡化方法的基本思想是,对在图像中像素个数多的灰度级进行展宽,而对像素个数少的灰度级进行缩减。
数字图像处理课程设计报告细胞识别目录第一部分1、实验课题名称----------------------------------------------------------------------------------32、实验目的----------------------------------------------------------------------------------------33、实验内容概要----------------------------------------------------------------------------------3第二部分1、建立工程文件----------------------------------------------------------------------------------32、图像信息获取----------------------------------------------------------------------------------43、如何建立下拉菜单----------------------------------------------------------------------------64、标记Mark点------------------------------------------------------------------------------------65、二值化---------------------------------------------------------------------------------------------96、填洞------------------------------------------------------------------------------------------------97、收缩------------------------------------------------------------------------------------------------108、获取中心点--------------------------------------------------------------------------------------119、细胞计数-----------------------------------------------------------------------------------------1310、All-steps-----------------------------------------------------------------------------------------1311、扩展功能---------------------------------------------------------------------------------------14 第三部分12、各步骤结果和错误举例--------------------------------------------------------------------16 第四部分13、心得体会----------------------------------------------------------------------------------------22第一部分1、实验课题:细胞识别2、实验目的:对血液细胞切片图片进行各种处理,最终得出细胞的数目、面积等信息。
3、实验内容概要:基于VC++软件下的细胞识别,通过细胞的标记、二值化、填洞、收缩、获取中心点、计数等过程完成实验目的。
第二部分——实验具体步骤1、建立工程文件①新建MFC工程项目:--MFC AppWizard、工程名②拷贝,到工程文件夹,再向工程里添加③添加变量:m_lpDib 和头文件#include””④:变量(m_lpDib)的new、delete⑤: Serialize()2、图像信息获取①读取图像参数: OnDraw() m_pDib->Draw()如果图像不为空的话,那么就执行如下主要代码:②点击键,建立类向导,在messages中添加OnInitialUpdate()函数,添加代码实现对自动打开固定图片。
③通过鼠标右击,点击建立类向导,在messages中添加OnMouseMove()函数,添加代码实现获取所要信息,即实现鼠标在图像任一位置移动时可以直观的读取相对应位置的信息。
可以在屏幕上显示鼠标所指点的坐标以及RGB、HSI和灰度值,通过HSI的可以选取合适的阈值来找到细胞以及边界。
④为了RGB图像转化为人眼更容易识别的HSI模型,我们可以通过添加成员函数RgbtoHsi来实现这一功能。
HSI模型与RGB模型的转化关系(添加函数时,可以右击类窗口中的,选中add member function,之后选择函数的返回值类型和函数描述,其它默认不变)确定后在里面添加实现函数功能的代码。
3、添加下拉菜单在resourceview那栏的找到菜单按键设置双击,后在里面添加所需按键每个按键的ID号为注意在填写为IDR_加菜单大写。
之后右击按键,建立类向导添加按键所需函数4、标记mark分为四步1.找出mark(red)点和maybemark(blue)点2.将maybemark(blue)点变成mark(black red)点3.将mark(black red)点变成edge(yellow(fullred&&fullgreen))点4.edge点滤波基本思想:Mark点指的是我们要寻找的细胞内的点。
我们先获取每一个像素点的RGB 分量,然后我们将其转化成HSI分量,将H分量进行归一化,因为S的范围是0到1,所以我们要进行尺度的一致,这样才具有可计算性。
然后我们通过每个像素点的H分量和S分量的值与细胞内部的H分量和S分量计算欧几里得距离,设定一个Mark门限值(我们这里将MarkDoor设置为,大家可以行设置合适的参数),小于这个门限值我们就当做是细胞的内部,然后对细胞进行标记(Red)。
还需要设定一个Maybe Mark门限值(我们这里将Maybe MarkDoor设置为,大家可以行设置合适的参数),我们大于Mark门限值小于Maybe Mark 门限值时,我们暂时看成是细胞,我们进行Maybe Mark的标记(Blue)。
否则的话,我们需要考虑,一些不是Mark和Maybe Mark点的*lpSrc==0我们区别一下赋值为1,*lpSrc==255我们区别一下赋值为254,*(lpSrc+1)==255我们区别一下赋值为254.这样的话,我们在后面判断是否为Mark点的时候,我们只需要判断*lpSrc是否为0就可以了,判断Maybe Mark 点时只需要判断*(lpSrc)是否为255就可以了。
对于边缘的判断只需要判断*(lpSrc+1)是否为255就可以了。
将细胞标记为Mark用红色(255,0,0)标记出来,将可能是的细胞标记为MayBe Mark 用蓝色(0,0,255)标记出来。
将MayBeMark To Mark的区域用亮红(128,0,0)表示,将不可能是细胞的区域、细胞边界分别用绿色标记出来。
操作过程:(1)根据H、S的欧几里得距离sqrt(s2+h2)来大致的确定哪些是细胞(Mark)和可能是细胞(Maybe Mark)的点。
(2)根据Maybe Mark点周围的情况,如果它的上下左右四个方向有Mark点,则将Maybe Mark点变成Mark点。
(3)用Sobel算子来做边缘的提取边界(0,255,255)(255,255,0),使用3*3的模板,使用欧几里得距离来判断是否为边缘。
两种Sobel算子如下:主要代码如下:doubletmp1=pixel[0]+2*pixel[1]+pixel[2]-pixel[6]-2*pixel[7]-pixel[8]; doubletmp2=pixel[0]+2*pixel[3]+pixel[6]-pixel[2]-2*pixel[5]-pixel[8]; double edge=sqrt(tmp1*tmp1+tmp2*tmp2);if(edge>edgeDoor)*(lpDst+1)=255;adius<(j).radius) pt=(i);*/(i).x=(x+x0)/2;=(y+y0)/2;(i).radius=max(i).radius,(j).radius)+4;pt=pt=(i);d)在无相近点的情况下,若半径小于8,则删除。
主要代码如下:if(bdelete){("去掉潜在的错误(圆r<8 Redpen)后数目=%d",());MessageBox(msg);}e)两圆相交,若其中一圆非相交部分面积小于50%,则删除主要代码如下:if (total<Pi*r0*r0* ,(int)(tota/()+.5),*min[0]/,*max[0]/,*min[1]/,*max[1]/,*min[2]/,*max[2]/;10、All-steps可以一次性实现细胞识别的所有操作步骤设置控制按键的权限,点击update_command_ui ,键入控制条件每步操作时给cellprocess设置不同数值,表示那步进行过,只能进行规定的下步操作,从而在运行过程中放置按键误触导致程序崩溃。
11、扩展:区域选择:建立类向导:OnButtonDown 和OnButtonUp 键入代码:在OnDraw中添加下列代码注意:bool 变量m_bDrag要定义在文件头部,定义在会出现第一次区域选择时出现错误。
添加复位按键:点击该键后会重新读取图像(和图像自动打开代码一样)第三部分12、各步骤结果和错误举例①各步骤结果图a.Mark(Red)& MayBe Mark(Blue)maybemark to mark(black red)edge information and edge filtertwovaluefillholesshrinkfindcentercount出现的错误举例:Mousemove 程序中出现问题:1.错误:没有加#include ""头文件2.错误error C2248: 'm_wndStatusBar' : cannot access protected member declared in class 'CMainFrame'需将protected: 和.cpp文件仍然存在解决方案:先保存workspace,然后关闭工程,删除此工程目录中的.ncb文件,重新打开workspace原因:classview显示混乱在类中添加的成员变量和成员函数不能显示出来,即使显示出来了变量或函数,双击后不能跳至正确的位置。