实验-数字图像的直方图统计

合集下载

数字图像直方图

数字图像直方图
3.分层结构 由原始图像开始依次构成像素数愈来愈少
的图像,就能使数据表示具有分层性,其代表 有锥形(金字塔)结构。
2.6图像的数据结构与特征
锥形结构是对2k×2k个像素形成的图像,看成 是分辨率(20×20→2k×2k,但20×20不具有反映 输入图像二维构造的信息)不同的k+1幅图像的 层次集合。如图所示,从输入图像I0开始,顺 序产生像素数纵横都变为1/2的一个一个的图 像I1,I2,…Ik。此时,作为图像Ii的各像素的 值,就是它前一个图像Ii-1的相应的2×2像素 的平均值(一般采用平均值,但也可以采用能 表示2×2像素的性质的某个值)。
4. 计算图像信息量H(熵)
L1
H Pi log2 Pi
i0
Pi是图像灰度级为i的像素出现的频率,图像的灰度范 围在[0,L-1]。
彩色图的灰度直方图
灰度图的灰度直方图
灰度图具有二峰性
具有二峰性的灰度图的2值化
2.5 图像处理算法的形式
一. 图像处理基本功能的形式 按图像处理的输出形式,图像处理的基本功能可

在彩色图像(红、绿、兰)或同一对象用
多个不同的波长拍摄的多波段图像中,每个像
素包含着多个图像的信息。这类图像数据的处
理,以多谱图像为例,有下列三种存储方式:
①逐波段存储,分波段处理时采用;
②逐行存储,行扫描记录设备采用;
③逐像素存储,用于分类。
2.6图像的数据结构与特征
2.6.2 图像的特征 1.图像的特征
2.6图像的数据结构与特征
③线和角点特征
城市区划图中有建筑群、街道、公路、铁路、 桥梁等,这些地物可用线、线相交的角点来表 示。从图中提出这些特征,不仅可压缩图像, 也可用于识别。角点代表的局部结构关系不因 视角而改变,在图像匹配中很有用。

数字图像处理实验报告

数字图像处理实验报告

目录实验一:数字图像的基本处理操作 (4):实验目的 (4):实验任务和要求 (4):实验步骤和结果 (5):结果分析 (8)实验二:图像的灰度变换和直方图变换 (9):实验目的 (9):实验任务和要求 (9):实验步骤和结果 (9):结果分析 (13)实验三:图像的平滑处理 (14):实验目的 (14):实验任务和要求 (14):实验步骤和结果 (14):结果分析 (18)实验四:图像的锐化处理 (19):实验目的 (19):实验任务和要求 (19):实验步骤和结果 (19):结果分析 (21)实验一:数字图像的基本处理操作:实验目的1、熟悉并掌握MATLAB、PHOTOSHOP等工具的使用;2、实现图像的读取、显示、代数运算和简单变换。

3、熟悉及掌握图像的傅里叶变换原理及性质,实现图像的傅里叶变换。

:实验任务和要求1.读入一幅RGB图像,变换为灰度图像和二值图像,并在同一个窗口内分成三个子窗口来分别显示RGB图像和灰度图像,注上文字标题。

2.对两幅不同图像执行加、减、乘、除操作,在同一个窗口内分成五个子窗口来分别显示,注上文字标题。

3.对一幅图像进行平移,显示原始图像与处理后图像,分别对其进行傅里叶变换,显示变换后结果,分析原图的傅里叶谱与平移后傅里叶频谱的对应关系。

4.对一幅图像进行旋转,显示原始图像与处理后图像,分别对其进行傅里叶变换,显示变换后结果,分析原图的傅里叶谱与旋转后傅里叶频谱的对应关系。

