作业帮 > 综合 > 作业

《遥感导论》中有一个知识点:图像卷积运算.不是很理解,请问有没有具体的例子?

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/03 03:40:05
《遥感导论》中有一个知识点:图像卷积运算.不是很理解,请问有没有具体的例子?
对一个5*5的图像和一个3*3的图像做卷积运算,具体过程如下:
*
* 函数名称:
* TemplateMatchDIB()
*
* 参数:
* LPSTR lpDIBBits - 指向源DIB图像指针
* LPSTR lpDIBBitsBK - 指向背景DIB图像指针
* LONG lWidth - 源图像宽度(象素数)
* LONG lHeight - 源图像高度(象素数)
* LONG lTemplateWidth - 模板图像宽度(象素数)
* LONG lTemplateHeight - 模板图像高度(象素数)
*
* 返回值:
* BOOL - 运算成功返回TRUE,否则返回FALSE.
*
* 说明:
* 该函数用于对图像进行模板匹配运算.
*
* 要求目标图像为255个灰度值的灰度图像.
/

BOOL WINAPI TemplateMatchDIB (LPSTR lpDIBBits, LPSTR lpTemplateDIBBits, LONG lWidth, LONG lHeight,
LONG lTemplateWidth,LONG lTemplateHeight)
{
// 指向源图像的指针
LPSTR lpSrc,lpTemplateSrc;

// 指向缓存图像的指针
LPSTR lpDst;

// 指向缓存DIB图像的指针
LPSTR lpNewDIBBits;
HLOCAL hNewDIBBits;

//循环变量
long i;
long j;
long m;
long n;

//中间结果
double dSigmaST;
double dSigmaS;
double dSigmaT;

//相似性测度
double R;

//最大相似性测度
double MaxR;

//最大相似性出现位置
long lMaxWidth;
long lMaxHeight;

//像素值
unsigned char pixel;
unsigned char templatepixel;

// 图像每行的字节数
LONG lLineBytes,lTemplateLineBytes;

// 暂时分配内存,以保存新图像
hNewDIBBits = LocalAlloc(LHND, lWidth * lHeight);

if (hNewDIBBits == NULL)
{
// 分配内存失败
return FALSE;
}

// 锁定内存
lpNewDIBBits = (char * )LocalLock(hNewDIBBits);

// 初始化新分配的内存,设定初始值为255
lpDst = (char *)lpNewDIBBits;
memset(lpDst, (BYTE)255, lWidth * lHeight);

// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);
lTemplateLineBytes = WIDTHBYTES(lTemplateWidth * 8);

//计算dSigmaT
dSigmaT = 0;
for (n = 0;n < lTemplateHeight ;n++)
{
for(m = 0;m < lTemplateWidth ;m++)
{
// 指向模板图像倒数第j行,第i个象素的指针
lpTemplateSrc = (char *)lpTemplateDIBBits + lTemplateLineBytes * n + m;
templatepixel = (unsigned char)*lpTemplateSrc;
dSigmaT += (double)templatepixel*templatepixel;
}
}

//找到图像中最大相似性的出现位置
MaxR = 0.0;
for (j = 0;j < lHeight - lTemplateHeight +1 ;j++)
{
for(i = 0;i < lWidth - lTemplateWidth + 1;i++)
{
dSigmaST = 0;
dSigmaS = 0;

for (n = 0;n < lTemplateHeight ;n++)
{
for(m = 0;m < lTemplateWidth ;m++)
{
// 指向源图像倒数第j+n行,第i+m个象素的指针
lpSrc = (char *)lpDIBBits + lLineBytes * (j+n) + (i+m);

// 指向模板图像倒数第n行,第m个象素的指针
lpTemplateSrc = (char *)lpTemplateDIBBits + lTemplateLineBytes * n + m;

pixel = (unsigned char)*lpSrc;
templatepixel = (unsigned char)*lpTemplateSrc;

dSigmaS += (double)pixel*pixel;
dSigmaST += (double)pixel*templatepixel;
}
}
//计算相似性
R = dSigmaST / ( sqrt(dSigmaS)*sqrt(dSigmaT));
//与最大相似性比较
if (R > MaxR)
{
MaxR = R;
lMaxWidth = i;
lMaxHeight = j;
}
}
}

//将最大相似性出现区域部分复制到目标图像
for (n = 0;n < lTemplateHeight ;n++)
{
for(m = 0;m < lTemplateWidth ;m++)
{
lpTemplateSrc = (char *)lpTemplateDIBBits + lTemplateLineBytes * n + m;
lpDst = (char *)lpNewDIBBits + lLineBytes * (n+lMaxHeight) + (m+lMaxWidth);
*lpDst = *lpTemplateSrc;
}
}

// 复制图像
memcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight);

// 释放内存
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);

// 返回
return TRUE;
}Top
这是模板匹配的代码,
里面用的就是时域卷积的算法.

同时,时域的卷积就是频域的乘积,
可以把时域的图转化成频域,相乘.

ps
卷积需要补位,
a ,b
l >= a+b-1;