常用图像处理算法
图像处理算法

图像处理算法随着科技的不断发展,数字图像处理得到了广泛的应用。
图像处理算法是数字图像处理领域中最重要的研究领域之一,它们能够从一幅图像中提取出有用的信息。
本文将会介绍一些常用的图像处理算法。
1. 图像修复算法在许多应用场景中,图像可能受到噪点、瑕疵、损坏、失真等影响,这些影响会严重降低图像的质量和可用性。
图像修复算法的目标是通过复原被噪声、失真等影响破坏的图像,使其恢复到原本的清晰度或者增强其可视化。
常用的图像修复算法有基于滤波的算法、插值算法和卷积神经网络(CNN)等。
其中,基于滤波的算法包括最常见的均值滤波、中值滤波、高斯滤波等;插值算法包括最近邻插值、双线性插值、三次样条插值等。
值得注意的是,卷积神经网络的优点在于它可以通过学习数据的特征,实现自动图像修复的目的。
2. 图像分割算法图像分割是将一幅图像分成若干个部分或区域,以获得图像中物体的轮廓、形状、色彩、纹理等特征,是图像处理领域中的关键技术之一。
图像分割不仅在医学、遥感等领域有很广泛的应用,还可以用于人脸识别、图像分类等领域。
常用的图像分割算法主要包括阈值分割、边缘分割、区域增长算法和基于聚类的分割算法等。
在阈值分割算法中,需要将图像转换为灰度图像,并确定一个灰度值作为分割阈值,通过比较像素与阈值的关系,在图像上进行二值化。
边缘分割算法是根据图像中物体的不同物理特征提取物体的边缘,然后通过边缘将物体进行分割。
在区域增长算法中,将图像上所有像素点作为种子点,通过像素点与种子点之间的相似度来进行某个像素点的区域扩展。
基于聚类的分割算法则是将图像像素进行聚类,归纳出不同的类别,并以此进行图像分割。
3. 图像几何校正算法在实际应用场景中,由于摄像机的位置、角度、校正参数等因素的影响,图像可能会呈现出不同程度的畸变。
为了消除这些影响,需要利用图像几何校正算法对图像进行校正和纠正。
常用的图像几何校正算法包括图像基础变换、透视变换和仿射变换等。
其中,图像基础变换主要包括平移、旋转、缩放和翻转等,通过将图像进行平移、旋转等处理,使图像达到需要的效果。
图像处理算法与应用

图像处理算法与应用一、引言图像处理是计算机科学与技术领域中的一个重要研究方向,它涉及到对图像进行获取、处理、分析和识别等一系列操作。
图像处理算法是实现这些操作的核心,它们通过数学和计算机科学的方法,对图像进行各种处理,以提取出有用的信息或改善图像的质量。
本文将探讨一些常见的图像处理算法及其应用。
二、图像增强算法1. 灰度拉伸算法灰度拉伸算法是一种常用的图像增强算法,它通过对图像的灰度值进行线性变换,将原始图像的灰度范围映射到更广的范围内,从而增强图像的对比度和细节。
该算法在医学影像、卫星图像等领域有广泛应用。
2. 直方图均衡化算法直方图均衡化算法是一种通过调整图像的灰度分布,使得图像的直方图在整个灰度范围内均匀分布的方法。
它能够增强图像的全局对比度,使得图像更加清晰明亮。
该算法常用于图像增强、图像压缩等领域。
三、图像滤波算法1. 均值滤波算法均值滤波算法是一种常见的线性滤波算法,它通过计算图像中每个像素周围邻域的平均灰度值来实现图像平滑处理。
该算法可以有效地去除图像中的噪声,常用于图像降噪、图像压缩等领域。
2. 中值滤波算法中值滤波算法是一种非线性滤波算法,它通过计算图像中每个像素周围邻域的中值来实现图像平滑处理。
该算法对于椒盐噪声等脉冲噪声有较好的抑制效果,常用于医学影像、数字摄影等领域。
四、图像分割算法1. 基于阈值的分割算法基于阈值的分割算法是一种简单而有效的图像分割方法,它通过设置一个或多个阈值,将图像中的像素分成不同的区域或类别。
该算法常用于目标检测、图像分析等领域。
2. 基于边缘检测的分割算法基于边缘检测的分割算法是一种基于图像边缘信息进行分割的方法。
它通过检测图像中的边缘,将图像中的不同区域分割开来。
该算法常用于计算机视觉、机器人导航等领域。
五、图像识别算法1. 特征提取算法特征提取算法是一种将图像中的关键特征提取出来的方法,用于表示图像中的目标或物体。
常见的特征提取算法包括尺度不变特征变换(SIFT)、方向梯度直方图(HOG)等。
图像处理中常用的特征抽取算法介绍