:实验步骤和结果1.对实验任务1的实现代码如下:a=imread('d:\');i=rgb2gray(a);I=im2bw(a,;subplot(1,3,1);imshow(a);title('原图像');subplot(1,3,2);imshow(i);title('灰度图像');subplot(1,3,3);imshow(I);title('二值图像');subplot(1,3,1);imshow(a);title('原图像');结果如图所示:图原图及其灰度图像,二值图像2.对实验任务2的实现代码如下:a=imread('d:\');A=imresize(a,[800 800]);b=imread('d:\');B=imresize(b,[800 800]);Z1=imadd(A,B);Z2=imsubtract(A,B);Z3=immultiply(A,B);Z4=imdivide(A,B);subplot(3,2,1);imshow(A);title('原图像 A'); subplot(3,2,2);imshow(B);title('原图像 B'); subplot(3,2,3);imshow(Z1);title('加法图像'); subplot(3,2,4);imshow(Z2);title('减法图像'); subplot(3,2,5);imshow(Z3);title('乘法图像'); subplot(3,2,6);imshow(Z2);title('除法图像');结果如图所示:3.对实验任务3的实现代码如下:s=imread('d:\');i=rgb2gray(s);i=double(i);j=fft2(i);k=fftshift(j); %直流分量移到频谱中心I=log(abs(k)); %对数变换m=fftshift(j); %直流分量移到频谱中心RR=real(m); %取傅里叶变换的实部II=imag(m); %取傅里叶变换的虚部A=sqrt(RR.^2+II.^2);A=(A-min(min(A)))/(max(max(A)))*255;b=circshift(s,[800 450]);b=rgb2gray(b);b=double(b);c=fft2(b);e=fftshift(c);I=log(abs(e));f=fftshift(c);WW=real(f);ZZ=imag(f);B=sqrt(WW.^2+ZZ.^2);B=(B-min(min(B)))/(max(max(B)))*255;subplot(2,2,1);imshow(s);title('原图像');subplot(2,2,2);imshow(uint8(b));title('平移图像');subplot(2,2,3);imshow(A);title('离散傅里叶变换频谱');subplot(2,2,4);imshow(B);title('平移图像离散傅里叶变换频谱');结果如图所示:4.对实验任务4的实现代码如下:s=imread('d:\');i=rgb2gray(s);i=double(i);j=fft2(i);k=fftshift(j);I=log(abs(k));m=fftshift(j);RR=real(m);II=imag(m);A=sqrt(RR.^2+II.^2);A=(A-min(min(A)))/(max(max(A)))*255;b=imrotate(s,-90);b=rgb2gray(b);b=double(b);c=fft2(b);e=fftshift(c);I=log(abs(e));f=fftshift(c);WW=real(f);ZZ=imag(f);B=sqrt(WW.^2+ZZ.^2);B=(B-min(min(B)))/(max(max(B)))*255;subplot(2,2,1);imshow(s);title('原图像');subplot(2,2,2);imshow(uint8(b));title('平移图像');subplot(2,2,3);imshow(A);title('离散傅里叶频谱');subplot(2,2,4);imshow(B);title('平移图像离散傅里叶频谱');结果如图所示::结果分析对MATLAB软件的操作开始时不太熟悉,许多语法和函数都不会使用,写出程序后,调试运行,最开始无法显示图像,检查原因,是有些标点符号没有在英文状态下输入和一些其他的细节,学会了imread(),imshow(),rgb2gray()等函数。

数字图像处理(直方图).

数字图像处理(直方图).

21
其他类型的统计图
• 误差条:errorbar x = 1:10; y = sin(x); e = std(y)*ones(size(x)); errorbar(x,y,e)
22
其他类型的统计图
• 针状图:stem x = 1:60; y = sin(x/4); stem(x,y,'markerFace','b');
explode
17
环形饼图
ph = pie([2 4 3 5],{'North','South','East','West'}); hold on; z = 0.6*exp(i*linspace(0,pi*2,100)); fill(real(z),imag(z), 0.8*[1,1,1]);
18
二阶导数:
f m, n 1 f m, n 1 2 f m, n f x m, n , 2 x
[1 -2 1]
算子(Operator)
31
点操作
Y = F (X)
32
大局域操作
JP i, j G G IP i, j
38
for k = 1:1000
a(k) = a(k-1)+1; end 并行结构:a = [1:1000]+1;
6.递归过程
an = F(an-1) 计算过程中存在着相似的 部分,这里以阶乘为例 给出递归程序。
function y = fractorial(n); % 递归过程 if n==0; y=1; else y=fractorial(n-1)*n; end

数字图像直方图统计报告

数字图像直方图统计报告

一、学习情况
灰度直方图均衡化进行数字图像处理的基本原理
01
直方图均衡化:利用这一特性对图像中像素个数多的灰度 级进行展宽,而对图像中像素个数少的灰度进行压缩,从
而提高了对比度和灰度色调的变化,使图像更加清晰。
实现步骤: (1) 根据输入的灰度图像计算其原始直方图 (2) 对输入的原始直方图进行累加,计算其cdf (3) 使用累计分布函数的线性插值计算新的灰度值
一、学习情况
Matlab仿真
02
Imhist():直接显示图像的灰度直方图
均衡化: (1) 根据输入的灰度图像计算其原始直方图 (2) 对输入的原始直方图进行累加,计算其cdf (3) 使用累计分布函数的线性插值计算新的灰度值
二、已完成的工作及仿
真结果
二、已完成的工作及仿真结果 1 MATLAB仿真
阈值为100 200
阈值为120 200
阈值为140 180
阈值为150 170
由思考题得出的结论
阈值选择在波谷时,图片黑白分化更加明 显,对比度有所增强,当阈值靠近波峰时, 丢失信息过多,图片失真较为严重。
仿真1 MATLAB仿真
2 修改程序课后题的完成结果
双峰阈值分割法
在一些简单的图像中,物体的灰度分布比较有 规律,背景与各个目标在图像的直方图各自形 成一个波峰(区域与波峰一一对应),每两个 波峰之间会形成一个波谷,选择此波谷作为阈 值。
阈值为60 200
阈值为80 200
数字图像直方图均衡化增强实验 中期汇报
组员:张三
一、学习情况
一、学习情况
灰度直方图均衡化进行数字图像处理的基本原理
01
灰度直方图:横坐标是灰度级别,纵坐标是图像中该灰 度值的出现频率,是一个统计结果。

数字图像处理实验报告

数字图像处理实验报告

数字图像处理实验报告⼆○⼀⼋~⼆○⼀九学年第⼀学期信息科学与⼯程学院课程设计报告书课程名称:数字图像处理班级:学号:姓名:指导教师:⼆○⼀⼋年⼗⼆⽉⼀、课程设计⽬的:1. 掌握读、写、显⽰图像的基本⽅法。

2. 掌握图像直⽅图的概念、计算⽅法以及直⽅图归⼀化、均衡化⽅法。

3. 掌握图像灰度变换的基本⽅法,理解灰度变换对图像外观的改善效果。

⼆、课程设计内容及要求:1. 读⼊⼀幅图像,判断其是否为灰度图像,如果不是灰度图像,将其转化为灰度图像。

2. 完成灰度图像的直⽅图计算、直⽅图归⼀化、直⽅图均衡化等操作。

3. 完成灰度图像的灰度变换操作,如线性变换、伽马变换、阈值变换(⼆值化)等,分别使⽤不同参数观察灰度变换效果(对灰度直⽅图的影响)。

三、详细设计步骤:1、所使⽤的图像⽂件都保存在Matlab 安装⽬\toolbox\images\imdemos⼦⽬录下。

2、图像的读、写、显⽰操作。

运⽤Matlab 图像处理⼯具箱中的imread函数分别读⼊灰度图像pout.tif、⼆值图像blobs.png 和RGB 图像peppers.png,观察相应的图像矩阵,并运⽤imshow 函数显⽰相应图像。

3、对⼀个RGB 彩⾊图像peppers.png,分别抽取其R、G、B 三个分量层,并显⽰各层图像。

1、以灰度图像pout.tif 为例,运⽤灰度变换法实现图像增强。

2、运⽤Matlab 编程实现灰度直⽅图的统计以及直⽅图均衡化处理过程:(1)计算并绘制原始图像的灰度直⽅图;(2)根据离散累计分布函数,对原始灰度直⽅图进⾏均衡化处理,绘制均衡化后的灰度直⽅图;(3)⽣成均衡化处理后的新图像,显⽰并保存。

(4)⽐较原始图像和新图像的对⽐度。

(1)利⽤Matlab 函数IMNOISE(),在原图上分别叠加⾼斯噪声和椒盐噪声(2)实现均值滤波和中值滤波的功能,去除噪声;(3)调整窗⼝⼤⼩,采⽤对⽐均值滤波中值滤波的性能;1、以灰度图像rice.png 为例,实现Roberts 算⼦、Sobel 算⼦、Prewitt算⼦对其进⾏边缘检测,并实现根据梯度⽣成 5 种不同的增强图像。

数字图像处理实验报告

数字图像处理实验报告

数字图像处理实验报告光信13-2班2013210191韩照夏数字图像处理实验报告实验一数字图像空间域平滑一、实验目的掌握图像空间域平滑的原理和程序设计;观察对图像进行平滑增强的效果。

二、实验设备计算机,Matlab程序平台。

三、实验原理图像平滑处理的目的是改善图像质量和抽出对象特征。

任何一幅未经处理的原始图像,都存在着一定程度的噪声干扰。

噪声恶化了图像质量,使图像模糊,甚至淹没特征,给分析带来困难。

消除图像噪声的工作称为图像平滑或滤波。

针对不同噪声源(如光栅扫描、底片颗粒、机械元件、信道传输等)引起的不同种类噪声(如加性噪声、乘性噪声、量化噪声等),平滑方法也不同。

平滑可以在空间域进行,也可以在频率域进行。

1.局部平均法局部平滑法是一种直接在空间域上进行平滑处理的技术。

假设图像由许多灰度恒定的小块组成,相邻象素间存在很高的空间相关性,而噪声则是统计独立的。

因此,可用邻域内各象素的灰度平均值代替该象素原来的灰度值,实现图像的平滑。

对图像采用3×3的邻域平均法,其作用相当于用以下模板与图像进行卷积运算。

2. 超限象素平滑法 对邻域平均法稍加改进,可导出超限象素平滑法。

其原理是将f(x,y)和邻域平均g(x,y)差的绝对值与选定的阈值进行比较,根据比较结果决定点(x,y )的最后灰度g ´(x,y)。

其表达式为3. 二维中值滤波中值滤波就是用一个奇数点的移动窗口, 将窗口中心点的值用窗口内各点的中值代替。

二维中值滤波可由下式表示常用的窗口有:四、实验步骤1.实验准备:打开计算机,进入Matlab 程序界面。

2.输入图像空间域平滑处理程序,程序如下:⎩⎨⎧>-= ),(),(),( ),,(),('其他,当y x f T y x g y x f y x g y x g )},({),(y x f Med y x g A=程序1.1 图像平滑处理clear;clc;I=imread('lena.jpg');subplot(3,2,1);imshow(I);title('原图像');I1=imnoise(I,'salt & pepper',0.02);subplot(3,2,2);imshow(I1);title('对I加椒盐噪声的图像');h2=fspecial('average',[3 3]);I2=imfilter(I1,h2,'replicate');subplot(3,2,3);imshow(I2);title('3×3邻域平滑');h3=fspecial('average',[5 5]);I3=imfilter(I1,h3,'replicate');subplot(3,2,4);imshow(I3);title('5×5邻域平滑');I4=I1;I4((abs(I1-I2))>64)=I2((abs(I1-I2))>64);subplot(3,2,5);imshow(I4);title('3×3超限象素平滑(T=64)'); I5=I1;I5((abs(I1-I3))>48)=I3((abs(I1-I3))>48);subplot(3,2,6);imshow(I5);title('5×5超限象素平滑(T=48)');程序1.2 图像平均平滑与中值滤波clear;clc;I=imread('lena.jpg');subplot(3,3,1);imshow(I);title('原图像');I1=imnoise(I,'gaussian',0.02);subplot(3,3,2);imshow(I1);title('高斯噪声');I2=imnoise(I,'salt & pepper',0.02);subplot(3,3,3);imshow(I1);title('椒盐噪声');h1=fspecial('average',[3 3]);I3=imfilter(I1,h1,'replicate');subplot(3,3,4);imshow(I3);title('对I1 3×3邻域平滑');h2=fspecial('average',[3 3]);I4=imfilter(I2,h2,'replicate');subplot(3,3,5);imshow(I4);title('对I2 3×3邻域平滑');I5=medfilt2(I1,[5 5]);subplot(3,3,6);imshow(I5);title('对I1 5×5中值滤波');I6=medfilt2(I2,[5 5]);subplot(3,3,7);imshow(I6);title('对I2 5×5中值滤波');3.运行图像处理程序,并保存处理结果图像。

数字图像处理图像变换实验报告

数字图像处理图像变换实验报告

实验报告实验名称:图像处理姓名:刘强班级:电信1102学号:1404110128实验一图像变换实验——图像点运算、几何变换及正交变换一、实验条件PC机数字图像处理实验教学软件大量样图二、实验目的1、学习使用“数字图像处理实验教学软件系统”,能够进行图像处理方面的简单操作;2、熟悉图像点运算、几何变换及正交变换的基本原理,了解编程实现的具体步骤;3、观察图像的灰度直方图,明确直方图的作用与意义;4、观察图像点运算与几何变换的结果,比较不同参数条件下的变换效果;5、观察图像正交变换的结果,明确图像的空间频率分布情况。

三、实验原理1、图像灰度直方图、点运算与几何变换的基本原理及编程实现步骤图像灰度直方图就是数字图像处理中一个最简单、最有用的工具,它描述了一幅图像的灰度分布情况,为图像的相关处理操作提供了基本信息。

图像点运算就是一种简单而重要的处理技术,它能让用户改变图像数据占据的灰度范围。

点运算可以瞧作就是“从象素到象素”的复制操作,而这种复制操作就是通过灰度变换函数实现的。

如果输入图像为A(x,y),输出图像为B(x,y),则点运算可以表示为:B(x,y)=f[A(x,y)]其中f(x)被称为灰度变换(Gray Scale Transformation,GST)函数,它描述了输入灰度值与输出灰度值之间的转换关系。

一旦灰度变换函数确定,该点运算就完全确定下来了。

另外,点运算处理将改变图像的灰度直方图分布。

点运算又被称为对比度增强、对比度拉伸或灰度变换。

点运算一般包括灰度的线性变换、阈值变换、窗口变换、灰度拉伸与均衡等。

图像几何变换就是图像的一种基本变换,通常包括图像镜像变换、图像转置、图像平移、图像缩放与图像旋转等,其理论基础主要就是一些矩阵运算,详细原理可以参考有关书籍。

实验系统提供了图像灰度直方图、点运算与几何变换相关内容的文字说明,用户在操作过程中可以参考。

下面以图像点运算中的阈值变换为例给出编程实现的程序流程图,如下:2、图像正交变换的基本原理及编程实现步骤数字图像的处理方法主要有空域法与频域法,点运算与几何变换属于空域法。

数字图像处理实验-灰度直方图

数字图像处理实验-灰度直方图

实验一灰度直方图1.实验目的:(1)加强灰度直方图的图像增强技术的认识和了解;(2)掌握均衡化处理方法对图像做增强处理;2.实验内容:如下图所示是一张大脑的医学核磁共振( MRI)图像,原图由于对比度太低而使得大脑的内部组织层次不清,欲利用直方图均衡等方法对该图做增强处理,先编制出位图读取程序,对该图像进行灰度值统计,并在屏幕上绘制出相应的直方图。

3.实验结果(代码&结果可视化)1)编写程序设原始图像在x,y处的灰度为f而改变后的图像为g则对图像增强的方法即为在x,y处的灰度f映射为g在直方图均衡化处理中对图像的映射函数可以定义为g=Q(f), 即是一个累加分布函数CDF。

