通用的图像模板操作函数
2007-01-25 09:50
260 查看
需要只想图像象素的指针以及图像的高宽信息,变换模板的信息,包括模板到小信息,模板稀疏,模板元素数组和模板中心元素的位置信息。
/*************************************************************************
* 函数名称:
* Template()
* 参数:
* LPSTR lpDIBBits - 指向源DIB图像指针
* LONG lWidth - 源图像宽度(象素数)
* LONG lHeight - 源图像高度(象素数)
* int iTempH - 模板的高度
* int iTempW - 模板的宽度
* int iTempMX - 模板的中心元素X坐标 ( < iTempW - 1)
* int iTempMY - 模板的中心元素Y坐标 ( < iTempH - 1)
* FLOAT * fpArray - 指向模板数组的指针
* FLOAT fCoef - 模板系数
* 返回值:
* BOOL - 成功返回TRUE,否则返回FALSE。
* 说明:
* 该函数用指定的模板(任意大小)来对图像进行操作,参数iTempH指定模板
* 的高度,参数iTempW指定模板的宽度,参数iTempMX和iTempMY指定模板的中心
* 元素坐标,参数fpArray指定模板元素,fCoef指定系数。
************************************************************************/
BOOL Bmp::Template(u8_t **lpDIBBits, LONG lWidth, LONG lHeight, int iTempH, int iTempW, int iTempMX, int iTempMY, FLOAT * fpArray, FLOAT fCoef){
u8_t **lpNewDIBBits; // 指向复制图像的指针
u8_t* lpSrc; // 指向源图像的指针
u8_t* lpDst; // 指向要复制区域的指针
LONG i,j,k,l; // 循环变量
FLOAT fResult; // 计算结果
u32_t lLineBytes; // 图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);
// 暂时分配内存,以保存新图像
lpNewDIBBits = (u8_t **)malloc((u32_t)lLineBytes*lHeight*10);
// 初始化图像为原始图像
memcpy(lpNewDIBBits, lpDIBBits, lLineBytes * lHeight);
for(i = iTempMY; i < lHeight - iTempH + iTempMY + 1; i++) // 行(除去边缘几行)
{
for(j = iTempMX; j < lWidth - iTempW + iTempMX + 1; j++)// 列(除去边缘几列)
{
// 指向新DIB第i行,第j个象素的指针
lpDst = (u8_t *)lpNewDIBBits + lLineBytes * (lHeight - 1 - i) + j;
fResult = 0;
for (k = 0; k < iTempH; k++)
{
for (l = 0; l < iTempW; l++)
{
// 指向DIB第i - iTempMY + k行,第j - iTempMX + l个象素的指针
lpSrc = (u8_t *)lpDIBBits + lLineBytes * (lHeight - 1
- i + iTempMY - k) + j - iTempMX + l;
// 保存象素值
fResult += (* lpSrc) * fpArray[k * iTempW + l];
}
}
fResult *= fCoef; // 乘上系数
fResult = (FLOAT ) fabs(fResult); // 取绝对值
if(fResult > 255)
{
* lpDst = 255;
}
else
{
* lpDst = (unsigned char) (fResult + 0.5);
}
}
}
// 复制变换后的图像
memcpy(lpDIBBits, lpNewDIBBits, lLineBytes * lHeight);
free(lpNewDIBBits);
return TRUE;
}
/*************************************************************************
* 函数名称:
* Template()
* 参数:
* LPSTR lpDIBBits - 指向源DIB图像指针
* LONG lWidth - 源图像宽度(象素数)
* LONG lHeight - 源图像高度(象素数)
* int iTempH - 模板的高度
* int iTempW - 模板的宽度
* int iTempMX - 模板的中心元素X坐标 ( < iTempW - 1)
* int iTempMY - 模板的中心元素Y坐标 ( < iTempH - 1)
* FLOAT * fpArray - 指向模板数组的指针
* FLOAT fCoef - 模板系数
* 返回值:
* BOOL - 成功返回TRUE,否则返回FALSE。
* 说明:
* 该函数用指定的模板(任意大小)来对图像进行操作,参数iTempH指定模板
* 的高度,参数iTempW指定模板的宽度,参数iTempMX和iTempMY指定模板的中心
* 元素坐标,参数fpArray指定模板元素,fCoef指定系数。
************************************************************************/
BOOL Bmp::Template(u8_t **lpDIBBits, LONG lWidth, LONG lHeight, int iTempH, int iTempW, int iTempMX, int iTempMY, FLOAT * fpArray, FLOAT fCoef){
u8_t **lpNewDIBBits; // 指向复制图像的指针
u8_t* lpSrc; // 指向源图像的指针
u8_t* lpDst; // 指向要复制区域的指针
LONG i,j,k,l; // 循环变量
FLOAT fResult; // 计算结果
u32_t lLineBytes; // 图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);
// 暂时分配内存,以保存新图像
lpNewDIBBits = (u8_t **)malloc((u32_t)lLineBytes*lHeight*10);
// 初始化图像为原始图像
memcpy(lpNewDIBBits, lpDIBBits, lLineBytes * lHeight);
for(i = iTempMY; i < lHeight - iTempH + iTempMY + 1; i++) // 行(除去边缘几行)
{
for(j = iTempMX; j < lWidth - iTempW + iTempMX + 1; j++)// 列(除去边缘几列)
{
// 指向新DIB第i行,第j个象素的指针
lpDst = (u8_t *)lpNewDIBBits + lLineBytes * (lHeight - 1 - i) + j;
fResult = 0;
for (k = 0; k < iTempH; k++)
{
for (l = 0; l < iTempW; l++)
{
// 指向DIB第i - iTempMY + k行,第j - iTempMX + l个象素的指针
lpSrc = (u8_t *)lpDIBBits + lLineBytes * (lHeight - 1
- i + iTempMY - k) + j - iTempMX + l;
// 保存象素值
fResult += (* lpSrc) * fpArray[k * iTempW + l];
}
}
fResult *= fCoef; // 乘上系数
fResult = (FLOAT ) fabs(fResult); // 取绝对值
if(fResult > 255)
{
* lpDst = 255;
}
else
{
* lpDst = (unsigned char) (fResult + 0.5);
}
}
}
// 复制变换后的图像
memcpy(lpDIBBits, lpNewDIBBits, lLineBytes * lHeight);
free(lpNewDIBBits);
return TRUE;
}
相关文章推荐
- TensorFlow 图像处理和解码操作函数
- opencv矩阵图像操作函数
- opencv常用图像(矩阵)操作函数
- openCV 矩阵(图像)操作函数
- c++ 模板学习笔记:函数模板实现数组通用排序和遍历打印(权哥)
- opencv 图像简单逻辑操作汇总与一些常用的函数
- 玩转图像函数库―常见图形操作
- OpenCV图像处理篇之阈值操作函数
- openCV 矩阵(图像)操作函数---史上最全
- PHP学习 文件操作函数的应用--简单网络留言模板
- 数字图像处理—空域变换增强之滤波增强(模板操作)(模板卷积)
- matlab 图像操作函数的详解
- matlab 对于图像操作函数的详解
- 关于图像操作的几个函数
- TensorFlow 图像处理和解码操作函数概述
- OpenCV学习-常用的图像和矩阵操作函数
- (c++)类模板与函数模板实例:通用数组
- [置顶] C++ 通用可变参数高级函数模板
- 通用模板实现可变参数函数
- PHP中的图像相关函数操作