图像处理中常用的特征抽取算法介绍图像处理是计算机视觉领域的重要研究方向,而特征抽取是图像处理中的关键步骤之一。
特征抽取算法能够从原始图像中提取出具有代表性的特征,为后续的图像分析和识别任务提供有价值的信息。
本文将介绍几种常用的特征抽取算法。
一、颜色特征提取算法颜色是图像中最直观的特征之一,常用的颜色特征提取算法有颜色直方图和颜色矩。
颜色直方图统计了图像中不同颜色的像素数量分布,通过对颜色直方图的分析,可以得到图像的颜色分布特征。
而颜色矩则通过对图像中像素的颜色值进行统计,得到图像的颜色矩阵,从而描述图像的颜色分布和色彩信息。
二、纹理特征提取算法纹理是图像中的一种重要特征,可以描述图像中物体的表面细节和结构。
常用的纹理特征提取算法有灰度共生矩阵和小波变换。
灰度共生矩阵通过统计图像中像素灰度级别之间的关系,得到图像的纹理特征。
而小波变换则通过将图像分解成不同尺度和方向的子图像,提取出图像的纹理信息。
三、形状特征提取算法形状是图像中物体的外部轮廓和内部结构,常用的形状特征提取算法有边缘检测和轮廓描述。
边缘检测算法通过检测图像中像素灰度级别的变化,找到物体的轮廓。
而轮廓描述算法则通过对图像中物体轮廓的几何形状进行描述,提取出物体的形状特征。
四、局部特征提取算法局部特征是图像中局部区域的特征,常用的局部特征提取算法有SIFT和SURF。
SIFT算法通过检测图像中的关键点,并提取关键点周围的局部特征描述子,从而得到图像的局部特征。
而SURF算法则通过对图像中的兴趣点进行检测,并提取兴趣点周围的局部特征,用于图像匹配和识别任务。
五、深度学习特征提取算法深度学习是近年来图像处理领域的热门技术,深度学习特征提取算法通过使用深度神经网络模型,自动学习图像中的特征表示。
常用的深度学习特征提取算法有卷积神经网络(CNN)和循环神经网络(RNN)。
CNN通过多层卷积和池化操作,提取图像的局部特征和全局特征。
而RNN则适用于序列数据的特征提取,可以用于处理图像序列和视频数据。
图像处理中的基本算法和技巧

图像处理中的基本算法和技巧图像处理是一门非常重要的技术,它对于各种领域都有着广泛的应用。
而在图像处理中,基本算法和技巧是非常关键的。
接下来,我们将会详细地介绍几种常用的基本算法和技巧。
一、图像滤波图像滤波是一种常用的图像处理方法,它可以用来去除图像中的噪点和平滑图像等。
在图像滤波中,常用的滤波器有高斯滤波器和中值滤波器。
高斯滤波器是一种线性滤波器,它可以对图像进行平滑处理。
在高斯滤波器中,通过调整高斯核的大小和标准差来控制平滑的程度。
一般情况下,高斯核的大小和标准差越大,平滑程度就越高。
而中值滤波器则是一种非线性滤波器,它可以有效地去除图像中的椒盐噪声和斑点噪声。
二、图像变换图像变换是指对图像进行变形、旋转和缩放等操作。
在图像变换中,常用的方法有仿射变换和透视变换。
仿射变换是指在二维平面上对图像进行平移、旋转、缩放和倾斜等操作,使得变换后的图像与原始图像相似。
而透视变换则是仿射变换的一种扩展,它可以对三维物体进行投影变换,并将其映射为二维图像。
三、图像分割图像分割是指将图像分成若干个互不重叠的子区域的过程。
其目的是为了提取图像的某些特征,如边缘、轮廓和区域等。
在图像分割中,常用的方法有阈值分割、区域生长和边缘检测等。
阈值分割是指通过设置灰度值的阈值,将图像中的像素分为两类:前景和背景。
区域生长则是通过确定种子点,逐步生长出与之相邻的图像区域。
而边缘检测则是通过寻找图像中的边缘,来分割出图像的各个部分。
四、图像识别图像识别是指通过对图像中的特征进行鉴别,从而实现对该图像的识别。
在图像识别中,常用的方法有模板匹配、特征提取和分类器学习等。
模板匹配是指将一个已知的区域模板与待识别图像进行匹配,从而找到与该模板最相似的区域。
特征提取则是指通过对图像中的特征进行分析和提取,来实现对图像的识别。
而分类器学习则是通过对大量的样本进行学习和分类,来实现对图像的自动识别。
以上就是图像处理中的基本算法和技巧,它们在实际应用中都有着非常广泛的应用。
介绍常见的图像处理算法及其应用

