///////////////////////////////////////////////////////////////////////
// DibImage.cpp: implementation of the CDibImage class.
// DIB(Independent Bitmap) 函数:
//
// PaintDIB() - 绘制DIB对象
// CreateDIBPalette() - 创建DIB对象调色板
// FindDIBBits() - 返回DIB图像象素起始位置
// DIBWidth() - 返回DIB宽度
// DIBHeight() - 返回DIB高度
// PaletteSize() - 返回DIB调色板大小
// DIBNumColors() - 计算DIB调色板颜色数目
// CopyHandle() - 拷贝内存块
//
// SaveDIB() - 将DIB保存到指定文件中
// ReadDIBFile() - 重指定文件中读取DIB对象
//
// 图像点运算函数:
//
// LinerTrans() - 图像线性变换
// WindowTrans() - 图像窗口变换
// GrayStretch() - 图像灰度拉伸
// InteEqualize() -直方图均衡
//
// 图像几何变换函数
// TranslationDIB1() - 图像平移
// TranslationDIB() - 图像平移
// MirrorDIB() - 图像镜像
// TransposeDIB() - 图像转置
// ZoomDIB() - 图像缩放
// RotateDIB() - 图像旋转
//
// 图像正交变换函数:
//
// FFT() - 快速付立叶变换
// IFFT() - 快速付立叶反变换
// DCT() - 离散余弦变换
// WALSH() - 沃尔什-哈达玛变换
//
// Fourier() - 图像的付立叶变换
// DIBDct() - 图像的离散余弦变换
// DIBWalsh() - 图像的沃尔什-哈达玛变换
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Direct.h"
#include "DibImage.h"
#include <math.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDibImage::CDibImage()
{
}
CDibImage::~CDibImage()
{
}
//////////////////////////////////////////////////////////////////////
// DIB(Independent Bitmap) 函数
//////////////////////////////////////////////////////////////////////
/*************************************************************************
* 函数名称:
* PaintDIB()
* 参数:
* HDC hDC - 输出设备DC
* LPRECT lpDCRect - 绘制矩形区域
* HDIB hDIB - 指向DIB对象的指针
* LPRECT lpDIBRect - 要输出的DIB区域
* CPalette* pPal - 指向DIB对象调色板的指针
* 返回值:
* BOOL - 绘制成功返回TRUE,否则返回FALSE。
* 说明:
* 该函数主要用来绘制DIB对象。其中调用了StretchDIBits()或者
* SetDIBitsToDevice()来绘制DIB对象。输出的设备由由参数hDC指
* 定;绘制的矩形区域由参数lpDCRect指定;输出DIB的区域由参数
* lpDIBRect指定。
************************************************************************/
BOOL CDibImage::PaintDIB(HDC hDC,
LPRECT lpDCRect,
HDIB hDIB,
LPRECT lpDIBRect,
CPalette* pPal)
{
LPSTR lpDIBHdr; // BITMAPINFOHEADER指针
LPSTR lpDIBBits; // DIB象素指针
BOOL bSuccess=FALSE; // 成功标志
HPALETTE hPal=NULL; // DIB调色板
HPALETTE hOldPal=NULL; // 以前的调色板
if (hDIB == NULL)
{
return FALSE;
}
lpDIBHdr = (LPSTR)::GlobalLock((HGLOBAL) hDIB);// 锁定DIB
lpDIBBits = FindDIBBits(lpDIBHdr); // 找到DIB图像象素起始位置
if (pPal != NULL) // 获取DIB调色板,并选中它
{
hPal = (HPALETTE) pPal->m_hObject;
hOldPal = ::SelectPalette(hDC, hPal, TRUE); // 选中调色板
}
::SetStretchBltMode(hDC, COLORONCOLOR); // 设置显示模式
// 判断是调用StretchDIBits()还是SetDIBitsToDevice()来绘制DIB对象
if ((RECTWIDTH(lpDCRect) == RECTWIDTH(lpDIBRect)) &&
(RECTHEIGHT(lpDCRect) == RECTHEIGHT(lpDIBRect)))
{
// 原始大小,不用拉伸。
bSuccess = ::SetDIBitsToDevice(hDC, // hDC
lpDCRect->left, // DestX
lpDCRect->top, // DestY
RECTWIDTH(lpDCRect), // nDestWidth
RECTHEIGHT(lpDCRect), // nDestHeight
lpDIBRect->left, // SrcX
(int)DIBHeight(lpDIBHdr) -
lpDIBRect->top -
RECTHEIGHT(lpDIBRect), // SrcY
0, // nStartScan
(WORD)DIBHeight(lpDIBHdr), // nNumScans
lpDIBBits, // lpBits
(LPBITMAPINFO)lpDIBHdr, // lpBitsInfo
DIB_RGB_COLORS); // wUsage
}
else
{
// 非原始大小,拉伸。
bSuccess = ::StretchDIBits(hDC, // hDC
lpDCRect->left, // DestX
lpDCRect->top, // DestY
RECTWIDTH(lpDCRect), // nDestWidth
RECTHEIGHT(lpDCRect), // nDestHeight
lpDIBRect->left, // SrcX
lpDIBRect->top, // SrcY
RECTWIDTH(lpDIBRect), // wSrcWidth
RECTHEIGHT(lpDIBRect), // wSrcHeight
lpDIBBits, // lpBits
(LPBITMAPINFO)lpDIBHdr, // lpBitsInfo
DIB_RGB_COLORS, // wUsage
SRCCOPY); // dwROP
}
::GlobalUnlock((HGLOBAL) hDIB); // 解除锁定
if (hOldPal != NULL)
{
::SelectPalette(hDC, hOldPal, TRUE); // 恢复以前的调色板
}
return bSuccess;
}
/*************************************************************************
* 函数名称:
* CreateDIBPalette()
* 参数:
* HDIB hDIB - 指向DIB对象的指针
* CPalette* pPal - 指向DIB对象调色板的指针
* 返回值:
* BOOL - 创建成功返回TRUE,否则返回FALSE。
* 说明:
* 该函数按照DIB创建一个逻辑调色板,从DIB中读取颜色表并存到调色板中,
* 最后按照该逻辑调色板创建一个新的调色板,并返回该调色板的句柄。这样
* 可以用最好的颜色来显示DIB图像。
************************************************************************/
BOOL CDibImage::CreateDIBPalette(HDIB hDIB, CPalette* pPal)
{
LPLOGPALETTE lpPal; // 指向逻辑调色板的指针
HANDLE hLogPal; // 逻辑调色板的句柄
HPALETTE hPal = NULL; // 调色板的句柄
int i; // 循环变量
WORD wNumColors; // 颜色表中的颜色数目
LPSTR lpbi; // 指向DIB的指针
LPBITMAPINFO lpbmi; // 指向BITMAPINFO结构的指针(Win3.0)
LPBITMAPCOREINFO lpbmc; // 指向BITMAPCOREINFO结构的指针
BOOL bWinStyleDIB; // 表明是否是Win3.0 DIB的标记
BOOL bResult = FALSE; // 创建结果
if (hDIB == NULL)
{
return FALSE;
}
lpbi = (LPSTR) ::GlobalLock((HGLOBAL) hDIB); // 锁定DIB
lpbmi = (LPBITMAPINFO)lpbi; // 获取指向BITMAPINFO结构的指针(Win3.0)
lpbmc = (LPBITMAPCOREINFO)lpbi; // 获取指向BITMAPCOREINFO结构的指针
wNumColors = DIBNumColors(lpbi);// 获取DIB中颜色表中的颜色数目
if (wNumColors != 0)
{
// 分配为逻辑调色板内存
hLogPal = ::GlobalAlloc(GHND, sizeof(LOGPALETTE)
+ sizeof(PALETTEENTRY)
* wNumColors);
// 如果内存不足,退出
if (hLogPal == 0)
{
::GlobalUnlock((HGLOBAL) hDIB); // 解除锁定
return FALSE;
}
lpPal = (LPLOGPALETTE) ::GlobalLock((HGLOBAL) hLogPal);
lpPal->palVersion = PALVERSION; // 设置版本号
lpPal->palNumEntries = (WORD)wNumColors;// 设置颜色数目
bWinStyleDIB = IS_WIN30_DIB(lpbi); // 判断是否是WIN3.0的DIB
// 读取调色板
for (i = 0; i < (int)wNumColors; i++)
{
if (bWinStyleDIB)
{
// 读取红色绿色蓝色分量
lpPal->palPalEntry[i].peRed = lpbmi->bmiColors[i].rgbRed;
lpPal->palPalEntry[i].peGreen = lpbmi->bmiColors[i].rgbGreen;
lpPal->palPalEntry[i].peBlue = lpbmi->bmiColors[i].rgbBlue;
// 保留位
lpPal->palPalEntry[i].peFlags = 0;
}
else
{
// 读取红色绿色蓝色分量
lpPal->palPalEntry[i].peRed = lpbmc->bmciColors[i].rgbtRed;
lpPal->palPalEntry[i].peGreen = lpbmc->bmciColors[i].rgbtGreen;
lpPal->palPalEntry[i].peBlue = lpbmc->bmciColors[i].rgbtBlue;
// 保留位
lpPal->palPalEntry[i].peFlags = 0;
}
}
bResult = pPal->CreatePalette(lpPal);// 按照逻辑调色板创建调色板,并返回指针
::GlobalUnlo
图像变换到频谱图-有FFT-DCT等4种变换-可直接运行



在图像处理领域,图像变换是将图像从空间域转换到其他表示域,如频率域,以便于分析和处理。这个压缩包"图像变换到频谱图-有FFT-DCT等4种变换-可直接运行"提供了对灰度图像进行频谱变换的工具,包括傅里叶变换(FFT)、快速傅里叶变换(FFT)、离散余弦变换(DCT)等方法。这些方法在图像处理、信号处理以及通信领域都有着广泛的应用。 傅里叶变换是一种数学上的工具,它能够将一个函数从其原始的时域或空间域表示转化为频率域表示。在图像处理中,傅里叶变换用于揭示图像的频率成分,即图像中的高频部分通常对应于图像的边缘和细节,而低频部分则对应于图像的整体亮度和色调变化。快速傅里叶变换是傅里叶变换的一种优化算法,大大减少了计算复杂性,使其在实际应用中成为首选。 离散余弦变换,特别是在JPEG图像压缩标准中被广泛应用,是一种将图像从空间域转换到频率域的方法。DCT分解图像为一系列余弦函数的系数,其中低频系数对应图像的主要成分,而高频系数则代表图像的噪声和细节。DCT的一个关键特性是它的系数在数值上相对集中,因此可以通过丢弃或降低高频系数的精度来实现图像的有损压缩。 该压缩包中包含的VC++程序提供了一个用户界面,使得用户可以直接加载灰度图像,然后选择不同的变换类型,如FFT或DCT,观察变换后的频谱图。这为学习和理解这些变换提供了直观的可视化工具。通过查看频谱图,用户可以分析图像的频率特性,进一步了解图像的质量和特征。 此外,使用VC++(Visual C++)作为编程语言,意味着这个程序是基于Windows平台的,并且可能使用了MFC(Microsoft Foundation Classes)库来构建图形用户界面。这为用户提供了友好的交互体验,同时也为开发者提供了方便的开发环境和丰富的库支持。 总结来说,这个压缩包提供的工具集不仅能够帮助用户理解图像的频率域表示,还展示了不同变换方法在实际操作中的应用。对于学习图像处理、信号处理或相关领域的人来说,这是一个非常有价值的资源,它涵盖了理论知识与实践经验的结合,有助于深化对图像变换和频谱分析的理解。




































- 1

- 粉丝: 0
- 资源: 1
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助



最新资源
- 光伏混合储能VSG并网Simulink仿真模型:功率分配、一次调频、无功调压与虚拟阻抗
- 基于COMSOL的铝板Lamb波检测:160kHz压电片与胶层耦合特性及应用
- 三菱FX3U与台达DTK温控器基于Modbus RTU协议的通讯实现及优化
- 非线性控制系统中反步动态面控制与一阶低通滤波器的应用及优化
- 基于卷积神经网络(CNN)的锂电池SOH估算方法及其Matlab实现
- 高频注入技术在电机控制中的Simulink仿真与STM32实现及优化
- 电动汽车动力系统与整车经济性计算模型解析及应用
- 西门子S7-1500 PLC在制药厂洁净空调BMS系统中的应用:串级PID与分程调节实现高精度温湿度控制
- 基于COMSOL的变压器铁心磁致伸缩振动仿真及优化方法探讨
- 基于MATLAB的栅格地图人工势场法动态路径规划及其与A*和RRT算法的融合
- 基于STM32G474的400W微型逆变器设计方案:高精度定时器与全桥拓扑的应用
- CVPR2023新注意力机制优化YOLOv5/v7/v8的目标检测性能
- 2023-04-06-项目笔记 - 第四百五十八阶段 - 4.4.2.456全局变量的作用域-456 -2025.04-04
- 基于元胞自动机的城市交通流仿真:公交车专用道对车速影响的研究
- 基于三菱PLC与组态王的污水处理自动化系统设计与实战经验分享
- 基于三菱PLC和组态王的兰花智能灌溉控制系统设计与应用



- 1
- 2
- 3
- 4
- 5
前往页