VC编程实现灰度图像与彩色图像的相互转换要点
数字图像灰度图像二值化实验报告matlab实现1
数字图像灰度图像二值化实验报告matlab
实现
数字图像处理
实验报告
实验二灰度图像的二值化处理
学号
姓名
日期
实验二灰度图像的二值化处理
一、实验目的
图像二值化是数字图像处理技术中的一项基本技术,二值化图像的显示与打印十分方便,存储与传输也非常容易,在目标识别、图像分析、文本增强、字符识别等领域得到广泛应用。图像二值化是将灰度图像转化为只有黑白两类像素的图像,大多采用阈值化算法处理。在不同的应用中,阈值的选取决定着图像特征信息的保留。因此,图像二值化技术的关键在于如何选取阈值。
二、实验内容
1、编程绘制数字图像的直方图。
2、灰度图像二值化处理。
三、实验要求
1、自己选择灰度图像。
2、选择多种阈值分割算法,并比较和分析图像二值化处理的结果。
3、使用VC++编程序。
四、设计思想(阈值选取算法)
灰度图像是指只含亮度信息,不含色彩信息的图像,将彩色图像转化成为灰度图像的过程称为图像的灰度化处理。图像的二值化处理就是将图像上的点的灰度置为0或255,也就是使整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。阀值分割选取算法有:典型的全局阀值算法的Otsu 算法、局部阀值方
法中的Bersen算法、灰度拉伸法、直方图方法等等。
1.Otsu算法的设计思想:设阀值将图像分割成两组,一组灰度对应目标,
另一组灰度对应背景,则这两组灰度值的类内方差最小,两组的类间方差最大。对图像设阈值将图像分割成两组,一组灰度对应目标,另一组灰度对应背景,则这两组灰度值的类内方差最小,两组的类间方差最大。
MFC 读取并显示图片和彩色转灰度
附上关键代码一目了然:
彩色转灰度:例如hDIB是彩色图像,把旧的hDIB拷贝到新的hNewDIB中去,并清空hDIB,方法为:GlobalFree((HGLOBAL)hDIB)。对新的内存区域实行变换,变换为灰度图,方法为:彩色图每个像素占3个字节,存储方式为蓝绿红交替存储。例如3列的图像,每行顺序为:blue,green,red,blue,green,red,blue,green,red。注意后面还有三个字节以0填充。这样可以用一些循环将blue,green,red整合为一个灰度像素。然后存入缓冲区(纯数据缓冲区)。这样将信息头(信息头需要做适当的改变)和颜色表和数据缓冲区存入旧的pDIB内存中,再刷新一下文档(Invalidate(TRUE);)就可以看到pDIB所指向的旧图片由彩色变为灰度图了。
指向DIB:LPSTR lpDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
HGLOBAL内存复制:HGLOBALhNewDIB=CopyHandle(hDIB);
lpDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
使用C++语言读取mat文件中的数据
使用C++语言读取*.mat文件中的数据
简介:借助于Matlab的接口函数,在Visual Studio中使用C++语言读取*.mat文件中的数据(这里主要是2维矩阵(灰度图像)和3维矩阵(彩色图像))到OpenCV 中的Mat数据结构中并显示图像,同时实现将灰度图像转化为伪彩色图像(类型为Matlab中的colormap jet),最后调用Windows的API函数实现窗口尺寸的自由调整。
工具:(1)Matlab R2015b(x64) (2)Visual Studio 2013 (3)OpenCV 3.0.0
一、在Visual Studio配置Matlab和OpenCV
假设Matlab的安装路径为“E:\Program Files\MATLAB”,OpenCV的安装路径为“E:\Program Files\opencv”。
1.配置环境变量
在“控制面板》系统和安全》系统》高级系统设置》环境变量》系统变量”中找到变量名“Path”,编辑之,在变量值的末尾添加“;E:\Program Files\MATLAB\R2015b\bin\win64;E:\Program Files\opencv\build\x64\vc12\bin”。如图1所示。
图1
2.配置配置管理器
在Visual Studio 2013中新建一个“Win32控制台应用程序”,在菜单栏“生成”中打开“配置管理器”选项。将“活动解决方案平台”中的“Win32”选为(新建为)“x64”。如图2所示。
图2
3.配置属性管理器
在菜单栏“视图”中打开“属性管理器”选项,右键点击Debug|x64下的er并打开“属性”选项,如图3所示。
医学图像处理指导书
医学图像处理实验指导书
实验一 将真彩色图象转化为灰度图象并进行变换
一、实验目的:
1、 了解图像处理基本方法、理解图像颜色空间基本操作及相互变换方法;
2、 了解并掌握Matlab 图像处理算法实现的基本过程;
3、 掌握彩色图像处理和变换基本方法(Matlab/VC++实现);
4、 熟悉并理解灰度图像的基本操作和变换。 二、预习要求
1、熟悉VC++/Matlab 编程环境,了解VC++/Matlab 图像处理基本过程;
2、理解图像灰度变换基本原理及彩色图像转换为灰度图像的变换原理。 三、实验原理:
1、 彩色图像转换为灰度图像原理及灰度窗口变换原理 (1) 彩色图像转换为灰度图像基本原理
彩色图像有不同的颜色空间,根据不同的颜色空间转换公式对图像进行转换,选择最具代表性的分量信息,对图像进行处理和特征提取,是图像处理的关键步骤:颜色空间转换公式如(YIQ-RGB ):
RGB 图像转换为灰度图像是保留图像亮度信息而去掉图像色彩饱和度等信息,得到图像的灰度图像如图1所示,图像灰度变换及灰度数据:
图1:图像灰度变换及灰度数据
(2) 图像的灰度拉伸是图像的基本变换,在原始图像信息的基础上对图像进行点运算变换和调整
其基本变换公式为:
fB
fAD D f D fB
fAx x f A A B +==+=)()(灰度变换方程为:
2、 熟悉VC 编程环境,在课程所给实验代码基础上进行图像灰
度变换调整和实验示例曲线如图2:灰度变换曲线。 图2:灰度变换曲线 四、实验内容
1、 将实验指导老师所给图像(生物医学图像)进行不同颜色空间转换(在Matlab 下实现),观察图
位图存储格式
位图存储格式
2009-08-26 02:31 BMP位图文件的存储格式
摘要:本文简单介绍了位图文件的两种存储格式,并且在VC++6.0下实现了读取位图文件中的数据,用SetPixel()函数在窗口中重现图像,最后在程序中实现了一种存储格式到另一种存储格式的转换。
关键字:BMP、灰度位图、24位真彩色位图、存储格式
一、前言
BMP(Bitmap的缩写)图像是指文件名后缀为BMP的位图图像。位图图像在计算机中使用很广泛,例如在windows中,记事本、写字板中的文字就是用位图图像表示出来的。许多以其它格式存储的图像,就是在位图图像的基础上,进行优化处理后得到的,例如JPEG图像等。
在数字图像处理中,许多算法就是针对24位真彩色位图或灰度位图设计的。因此,很有必要介绍一下位图文件的这两种存储格式。
二、24位真彩色图像存储格式
把下图的24位真彩色图像格式在16位编辑器(例如VC编辑器)中打开,可以看到图像的二进制数据。
24位真彩色的二进制数据为:
这是24位真彩色位图文件数据一部分。这一部分数据包括位图文件头、位图信息头和位图阵列三部分。
(一)位图文件头
位图文件头用来记录标志文件大小的一些信息,在文件中占14个字节,存储的内容如下:字节
1
2
3
4
5
6
7
8
9
10
11
12
13
14
000000
42
4D
CC
B4
02
00
00
00
00
00
36
00
00
00
其中:
42 4D 为位图的标志,即ASCII码为BM
CC B4 02 表示位图文件的总字节数,换算成十进制为(02B4CC)H=(177356)10,即这副图像的大小为177356字节。
利用VC++实现图片像素的转换
・L V I * & _p Ii,U L ) (P OD ) m tD BtN L , ; s 0
T pdf s ut ye e tc r
t BT P IE E D R a IMA FL H A E f g
/ mh / t b
:
②位图的显示.
WO D R
D R WO D
WO D R
. ・ 0到 2 5表示这个点从黑到 白的 26级灰度。 5, 5 则可以阈值等于 17 , 2 )如 : 一个点的灰度值小于等于该 阈值 , 果 则输出一个黑点 , 反之则输 出一个 : 白点。
可见位 图信息也是由两部分组成的 : 位图信息头+ 颜色表 () 2 位图信息结构
①位图信息头 : 位图信息头包含了单个像素所用字节数 以 及描述颜 :
:
:
‘
: r t ISc o(D - > eSfH c , I— et , I D sY : e e B et np C G ta d 0 nD sx l et, C aD i e . l — .
M Ds i . , ‘ m D s i . , — et z C SeX _ etz c Sey
26 5 色位图, 它每个像素颜色的 R G B 、 、 分量值都相等。 通常也把 R G B: 图数据 的指针 , 、、 位 后者则使用 A I P 函数 , 根据位图信息初始化存储位图
Bmp图像存储格式
摘要:本文简单介绍了位图文件的两种存储格式,并且在VC++6.0下实现了读取位图文件中的数据,用SetPixel()函数在窗口中重现图像,最后在
程序中实现了一种存储格式到另一种存储格式的转换。
关键字:BMP、灰度位图、24位真彩色位图、存储格式
一、前言
BMP(Bitmap的缩写)图像是指文件名后缀为BMP的位图图像。位图图像在计算机中使用很广泛,例如在windows中,记事本、写字板中的文字就是用位图图像表示出来的。许多以其它格式存储的图像,就是在位图图像的基础上,进行优化处理后得到的,例如JPEG图像等。
在数字图像处理中,许多算法就是针对24位真彩色位图或灰度位图设计的。因此,很有必要介绍一下位图文件的这两种存储格式。
二、24位真彩色图像存储格式
把下图的24位真彩色图像格式在16位编辑器(例如VC编辑器)中打开,可以看到图像的二进制数据。
24位真彩色的二进制数据为:
这是24位真彩色位图文件数据一部分。这一部分数据包括位图文件头、位图信息头和位图阵列三部分。
(一)位图文件头
位图文件头用来记录标志文件大小的一些信息,在文件中占14个字节,存储的内容如下:
字节 1 2 3 4 5 6 7 8 9 10 11 12 13 14 000000 42 4D CC B4 02 00 00 00 00 00 36 00 00 00 其中:
42 4D 为位图的标志,即ASCII码为BM
CC B4 02 表示位图文件的总字节数,换算成十进制为
(02B4CC)H=(177356)10,即这副图像的大小为177356字节。
基于VC 数字图像抠像与合成系统的设计
求, 最终采用网上下载的图像。如果 采用原拍摄素材进行合成, 需要对背景蓝色设定 处理阈值。该设计主要是利用 C 语言中的循环语句实 现像素点的扫描和替换, 其中 通过判断语句进行像素值替换前的判断, 实现将蓝屏素材的蓝色背景替换 为后景图, 即实现前景人物键入到后景中。 在做抠像技术编程实现的过程中遇到很多问题, 通 过从最基础的单张灰度图片合成开始做, 逐步调 试程序, 不断完善程序, 最终完成了 序列图像的抠像合成工作。具体过程如下: 1) 单张灰度图像合成 其中需要解决的主 要问题是读取图像、分配空间、合成图片和图像输出几 个过程。因为灰度图像只需考 虑图片的宽和高 2 个数据, 所以通过设定 3 个二维指针即可实现读入 2 张 图片和 写出 1 张图片的功能。灰度图像的前景应通过阈值将人物和背景分离, 将背景的像素 值统一赋值 为人物中很少出现的像素值, 常为接近于 255 的纯白色。当程序检测到 前景为纯白色的像素值时, 则替 换为后景的像素值, 实现图像的合成 ( 如图 1) 。 2) 序列灰度图像合成 只需在单张合成的基础上添加 f or ( ) 循环, 读取图像时加 入图像名称辨识 的语句即可, 生成的序列图像也进行规律性命名。动态效果通过 AC Dsee 设置幻灯片播放时间间隔即可 观看。 3) 序列彩色图像合成 因为彩色图像包含 R、G、B 三基色, 所以前景应采用蓝屏幕技术, 即应在 蓝色背景下拍摄前景人物图像, 在该设计中采用的是蓝屏素材是网上下载的图像 , 图像中除主体人物外 的背景蓝色为 RGB= ( 0, 0, 255) , 当程序检测到前景为这 种蓝色的像素值时, 则替换为后景的像素 值, 实现图像的合成。单张彩色图像合成如 图 2 所示。 图1 合成后的灰度图像 图 2 合成后彩色图像 3 实现过程中的问题及解决 1) 彩色图像除要考虑宽和高的数据外, 还要考虑 3 基色的数据, 所以设定的 3 个指针应为三维, 分配空间时要有所考虑, 同时指向生成序列图片的指针所指向的像素值最好初始 化为 0。 2) 以上通过抠像技术合成后的图像边缘会有前景图像的白色或蓝色背景残 余, 是因为图像合成所 采用的原图像是 JPEG 格式或是由 JPEG 格式转换而成的 BM P 格式。JPEG 是用于连续色调静态图像的 一种标准, 其主要方法是采用预测编码 ( DPCM) 、离散余弦变换 ( DCT ) 以及熵编码, 以去除冗余的 图像和彩色数据, 属 于有损压缩[ 4] 。所以图像抠像后的边缘会出现因压缩产生的数据丢失, 是无法恢复 的 。应采用以下方法对合成后的图像进行边界处理: [ 5] 灰度图像的边界处理。设定 3 # 3 窗口, 判断 240 ? 长江大学学报 ( 自然科学版) 2008 年 3 月 赋值点的 8 邻域的像素值是否小于某一范围 ( 此处采用阈值 250) , 来进行当 前像素点的赋值。因合成 后的整幅图像会因扫描窗口的大小而有一个像素的边缘无法 进行扫描赋值, 所以应在图像合成处理前对 新分配空间的指针所指向的像素值统一赋 值为 1 的后景图像的像素值。处理后效果图像如图 3 所示。 彩色图像的边界处理。 原理同上。设定 3 # 3 窗口, 判断赋值点的 8 邻域的像素值是否为 RGB= ( 0, 0, 255) 的蓝色, 来进行当前像素点的赋值。即所扫描的图 2 的前景图当前像素点的 8 邻域的像素值均不为蓝色, 则像素 点赋值为图 2 的前景图, 否则赋值为图 2 的后 景图。处理后效果图像如图 4 所示。如果对于彩色图片使 用 7 # 7 窗口的 48 邻域 进行判断赋值, 处理效果将更为理想, 当然程序编写也会相对麻烦一些。 图 3 处 理 ? 抠像% 边界后 的灰度图像 图4 处理抠像边界后的彩色图像 4 4 1
VC++下的BMP格式图像和PNG格式图像的转换
VC++下的BMP格式图像和PNG格式图像的转换
肖峰
【摘要】初步探讨了在VC++的BMP格式图像和PNG格式图像的转换.首先分析了BMP和PNG两种图像文件的详细格式,然后在VC++环境下建立了这两种图像格式文件的处理类CBmp和CPng,在这两个类中实现了BMP文件的读取、显示和PNG文件的保存等操作.在理解LZ77压缩算法和霍夫曼编码算法的基础上,在VC++的环境下实现这两种算法.这样,我们就可以读取BMP图像文件,然后将图像显示在程序界面上,通过压缩和编码,从而将对应的BMP图像数据转换为PNG图像数据,实现了图像格式的转换.
【期刊名称】《赤峰学院学报(自然科学版)》
【年(卷),期】2016(032)003
【总页数】2页(P17-18)
【关键词】VC++;BMP;PNG;LZ77算法;霍夫曼编码
【作者】肖峰
【作者单位】安徽大学;安徽职业技术学院学生处,安徽合肥 230001
【正文语种】中文
【中图分类】TP317.4
随着网络的发展,图像越来越成为人们之间重要的信息传输和共享方式.在生活和工作中经常用到的图像格式有BMP、PNG、jpe、gif和 tiff等等.其中 BMP 和PNG 格式是采用的无损压缩图像格式,它们之间格式的互相转换就成了数字图像
处理中经常遇到的问题.
BMP是最常用最基本的图像文件格式,图像软件基本上都能读取和显示BMP图像格式.和其他图像格式相比,BMP格式是一种非常简单的格式,设计目的是为了能在程序设计中轻松的进行图形编程.它具有比较足够的颜色深度支持,可以支持1 位、2 位、4 位和 8 位的彩色索引图像以及16 位、24 位和 32 位的真彩 RGB 图像.BMP 格式的图像通常都很大,因为他只在4位和8位彩色索引图像中支持最简单的行程编码格式.
VC++图形图像处理源代码
利用Visual C++实现A VI文件的图像截取
A VI文件就是我们所说的多媒体文件,所谓的A VI图像就是视频图像,该文件是一个RIFF说
明文件,它用于获取、编辑、演示音频、视频序列。一般的A VI文件包含音频流和视频流,有
的特殊的A VI还包含一个控制路径或MIDI路径作为附加的数据流。
现在播放A VI文件的软件很多,但大多无法从A VI视频文件中读取一帧图像并生成BMP格
式的文件。笔者在使用A VI文件开发项目过程中对A VI文件的操作积累了一些经验,对于如何
实现从A VI视频流中获取任意帧的图像数据并存储成BMP文件,其中最关键的是要从A VI文
件中获取具体某一帧的图像数据,为此我利用Windows提供的API函数实现了自定义的CAvi 类,用于操作A VI文件。
在使用API函数操作A VI文件时,一定要注意用A VIFileInit()来初始化A VI库,程序结束时
用A VIFileExit()释放A VI库,否则API函数无法使用。现以操作包含真彩色图像的A VI文件为例,给出Cavi类的部分函数的具体实现,其中CaviCreate()函数用于读取A VI文件信息并初始
化Cavi类的成员,例如根据A VI文件信息定义每帧图像的宽、高、每帧图像的信息头结构等等;函数AviRead(int mFrame)用于从A VI文件中读取第mFrame帧。实现代码显示如下:
//Cavi类头文件定义;
class CAvi file://AVI类,处理A VI文件
{
public:
int cy;//图象高
c++图像灰度
关键字:Visual Studio2010;图像处理;灰度变换
I
Gray-scale Transformation of digital Image based on VC
Abstract
With the advent of the information age, image becomes one of the basic information of the information society.Digital image processing is a basic method of image information, which some complicated algorithm operates on large amounts of image data in order to achieve the satisfactory effects.Gray-scale transformation is the most common image processing method.Gray-scale transformation commonly used include histogram, gray linear transformation, threshold transformation, gray balance etc.. As an important part of digital image processing, my paper introduces the Visual Studio2010 in the gray image Histogram, generates correction of gray balance and gives running results.The program is composed of two parts: an operation BMP image and digital image gray-scale transformation.First, create a MFC application framework in Visual Studio2010 and then operate any BMP image to complete the gray-scale transformation of class.
(完整版)实验-灰度图像的锐化处理
实验五灰度图像的锐化处理
一、实验目的
1.了解图像锐化的基本原理;
2.掌握图像空域锐化处理的方法;
3.利用VC编写图像空域锐化处理的程序;
4.在微机上调试程序。
二、实验原理
图像平滑处理可以减弱噪声的影响,但窗口增大后将会产生图像边缘不清的问题。
图像在传输和转换过程中,一般来讲,质量都会降低,除了噪声的因素之外,图像一般都要变得模糊一些,这主要因为图像的传输或转换系统的传递函数对高频成分的衰减作用,造成图像的细节轮廓不清晰。图像锐化的作用就是补偿图像的轮廓,增强图像的边缘级灰度跳变部分,使图像较清晰。
图像锐化是一种能加强图像轮廓的处理方法,因此,从增强的目的来看它是与图像平滑相反的一类处理,图像锐化同样也可分为频域和空域处理两类实现方法。本实验要求完成空域中图像的锐化处理。
1.图像空域锐化处理的方法
微分处理可加强高频成分,例如对正弦信号sin(Nx),其微分为余弦函数Ncos(Nx),经微分处理后,信号的频率不变,幅度增大N倍,且频率越高,增幅越大。对图像进行微分处理后:
∆f/∆x
G[(x,y)]=
∆f/∆y
G[(x,y)]是点(x,y)的梯度,其方向指向f(x,y)最大变化方向。
对连续图像:
G[(x,y)]=[(∆f/∆x)2+(∆f/∆y)2]1/2
对离散图像:G[(x,y)]常采用下列几种算法:
(1)典型的差分算法
G[(x,y)]=[[f(x,y)-f(x+1,y)]2+[f(x,y)-f(x,y+1)]2]1/2
(2)罗伯茨算法
G[(x,y)]=[[f(x,y)-f(x+1,y+1)]2+[f(x+1,y)-f(x,y+1)]2]1/2
图像灰度亮度对比度
图像灰度亮度对⽐度
图像灰度亮度对⽐度公司内部档案编码:[OPPTR-OPPT28-OPPTL98-OPPNN08]
C++ Builder
图像灰度、对⽐度和亮度
学号:0007
学⽣所在学院:研究⽣学院
学⽣姓名:王阳
任课教师:熊邦书
教师所在学院:电⼦信息⼯程学院
2008年1⽉
07级
实现图像的灰度变换和对⽐度、亮度调节
王阳
研究⽣学院
摘要: C++ Builder是⼀种快速⾼效的可视化开发语⾔,与⼀般语⾔相⽐,其在图形绘制和图像处理上功能较强。本⽂是对图像的灰度、亮度、对⽐度进⾏调整。这些处理主要是对现存图像进⾏处理,通过设置不同的像素颜⾊值来达到各种效果。
关键词:C++ Builder 灰度亮度对⽐度
⼀.图像的灰化处理
1.理论基础
图像的灰度变换处理是图像增强处理技术中⼀种⾮常基础,直接的空间域图像处理⽅法,也是图像数字化软件和图像显⽰软件的⼀个重要组成部分。灰度变换是指根据某种⽬标条件按⼀定变换关系逐点改变原图像中每⼀个像素灰度值的⽅法。⽬的是为了改善画质,使图像的显⽰效果更加清晰。灰度变换有时⼜被成为图像的灰度增强或对⽐度拉伸。
颜⾊可以为⿊⽩⾊,灰度⾊和彩⾊。⼯程应⽤中经常要遇到需要把彩⾊图像到灰度图像的变换的问题,采集卡过来的图像为彩⾊图像,为加快处理速度,要把彩⾊图像转换为⿊⽩图像。由彩⾊转化为灰度的过程叫做灰度化处理,它是使RGB模型中的R=G=B。灰度化处理是把含有亮度和⾊彩图像变化成灰度图像的过程。
⼀般情况下彩⾊图像每个像素⽤3个字节表⽰,每个字节对应着R,G,B分量的亮度(红,绿,蓝),转换后的⿊⽩图像的⼀个像素⽤⼀个字节表⽰该点的灰度值,它的值在0-255之间,数值越⼤,该点越⽩,即越亮,越⼩则越⿊。转换关系为:
VC++第10章图像位图基础
2
10.1 数字图像的基本概念
“图”是物体透射光或反射光的分布,“像”是人的视觉系统 对图的接收在大脑中形成的印象或认识。图像是两者的结合。 人类获取外界信息是靠听觉、视觉、触觉、嗅觉、味觉等, 但绝大部分(约65%左右)来自视觉所接收的图像信息。 图像处理就是对图像信息进行加工处理,以满足人的视觉 心理和实际应用的需要。简单的说,依靠计算机对图像进行 各种目的的处理我们就称之为数字图像处理。 自然界的图像以模拟信号的形式存在,在用计算机进行处 理以前,首先要数字化,比如摄像头(CCD)摄取的信号在 送往计算机处理前,一般情况下要经过模数转换,这个任务 常常由图像采集卡完成。随着科技的发展,数码像机、数码 摄像机已经进入寻常百姓家,我们可以利用这些设备作为图 像处理系统的输入设备来为后续的图像处理提供信息源。
9 9
数字图像的基本概念
24位真彩色图像所需存储空间很大,处理速度较慢。 当需要存储空间不大,并且要求实时快速处理图像时, 一般采用相应的8位位图,8位伪彩色图像用途较广。
10 10
10.2 与设备相关位图(DDB)
设备相关位图DDB,也称GDI位图。 DDB是一种内部位图格式,它显示的图像依计算机显示系统 的设置不同而不同,因此一般不存储文件。 DDB位图结构是由MFC库CBitmap类定义于Windows.h。该 类封装了与DDB位图操作相关的数据结构和操作函数。 在进行图像处理时,不用这种位图结构。
VC++图像处理模板
VC++图像处理模板
我们知道,Visual C++的CBitmap类和静态图片控件的功能是比较弱的,它只能显示出在资源中的图标、位图、光标以及图元文件的内容,而不像VB中的Image控件可以显示出绝大多数的外部图像文件(BMP、GIF、JPEG等)。因此,想要在对话框或其他窗口中显示外部图像文件则只能借助于第三方提供的控件或代码。现在,MFC和ATL共享的新类CImage为图像处理提供了许多相应的方法,这使得Visual C++在图像方面的缺憾一去不复返了。
CImage类概述
CImage是MFC和ATL共享的新类,它能从外部磁盘中调入一个JPEG、GIF、BMP和PNG格式的图像文件加以显示,而且这些文件格式可以相互转换。由于CImage在不同的Windows操作系统中其某些性能是不一样的,因此在使用时要特别注意。例如,CImage::PlgBlt和CImage::MaskBlt只能在Windows NT 4.0 或更高版本中使用,但不能运行在Windows 95/98 应用程序中。CImage::AlphaBlend和CImage::TransparentBlt也只能在Windows 2000/98或其更高版本中使用。即使在Windows 2000运行程序还必须将stdafx.h文件中的WINVER和_WIN32_WINNT的预定义修改成0x0500才能正常使用。
CImage封装了DIB(设备无关位图)的功能,因而可以让我们能够处理每个位图像素。它具有下列最酷特性:
1、AlphaBlend支持像素级的颜色混合,从而实现透明和半透明的效果。
数据图像处理实验报告
HSV空间图像中,HSV模型颜色的参数分别是:色调(H),饱和度(S),亮度(V)。H参数表示色彩信息,即所处的光谱颜色的位置。该参数用一角度量来表示,红、绿、蓝分别相隔120度。互补色分别相差180度。纯度S为一比例值,范围从0到1,它表示成所选颜色的纯度和该颜色最大的纯度之间的比率。S=0时,只有灰度。V表示色彩的明亮程度,范围从0到1。
{
h *= 2;
hp++;
}
//分配内存
complex<double> *TD = new complex<double>[w * h];
complex<double> *FD = new complex<double>[w * h];
//行
for(i = 0; i < h; i++)
{
//列
for(j = 0; j < w; j++)
{
//对x方向进行快速付立叶变换
FFT(&TD[i * h], &FD[i * h], hp);
}
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VC编程实现灰度图像与彩色图像的相互转换
PhotoShop的图像处理功能很强,其中有一个功能是将灰度图像转换为彩色图像,数字图像处理中,也经常要遇到灰度图像与彩色图像相互转换的问题,如何自己解决这个问题,值得大家探讨,现将我解决这类问题的方法陈述如下:
工程应用中经常要遇到需要把彩色图像到灰度图像的变换的问题,采集卡过来的图像为彩色图像,为加快处理速度,要把彩色图像转换为黑白图象,这个问题比较好解决,一般情况下彩色图像每个像素用三个字节表示,每个字节对应着R、G、B分量的亮度(红、绿、蓝),转换后的黑白图像的一个像素用一个字节表示该点的灰度值,它的值在0~255之间,数值越大,该点越白,既越亮,越小则越黑。转换公式为Gray(i,j)=0.11*R(i,j)+0.59*G(i,j)+0.3*B(i,j),其中Gray(i,j)为转换后的黑白图像在(i,j)点处的灰度值,我们可以观察该式,其中绿色所占的比重最大,所以转换时可以直接使用G值作为转换后的灰度。
至于灰度图像转换为彩色图像,技术上称为灰度图像的伪彩色处理,这是一种视觉效果明显而技术又不是很复杂的图像增强技术。灰度图像中,如果相邻像素点的灰度相差不大,但包含了丰富的信息的话,人眼则无法从图像中提取相应的信息,因为人眼分辨灰度的能力很差,一般只有几十个数量级,但是人眼对彩色信号的分辨率却很强,这样将黑白图像转换为彩色图像人眼可以提取更多的信息量。在转换过程中,经常采用的技术是灰度级-彩色变换,意思就是对黑白图像上的每一个像素点,取得该点的灰度值并送入三个通道经过实施不同的变换,产生相应的R、G、B的亮度值,即所求彩色图像对应像素点的彩色值,具体变换公式很多,我采用的是最常用的一种,变换曲线图如下:
上图中,三个图分别代表了三个变换通道,R、G、B指的是变换后对应点的R、G、B分量值,L指的是各个分量的最大值为255,G(x,y)为相应点的灰度值。理论上就这些,下面是我用VC实现的源代码,图一为我的灰度位图,图二为伪彩色处理后的结果图。我这个实现函数中是如何得到灰度位图的数据的就不多讲了,有兴趣的朋友可参考我在天极网上九月十号发表的《VC灰度位图处理》一文,那里应该讲的很
清楚了。需要读者注意的是彩色图像中每个象素中的三个字节分别代表的分量,第一个字节为B,第二个为G值、最后一个为R值,这个顺序不要搞错了。代码实现如下:
void CDibView::OnMenuchange() file://图像转换实现函数
{
// TODO: Add your command handler code here
HANDLE data1handle;
LPBITMAPINFOHEADER lpBi;
BITMAPINFO *m_pBMI;
CDibDoc *pDoc=GetDocument();
HDIB hdib;
unsigned char *hData;
unsigned char *data;
hdib=pDoc->GetHDIB();//得到位图数据的句柄,其中包含图像信息头
BeginWaitCursor();
lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);
hData=(unsigned char*)FindDIBBits((LPSTR)lpBi);
m_pBMI=new BITMAPINFO;//生成彩色图像的信息头
m_pBMI->bmiHeader.biBitCount=24;
m_pBMI->bmiHeader.biClrImportant=0;
m_pBMI->bmiHeader.biClrUsed=0;
m_pBMI->bmiHeader.biCompression=BI_RGB;
m_pBMI->bmiHeader.biHeight=lpBi->biHeight;
m_pBMI->bmiHeader.biWidth=lpBi->biWidth;
m_pBMI->bmiHeader.biPlanes=1;
m_pBMI->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
m_pBMI->bmiHeader.biXPelsPerMeter=0;
m_pBMI->bmiHeader.biYPelsPerMeter=0;
m_pBMI->bmiHeader.biSizeImage=WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight*3;
file://data=hData;
int R,G,B,i,j;
data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight*3);
file://生成存储彩色图象数据的缓冲区
data=(unsigned char*)GlobalLock((HGLOBAL)data1handle);
for(i=0;i biHeight;i++)//实现灰度到彩色变换
for(j=0;jbiWidth*8);j++)
{
if(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)<=64)
{R=0;
G=(int)4*(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j));
B=255;
}
if(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)>64
&& *(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)<=128)