介绍常见的图像处理算法及其应用图像处理算法是计算机视觉领域的重要内容,它涵盖了许多不同的技术和方法。
本文将介绍一些常见的图像处理算法及其应用。
这些算法可以用于图像增强、图像分割、目标识别等领域,它们可以帮助我们更好地理解和处理图像数据。
一、图像滤波算法图像滤波是图像处理的基础算法之一,它通过对图像进行平滑处理来去除图像中的噪声或者增强图像的细节。
图像滤波算法有很多种,其中常见的有均值滤波、中值滤波和高斯滤波。
均值滤波是一种简单的滤波算法,它通过计算像素点周围领域像素的平均值来达到平滑图像的效果。
均值滤波对噪声有一定的去除效果,但是对于边缘和细节信息的保存能力较差。
中值滤波是一种非线性滤波算法,它通过对图像中的像素值进行排序,然后选择排序后的中间值作为当前像素的新值。
中值滤波对椒盐噪声有较好的去除效果,并且能够保持图像的边缘信息。
高斯滤波是一种基于高斯函数的线性滤波算法,它通过对图像中的像素进行加权平均来实现平滑效果。
高斯滤波对于去除高斯噪声以及其他类型的噪声都有较好的去除效果。
二、图像分割算法图像分割是将图像划分成具有语义信息的相互独立的区域的过程。
图像分割算法通常根据图像中的灰度值、颜色、纹理等特征将图像进行分割。
常见的图像分割算法有阈值分割、基于区域的分割和基于边缘的分割。
阈值分割是一种简单常用的分割算法,它将图像中的像素根据灰度值与阈值的关系进行分类。
通过调整阈值的大小,可以实现不同程度的图像分割。
基于区域的分割算法是根据像素之间的相似性将图像进行分割,使具有相似性质的像素聚合成为一个区域。
常见的基于区域的分割算法有K-means算法和基于区域的生长算法。
基于边缘的分割算法是根据图像中的边缘信息将图像进行分割。
边缘是图像中颜色、灰度值等发生突变的地方,基于边缘的分割算法通过检测图像中的边缘来实现分割。
三、图像特征提取算法图像特征提取是将图像中的信息转化为计算机可以理解和处理的形式的过程。
图像特征可以是图像的边缘、纹理、颜色等视觉特征,也可以是经过某种数学变换得到的特征。
图像处理算法