实际处理变换算法是先对原始图像的灰度情况进行统计分析并计算出原始直方图分布。

然后根据计算出的累计直方图分布求出f->g的灰度映射关系。

重复上述步骤得到原始图像所有灰度级到目标图像灰度级的映射关系后按照这个映射关系对原始图像各点像素进行灰度转换即可完成对原始图像的直方图均衡化。

具体算法:首先统计原始图像的各级灰度值在程序中定义了一个数组lCount[256]来统计原设计图像的各级灰度值,然后对得到的灰度值做灰度映射将映射后的结果存到一个新的灰度映射关系数组bMap[256]中根据这个数组就可以确定出原始图像的某个灰度级经过变换后对应于德灰度级,最后将变换后的结果保存到DIB中。

2)核心程序for (i = 0; i < lHeight; i ++){for (j = 0; j < lWidth; j ++){lpSrc = (unsigned char *)lpDIBBits + lLineBytes * i + j;lCount[*(lpSrc)]++; // 计数加1}}// 统计原设计图像的各级灰度值// 计算灰度映射关系for (i = 0; i < 256; i++){lTemp = 0; // 初始为0for (j = 0; j <= i ; j++){lTemp += lCount[j];}bMap[i] = (BYTE) (lTemp * 255 / lHeight / lWidth); // 计算对应的新灰度值}for(i = 0; i < lHeight; i++)// 每行{for(j = 0; j < lWidth; j++)// 每列{// 指向DIB 第i 行第j 个象素的指针lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;// 保存新的灰度值*lpSrc = bMap[*lpSrc];}}3)直方图绘制4.实验分析和总结直方图均衡化处理后图像的直方图较为平直,各灰度级的值相对均匀。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验二数字图像的直方图统计一、实验目的1.了解对灰度图像进行直方图统计的基本原理;2.掌握用VC编程实现直方图统计的方法;3.在微机上调试程序;5. 分析数字图像直方图的特点。

二、实验原理图像的直方图图像的(灰度统计)直方图是一个一维的离散函数。

它的定义为:设s k为图像f(x,y)的第k级灰度值,n k是f(x,y)中具有灰度值s k的象素的个数,n是图像象素总数,则:p s(s k)= n k/n k=0,1, ,L-1称为图像f(x,y)的直方图。

这里p s(s k)代表原始图中第k个灰度级的出现概率。

以n k为自变量,以p s(s k)为函数,得到的曲线就是图像的直方图,在实际中常常直接将对第k个灰度级的统计值n k作为图像的直方图。

它提供了原图灰度值的分布情况,也可以说给出了一幅图所有灰度值的整体描述。

对灰度图像进行直方图统计的程序流程图如图2-1所示。

图2-1 灰度图像直方图统计流程三、实验前准备1.预习本实验中关于数字图像直方图统计的有关内容;2. 预习VC中添加对话框的步骤和方法;3.了解本实验的目的和实验内容。

四、实验内容1.在实验一的基础上读入并显示一幅数字图像;2.编写对灰度图像进行直方图统计的程序,并将结果显示在屏幕上。

五、实验报告要求1.总结对灰度图像进行直方图统计的过程,比较不同的图像其直方图特性;2.对实验结果进行分析。

六、参考步骤和程序在实验一的基础上,进行如下操作:1、点击ResourceView,右键点击Dialog,选Insert Dialog 在属性对话框中将ID改为ID_HIST,对话框名称改为“直方图”2、在工具栏中点“插入”-“新建类”,输入类名,并选Base Class为CDialog,Dialog ID为ID_HIST。

这样就将对话框和类联系起来了,在该对话框中拖入一Edit控件,将其ID 设为IDC_HISTSHOW;3、快捷键“Ctrl+W”,出现MFC ClassWizard对话框,在Messages栏中分别选WM_INITDIALOG和WM_Paint,再点击“Add Function”,即将对话框初始化和画图函数加入对话框类之中。

4、在Hist.h文件“public:”下面输入如下变量定义:LONG m_lCount[256];char* m_lpDIBBits;LONG m_lWidth;LONG m_lHeight;int m_iIsDraging;CDlgIntensity(CWnd* pParent = NULL);5、打开Hist.cpp程序,在CHist::OnInitDialog()函数中“// TODO: Add extra initialization here”前将如下代码拷贝进去:unsigned char* lpSrc;LONG i;LONG j;6、在“// TODO: Add extra initialization here”后将如下代码拷贝进去:CWnd* pWnd=GetDlgItem(IDC_HISTSHOW);pWnd->GetClientRect(m_MouseRect);pWnd->ClientToScreen(&m_MouseRect);CRect rect;GetClientRect(rect);ClientToScreen(&rect);m_MouseRect.top-=rect.top;m_MouseRect.left-=rect.left;m_MouseRect.top+=25;m_MouseRect.left+=10;m_MouseRect.bottom=m_MouseRect.top+255;m_MouseRect.right=m_MouseRect.left+256;for(i=0;i<256;i++){m_lCount[i]=0;}LONG lLineBytes;lLineBytes=WIDTHBYTES(m_lWidth*8);for(i=0;i<m_lHeight;i++){for(j=0;j<m_lWidth;j++){lpSrc=(unsigned char*)m_lpDIBBits+lLineBytes*i+j;m_lCount[*(lpSrc)]++;}}m_iIsDraging=0;7、在CHist::OnPaint()函数“CPaintDC dc(this);”前将如下代码拷如其中:CString str;LONG i;LONG lMaxCount=0;LONG m_iLowGray=0;LONG m_iUpGray=255;在CHist::OnPaint()函数“// TODO: Add your message handler code here”后将如下代码拷如其中:CWnd* pWnd=GetDlgItem(IDC_ HISTSHOW);CDC* pDC=pWnd->GetDC();pWnd->Invalidate();pWnd->UpdateWindow();pDC->Rectangle(0,0,330,300);CPen* pPenRed=new CPen;pPenRed->CreatePen(PS_SOLID,1,RGB(255,0,0));CPen* pPenBlue=new CPen;pPenBlue->CreatePen(PS_SOLID,1,RGB(0,0,255));CPen* pPenGreen=new CPen;pPenGreen->CreatePen(PS_SOLID,1,RGB(0,255,0));CGdiObject* pOldPen=pDC->SelectObject(pPenRed); pDC->MoveTo(10,10);pDC->LineTo(10,280);pDC->LineTo(320,280);str.Format("0");pDC->TextOut(10,283,str);str.Format("50");pDC->TextOut(60,283,str);str.Format("100");pDC->TextOut(110,283,str);str.Format("150");pDC->TextOut(160,283,str);str.Format("200");pDC->TextOut(210,283,str);str.Format("255");pDC->TextOut(265,283,str);for(i=0;i<256;i+=5){if((i&1)==0){pDC->MoveTo(i+10,280);pDC->LineTo(i+10,284);}else{pDC->MoveTo(i+10,280);pDC->LineTo(i+10,282);}}pDC->MoveTo(315,275);pDC->LineTo(320,280);pDC->LineTo(315,285);pDC->MoveTo(10,10);pDC->LineTo(5,15);pDC->MoveTo(10,10);pDC->LineTo(15,15);for(i=m_iLowGray;i<=m_iUpGray;i++){if(m_lCount[i]>lMaxCount){lMaxCount=m_lCount[i];}}pDC->MoveTo(10,25);pDC->LineTo(14,25);str.Format("%d",lMaxCount);pDC->TextOut(11,26,str);pDC->SelectObject(pPenGreen);pDC->MoveTo(m_iLowGray+10,25);pDC->LineTo(m_iLowGray+10,280);pDC->MoveTo(m_iUpGray+10,25);pDC->LineTo(m_iUpGray+10,280);pDC->SelectObject(pPenBlue);if(lMaxCount>0){for(i=m_iLowGray;i<=m_iUpGray;i++){pDC->MoveTo(i+10,280);pDC->LineTo(i+10,281-(int)(m_lCount[i]*256/lMaxCount));}}pDC->SelectObject(pOldPen);delete pPenRed;delete pPenBlue;delete pPenGreen;8、点开ResourceView中的Menu,出现IDR_MAINFRAME和IDR_MY111TYPE,双击IDR_MY111TYPE就出现了程序界面,有文件、编辑、查看、窗口、帮助按钮。

点“查看”下面的虚线框右键——点“属性”,输入标题(直方图),和ID(大写英文,如ID_VIEW_HIST),这样就将按钮和程序通过ID联系起来了,点击该按钮,就会执行相应的程序。

下面为该按钮添加函数:点Ctrl+W ,出现MFC ClassWizard对话框,选Class name为CMy111View,在Object IDs对应的选项中选中设置的ID(如为ID_VIEW_HIST),在Messages选项中选中COMMAND,然后点击“Add Function”按钮,选默认设置,就为ID_VIEW_HIST添加了相应的函数OnViewHist()。

该函数在111View.cpp文件中定义,在函数void CMy111View:: OnViewHist()添加如下代码:// TODO: Add your command handler code hereCMy111Doc* pDoc=GetDocument();if(pDoc->m_hDIB==NULL){MessageBox("请先打开一幅256色的BMP图像!","系统提示",MB_ICONINFORMATION|MB_OK);return;}LPSTR lpDIB;LPSTR lpDIBBits;lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());lpDIBBits=::FindDIBBits(lpDIB);if(::DIBNumColors(lpDIB)!=256){MessageBox("目前只支持查看256色位图灰度直方图!","系统提示",MB_ICONINFORMATION|MB_OK);::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());return;}BeginWaitCursor();CHist dlgPara;dlgPara.m_lpDIBBits=lpDIBBits;dlgPara.m_lWidth=::DIBWidth(lpDIB);dlgPara.m_lHeight=::DIBHeight(lpDIB);// dlgPara.m_iLowGray=0;// dlgPara.m_iUpGray=255;if(dlgPara.DoModal()!=IDOK){return;}::GlobalUnlock((HGLOBAL)pDoc->GetHDIB()); EndWaitCursor();。

相关文档
最新文档