增强后图像在(i,j)处的灰度值为
Sobel算子在计算x方向和y方向上的梯度时,不像普通梯度算子那样只用两 个像素灰度差值来表示,而是采用两列或两行像素灰度加权和的差值来表 示,这使得Sobel算子具有如下优点: (1)引入了加权平均,将距离远近产生的影响考虑进去,对图像中的随机噪声 具有一定的平滑作用 (2)由于Sobel算子采用间隔两行或者两列的差分,所以图像中边缘两侧的像 素得到增强。Sobel算子得到的锐化图像的边缘显得粗而亮
图像边缘检测
(4)Gauss-Laplacian算子 Gauss-Laplacian算子是一种二阶边缘检测 法,通过寻找图像的灰度值的二阶微分中的零 穿越来检测边缘点,其算子用模板卷积表示为
图像分割
• 图像分割的方法大体可以分为四种:基于阈值 选取的图像分割方法、基于区域的图像分割方 法、基于边缘检测的图像分割以及模糊分割方 法。其中基于阈值选取的图像分割主要是利用 灰度频率分布信息(直方图)进行分割,由于阈值 化方法简单、性能稳定,成为图像分割的基本 技术。该方法主要利用了图像中要提取的目标 物与其背景在灰度特性上的差异,把图像视为 具有不同灰度级的区域的组合,通过选取合适 的阈值,将目标区域从它们的背景中分离出来, 达到图像分割的目的。
图像边缘检测
(3)Prewitt算子 Prewitt边缘检测算子是一种类似Sobel边缘检测算子的边缘模板算 子,通过对图像进行八个方向的边缘检测,将其中方向响应最大的作 为边缘幅度图像的边缘。
如果在每个点噪声都是相同的,那么Prewitt算子是比较好的。事实 上,Prewitt算子对噪声很敏感,图像的离散差分比对原图像对噪声更 敏感,可以通过先对图像做平滑处理以改善结果。
图像去噪
• 应用中值滤波的一种方法是先使用小尺寸窗口,后逐渐加 大窗口尺寸。在实际使用窗口时,一般先选择长度为3的 窗口对信号进行处理,若无明显信号损失,再把窗口延长 到5,对原图像作中值滤波,直到既有较好噪声滤除的效果, 又不过分损害图像细节为止。 • 另一种方法就是对信号进行级联的中值滤波(即迭代处 理),采用固定的或可变长度的窗口。 • 在一定条件下,中值滤波可以克服线性滤波器所带来的图 像细节模糊,而且对滤除脉冲干扰及颗粒噪声最为有效。 但对高斯噪声无能为力。需要注意的是,当窗口内噪声点 的个数大于窗口一半时,中值滤波的效果不好。而且,对 一些细节多,特别是点、线、尖顶细节多的图像不宜采用 中值滤波的方法,使用中值滤波会造成这些细节丢失。
图像处理中的特征提取和匹配算法

图像处理中的特征提取和匹配算法图像处理在日益热门的人工智能技术中扮演着一种重要的角色。
在图像处理中,特征提取和匹配算法是两个至关重要的步骤。
特征提取是通过分析图像的局部特点来创建描述图像内容的向量,而匹配是将不同图像的特征或特征向量进行比较,以确定它们是否相似。
本文将介绍几种常用的特征提取和匹配算法。
一、特征提取算法1.尺度不变特征变换(SIFT)SIFT是一种特征提取算法,它能够从不同的尺度和方向上提取图像的局部特征。
这种算法在检索和匹配图像中特别有用。
SIFT算法的基本思想是通过高斯差分算子得到一组尺度空间图像,通过高斯图像之间的差异来确定关键点,然后计算每个关键点的局部梯度的幅值和方向,最后形成一个基于梯度方向的特征描述符。
2.速度增强型稀疏编码(SLEEC)SLEEC是一种新型的高效特征提取算法。
与其他算法不同的是,SLEEC只需扫描一次训练数据即可获得最具代表性的特征。
该算法通过运用具有多个分辨率的降采样、随机稀疏和加速度分析三种技术提取特征,从而实现了比其他算法更高的准确性和速度。
二、特征匹配算法1.暴力匹配算法暴力匹配算法是一种基本的匹配算法,它实现了图像特征之间的精确匹配。
该算法通过比较两个图像之间的每个可能的匹配,来确定匹配的好坏。
虽然该算法的准确性很高,但是它非常耗时,因此只适用于小图像匹配。
2.基于Flann树的匹配算法基于Flann树的匹配算法通过对特征向量进行一系列分割和聚类,以快速找到大量数据中的相似匹配。
该算法不仅适用于大规模数据集,而且具有高效和稳定性。
3.随机抽样一致性算法(RANSAC)随机抽样一致性算法是一种常见的特征匹配算法。
该算法通过随机采样一对点来确定匹配,在这个过程中,通过迭代重复采样和检测结果,不断提高匹配模型的准确度。
结论:在图像处理和计算机视觉中,特征提取和匹配是核心算法。
不同的特征提取和匹配算法适用于不同的应用场合。
在实际应用中,为了达到对图像的快速识别和匹配,我们需要根据具体的需求,选择合适的特征提取和匹配算法。
图像生成和处理的算法和应用

图像生成和处理的算法和应用随着计算机技术的发展,图像生成和处理一直是研究的热点之一。
图像生成和处理是对数字图像进行操作、改变和转换,以达到特定的目的。
它不仅在计算机图形学、计算机视觉等学科中起着重要作用,同时也在众多领域应用广泛,如医学图像分析、图像识别、视频游戏、电影特效、物体跟踪等等。
本文将介绍几种常用的图像生成和处理的算法和应用。
一、图像生成算法1、深度学习深度学习是一种用于图像处理和实现人工智能的技术,目前被广泛应用于图像生成。
深度学习的核心思想是搭建神经网络,利用大量的数据训练模型,从而使模型具有较强的图像生成能力。
其中,生成对抗网络(GAN)是深度学习中最流行的图像生成算法之一。
GAN的基本结构是由一个生成器和一个判别器构成,通过反复训练生成器和判别器,不断提高生成器的生成能力。
2、卷积神经网络卷积神经网络(CNN)是一种用于处理图像的神经网络,在图像分类、图像分割、目标检测等方面有着广泛的应用。
CNN最常用的结构是卷积层、池化层和全连接层。
卷积层用于提取图像的特征,池化层用于缩小特征图的尺寸,全连接层用于分类等任务。
在图像生成方面,CNN可以通过反向传播算法训练生成器,从而实现图像生成。
3、自编码器自编码器是一种基于神经网络的图像生成算法,它的基本思想是将输入映射到隐藏层,然后再将隐藏层映射回输出。
自编码器的训练过程是将原始图像输入自编码器,将输出与目标图像进行比较,通过不断调整权重,使自编码器能够更精确地重构输入图像。
二、图像生成和处理应用1、图像变换图像变换包括图像旋转、平移、缩放和扭曲等操作。
在实际应用中,图像变换可以用于调整图像大小、合成多张图像等任务。
图像变换技术可以通过深度学习等算法实现。
2、图像修复图像修复是指对有缺损、噪声或损坏的图像进行修复、恢复的操作。
图像修复技术可以采用多种算法,如基于统计学的方法、基于采样的方法、基于分类的方法等。
在实际应用中,图像修复主要用于修复老照片、复原古迹等任务。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8种常用图像处理算法(函数)------以下所有函数均放在p下1.图像镜像void CCimageProcessingView::OnGeomTrpo(){//获取指向文档的指针CCimageProcessingDoc* pDoc = GetDocument();//指向DIB的指针LPSTR lpDIB;//锁定DIBlpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//设置光标状态为等待状态BeginWaitCursor();//调用VertMirror函数镜像图象if (VertMirror(lpDIB)){//设置文档修改标记pDoc->SetModifiedFlag(TRUE);//更新所有视图pDoc->UpdateAllViews(NULL);}else{//提示信息MessageBox("实现图象镜像失败!");}//解除锁定::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());//结束光标等待状态EndWaitCursor();}* 函数名称:** VertMirror()** 参数:** LPSTR lpDIB //指向源DIB图像指针** 返回值:** BOOL //镜像成功返回TRUE,否则返回FALSE。
** 说明:** 该函数用来实现DIB图像的垂直镜像。
*BOOL WINAPI VertMirror(LPSTR lpDIB){//原图象宽度LONG lWidth;//原图象高度LONG lHeight;//原图象的颜色数WORD wNumColors;//原图象的信息头结构指针LPBITMAPINFOHEADER lpbmi;//指向原图象和目的图象的像素的指针LPBYTE lpSrc,lpDst;//平移后剩余图像在源图像中的位置(矩形区域)CRect rectSrc;//指向原图像像素的指针LPBYTE lpDIBBits;//指向复制图像像素的指针LPBYTE lpNewDIBBits;//内存句柄HLOCAL h;//循环变量LONG i;//图像每行的字节数LONG lLineBytes;//获取图象的信息头结构的指针lpbmi=(LPBITMAPINFOHEADER)lpDIB;//找到图象的像素位置lpDIBBits=(LPBYTE)::FindDIBBits(lpDIB);//获取图象的宽度lWidth=::DIBWidth(lpDIB);//获取图象的高度lHeight=::DIBHeight(lpDIB);//获取图象的颜色数wNumColors=::DIBNumColors(lpDIB);//计算图像每行的字节数lLineBytes = WIDTHBYTES(lWidth *(lpbmi->biBitCount)); // 暂时分配内存,以保存新图像h= LocalAlloc(LHND, lLineBytes);// 分配内存失败,直接返回if (!h)return FALSE;// 锁定内存lpNewDIBBits = (LPBYTE)LocalLock(h);//如果是256色位图或真彩色位图if(wNumColors==256||wNumColors==0){//平移图像,每次移动一行for(i = 0; i<lHeight/2; i++){//指向原图象倒数第i行像素起点的指针lpSrc =(LPBYTE)lpDIBBits + lLineBytes * i;//目标区域同样要注意上下倒置的问题lpDst =(LPBYTE)lpDIBBits+lLineBytes * (lHeight-i-1) ;//备份一行memcpy(lpNewDIBBits, lpDst, lLineBytes);//将倒数第i行像素复制到第i行memcpy(lpDst, lpSrc, lLineBytes);//将第i行像素复制到第i行memcpy(lpSrc, lpNewDIBBits, lLineBytes);}}else{AfxMessageBox("只支持256色和真彩色位图");// 释放内存LocalUnlock(h);LocalFree(h);return false;}// 释放内存LocalUnlock(h);LocalFree(h);// 返回return TRUE;}2.旋转图像(含对话框这里对话框需要自己建立)void CCimageProcessingView::OnGeomRota(){//获取指向文档的指针CCimageProcessingDoc* pDoc = GetDocument();//指向DIB的指针LPSTR lpDIB;//锁定DIBlpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());// 缩放比率int iRotaAngle;// 创建对话框CDlgGeoRota dlgPara;// 初始化变量值dlgPara.m_iRotaAngle = 90;// 显示对话框,提示用户设定旋转角度if (dlgPara.DoModal() != IDOK){// 返回return;}// 获取用户设定的平移量iRotaAngle = dlgPara.m_iRotaAngle;// 删除对话框delete dlgPara;//创建新DIBHDIB hNewDIB=NULL;//设置光标状态为等待状态BeginWaitCursor();//调用RotateDIB函数旋转DIB图象hNewDIB=(HDIB)::RotateDIB(lpDIB,iRotaAngle); //旋转成功if (hNewDIB){//替换原来的DIB图象为新的DIBpDoc->ReplaceHDIB(hNewDIB);//更新DIB图象的大小和调色板pDoc->InitDIBData();//设置文档修改标记pDoc->SetModifiedFlag(TRUE);//调节滚动视图大小SetScrollSizes(MM_TEXT,pDoc->GetDocSize()); //更新所有视图pDoc->UpdateAllViews(NULL);}else{//提示信息MessageBox("实现图象旋转失败!");}//解除锁定::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); //结束光标等待状态EndWaitCursor();}** 函数名称:** RotateDIB ()** 参数:** LPSTR lpDIB //指向源DIB图像指针** int iAngle* 说明:** 该函数用来实现DIB图像的旋转。
*************************************************************************/ HGLOBAL WINAPI RotateDIB(LPSTR lpDIB,int iAngle){//原图象宽度LONG lWidth;//原图象高度LONG lHeight;//旋转后图象宽度LONG lNewWidth;//旋转后图象高度LONG lNewHeight;//原图象的颜色数WORD wNumColors;//原图象的信息头结构指针LPBITMAPINFOHEADER lpbmi,lpbmi0;//指向原图象和目的图象的像素的指针LPBYTE lpSrc,lpDst;//指向原图像像素的指针LPBYTE lpDIBBits;//指向旋转后图像(像素)的指针LPBYTE lpNewDIBBits;LPSTR lpNewDIB;//旋转后新的DIB句柄HDIB hDIB;//循环变量LONG i,j,i0,j0;//原图像每行的字节数LONG lLineBytes;//旋转后图像每行的字节数LONG lNewLineBytes;//旋转角度的弧度double fArcAngle;//旋转角度的正弦和余弦float fSin,fCos;//旋转前图象四个角的坐标(以图象中心为坐标系原点)float fSrcX1,fSrcY1,fSrcX2,fSrcY2;float fSrcX3,fSrcY3,fSrcX4,fSrcY4;//旋转后图象四个角的坐标(以图象中心为坐标系原点)float fDstX1,fDstY1,fDstX2,fDstY2;float fDstX3,fDstY3,fDstX4,fDstY4;//两个中间量float f1,f2;//找到图象的像素位置lpDIBBits=(LPBYTE)::FindDIBBits(lpDIB);//获取图象的宽度lWidth=::DIBWidth(lpDIB);//获取图象的高度lHeight=::DIBHeight(lpDIB);//获取图象的颜色数wNumColors=::DIBNumColors(lpDIB);//获取指向原位图信息头结构的指针lpbmi0=(LPBITMAPINFOHEADER)lpDIB;//计算原图像每行的字节数lLineBytes = WIDTHBYTES(lWidth *(lpbmi0->biBitCount)); //将旋转角度从度转换到弧度fArcAngle =(iAngle*PI)/180.0;//计算旋转角度的正弦fSin = (float) sin(fArcAngle);//计算旋转角度的余弦fCos = (float) cos(fArcAngle);//计算原图的四个角的坐标(以图像中心为坐标系原点)fSrcX1 = (float) (- (lWidth - 1) / 2);fSrcY1 = (float) ( (lHeight - 1) / 2);fSrcX2 = (float) ( (lWidth - 1) / 2);fSrcY2 = (float) ( (lHeight - 1) / 2);fSrcX3 = (float) (- (lWidth - 1) / 2);fSrcY3 = (float) (- (lHeight - 1) / 2);fSrcX4 = (float) ( (lWidth - 1) / 2);fSrcY4 = (float) (- (lHeight - 1) / 2);//计算新图四个角的坐标(以图像中心为坐标系原点)fDstX1 = fCos * fSrcX1 + fSin * fSrcY1;fDstY1 = -fSin * fSrcX1 + fCos * fSrcY1;fDstX2 = fCos * fSrcX2 + fSin * fSrcY2;fDstY2 = -fSin * fSrcX2 + fCos * fSrcY2;fDstX3 = fCos * fSrcX3 + fSin * fSrcY3;fDstY3 = -fSin * fSrcX3 + fCos * fSrcY3;fDstX4 = fCos * fSrcX4 + fSin * fSrcY4;fDstY4 = -fSin * fSrcX4 + fCos * fSrcY4;//计算旋转后的图像实际宽度lNewWidth = (LONG) ( max( fabs(fDstX4 - fDstX1),fabs(fDstX3 - fDstX2) ) + 0.5);//计算旋转后的图像高度lNewHeight = (LONG) ( max( fabs(fDstY4 - fDstY1),fabs(fDstY3 - fDstY2) ) + 0.5);//计算旋转后图像每行的字节数lNewLineBytes = WIDTHBYTES(lNewWidth * lpbmi0->biBitCount);//计算两个常数f1 = (float) (-0.5 * (lNewWidth - 1) * fCos - 0.5 * (lNewHeight - 1) * fSin + 0.5 * (lWidth - 1));f2 = (float) ( 0.5 * (lNewWidth - 1) * fSin - 0.5 * (lNewHeight - 1) * fCos + 0.5 * (lHeight - 1));//暂时分配内存,以保存新图像hDIB=(HDIB)::GlobalAlloc(GHND, lNewHeight*lNewLineBytes+*(LPDWORD)lpDIB+::PaletteSize(lpDIB));//分配内存失败,直接返回if (!hDIB)return NULL;//锁定内存lpNewDIB = (LPSTR)::GlobalLock((HGLOBAL)hDIB);//复制DIB信息头和调色板memcpy(lpNewDIB,lpDIB,*(LPDWORD)lpDIB+::PaletteSize(lpDIB));//获取图象的信息头结构的指针lpbmi=(LPBITMAPINFOHEADER)lpNewDIB;//更新DIB图象的高度和宽度lpbmi->biWidth=lNewWidth;lpbmi->biHeight=lNewHeight;//找到新DIB像素的起始位置lpNewDIBBits=(LPBYTE)::FindDIBBits(lpNewDIB);//如果是256色位图if(wNumColors==256){//旋转后图像每行for(i = 0; i<lNewHeight; i++){//旋转后图象每列for(j=0;j<lNewWidth;j++){//指向图象第i行第j个像素的指针lpDst =(LPBYTE)lpNewDIBBits + lNewLineBytes * (lNewHeight-1-i)+j; //计算每个像素点在原图象中的坐标i0 = (LONG) (-((float) j) * fSin + ((float) i) * fCos + f2 + 0.5); j0 = (LONG) ( ((float) j) * fCos + ((float) i) * fSin + f1 + 0.5); // 判断是否在源图象范围之内if( (j0 >= 0) && (j0 < lWidth) && (i0 >= 0) && (i0 < lHeight)){// 指向源DIB图象第i0行,第j0个象素的指针lpSrc = (LPBYTE)lpDIBBits + lLineBytes * (lHeight - 1 - i0) + j0; // 复制象素*lpDst = *lpSrc;}else{// 对于源图中没有的象素,直接赋值为255* ((LPBYTE)lpDst) = 255;}}}}//如果是24位真彩色位图else if(wNumColors==0){//旋转后图像每行for(i = 0; i<lNewHeight; i++){//旋转后图象每列for(j=0;j<lNewWidth;j++){//指向图象第i行第j个像素的指针lpDst =(LPBYTE)lpNewDIBBits + lNewLineBytes * (lNewHeight-1-i)+3*j; //计算每个像素点在原图象中的坐标i0 = (LONG) (-((float) j) * fSin + ((float) i) * fCos + f2 + 0.5); j0 = (LONG) ( ((float) j) * fCos + ((float) i) * fSin + f1 + 0.5); // 判断是否在源图象范围之内if( (j0 >= 0) && (j0 < lWidth) && (i0 >= 0) && (i0 < lHeight)){// 指向源DIB图象第i0行,第j0个象素的指针lpSrc = (LPBYTE)lpDIBBits + lLineBytes * (lHeight - 1 - i0) + 3*j0; // 复制象素memcpy(lpDst,lpSrc,3);}else{// 对于源图中没有的象素,直接赋值为255memset(lpDst,255,3);}}}}else{AfxMessageBox("只支持256色和真彩色位图");// 释放内存GlobalUnlock(hDIB);GlobalFree(hDIB);return NULL;}// 返回return hDIB;}3.图像缩放(对话框自己建立)void CCimageProcessingView::OnGeomZoom(){// TODO: Add your command handler code here// 图像缩放// 获取文档CCimageProcessingDoc* pDoc = GetDocument();// 指向DIB的指针LPSTR lpDIB;// 锁定DIBlpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); // 缩放比率float fXZoomRatio;float fYZoomRatio;// 创建对话框CDlgGeoZoom dlgPara;// 初始化变量值dlgPara.m_XZoom = 0.5;dlgPara.m_YZoom = 0.5;// 显示对话框,提示用户设定平移量if (dlgPara.DoModal() != IDOK){// 返回return;}// 获取用户设定的平移量fXZoomRatio = dlgPara.m_XZoom;fYZoomRatio = dlgPara.m_YZoom;// 删除对话框delete dlgPara;// 创建新DIBHDIB hNewDIB = NULL;// 更改光标形状BeginWaitCursor();// 调用ZoomDIB()函数转置DIBhNewDIB = (HDIB) ZoomDIB(lpDIB, fXZoomRatio, fYZoomRatio);// 判断缩放是否成功if (hNewDIB != NULL){// 替换DIB,同时释放旧DIB对象pDoc->ReplaceHDIB(hNewDIB);// 更新DIB大小和调色板pDoc->InitDIBData();// 设置脏标记pDoc->SetModifiedFlag(TRUE);// 重新设置滚动视图大小SetScrollSizes(MM_TEXT, pDoc->GetDocSize());// 更新视图pDoc->UpdateAllViews(NULL);}else{// 提示用户MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);}// 解除锁定::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());// 恢复光标EndWaitCursor();}/************************************************************************* ** 函数名称:* ZoomDIB()** 参数:* LPSTR lpDIB - 指向源DIB的指针* float fXZoomRatio - X轴方向缩放比率* float fYZoomRatio - Y轴方向缩放比率** 返回值:* HGLOBAL - 缩放成功返回新DIB句柄,否则返回NULL。