visual Studio MFC 平台实现拉普拉斯和拉普拉斯与直方图均衡化与中值滤波相结合实现比较

这篇具有很好参考价值的文章主要介绍了visual Studio MFC 平台实现拉普拉斯和拉普拉斯与直方图均衡化与中值滤波相结合实现比较。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

拉普拉斯变换的原理与应用

本文使用visual Studio MFC 平台实现图像增强中的拉普拉斯变换,同时拉普拉斯一般不会单独使用,与其他平滑操作相结合,本文使用了拉普拉斯与直方图均衡化以及与中值滤波相结合,也对三种方式进行了对比

关于基础工程的创建可以参考
01-Visual Studio 使用MFC 单文档工程绘制单一颜色直线和绘制渐变颜色的直线

02-visual Studio MFC 绘制单一颜色三角形、渐变颜色边框三角形、渐变填充三角形、边框渐变的正方形与填充渐变的正方形实例
03-visual Studio MFC 平台实现图像增强中的线性变换(负变换)和非线性变换(对数与幂律)
04-MFC实现图像增强–分段式变换(灰度级切片,对比度拉伸,Bit-plane slicing)
05-visual Studio MFC 平台实现对灰度图添加椒盐噪声,并进行均值滤波与中值滤波

一、 拉普拉斯变换的原理

拉普拉斯变换的原理如下:

拉普拉斯变换是图像处理中一种用于增强图像边缘的技术。它可以通过高通滤波来突出图像中的边缘特征。拉普拉斯变换的离散形式通常通过卷积运算实现。

  1. 离散拉普拉斯运算符: 在离散图像中,拉普拉斯运算符可以表示为:

∇ 2 f ( x , y ) = f ( x + 1 , y ) + f ( x − 1 , y ) + f ( x , y + 1 ) + f ( x , y − 1 ) − 4 f ( x , y ) \nabla^2 f(x, y) = f(x+1, y) + f(x-1, y) + f(x, y+1) + f(x, y-1) - 4f(x, y) 2f(x,y)=f(x+1,y)+f(x1,y)+f(x,y+1)+f(x,y1)4f(x,y)

其中, f ( x , y ) f(x, y) f(x,y) 是图像在位置 ( x , y ) (x, y) (x,y)处的灰度值。

对于离散图像,拉普拉斯变换可以使用以下的卷积核来实现:

  0  -1   0
 -1   4  -1
  0  -1   0

这个卷积核对图像进行卷积运算,计算每个像素与其周围像素的差异,从而强调了图像中的边缘。在卷积运算中,将卷积核与图像的每个像素进行乘法,然后将结果相加。这个过程在整个图像上进行,产生一个新的图像,其中强调了边缘。
2. 连续拉普拉斯运算符: 在连续图像中,拉普拉斯运算符可以表示为:

∇ 2 f ( x , y ) = ∂ 2 f ∂ x 2 + ∂ 2 f ∂ y 2 \nabla^2 f(x, y) = \frac{\partial^2 f}{\partial x^2} + \frac{\partial^2 f}{\partial y^2} 2f(x,y)=x22f+y22f

它表示图像中各个点的强度与其周围点的强度之差的二阶导数。

  1. 应用: 对图像应用拉普拉斯变换将突出显示图像中的边缘和细节,因为这些区域通常具有灰度变化。拉普拉斯变换后的图像可以通过以下公式得到:

LaplacianImage = OriginalImage − SmoothedImage \text{LaplacianImage} = \text{OriginalImage} - \text{SmoothedImage} LaplacianImage=OriginalImageSmoothedImage

这里, SmoothedImage \text{SmoothedImage} SmoothedImage 是原始图像经过平滑处理(如高斯模糊)后的图像。
在实际应用中,拉普拉斯变换通常用于边缘检测或图像锐化。然而,由于它对噪声敏感,常常需要与其他技术一起使用,例如高斯滤波,以减小噪声的影响。

在数字图像处理中,通常使用卷积操作来实现拉普拉斯变换。卷积核的选择影响着变换的效果。拉普拉斯变换对于边缘检测和图像增强等任务非常有用。

二、 拉普拉斯实现

2.1单独拉普拉斯实现代码

 // 定义拉普拉斯核
 int laplacianKernel[3][3] = {
  { -1, -1, -1 },
  { -1,  8, -1 },
  { -1, -1, -1 }
 };

 // 应用卷积运算
 for (int y = 1; y < bmpHeight - 1; ++y) {
  for (int x = 1; x < bmpWidth - 1; ++x) {
   int sum = 0;
   for (int i = -1; i <= 1; ++i) {
    for (int j = -1; j <= 1; ++j) {
     sum += laplacianKernel[i + 1][j + 1] * gray_data[(y + i) * bmpWidth + (x + j)];
    }
   }
   laplacian_data[y * bmpWidth + x] = static_cast<unsigned char>(sum);
  }
 }
 CClientDC dc(this);
 CDC* pDC = &dc;
 
 m_pBmp->drawGrayBmp(pDC, laplacian_data, bmpWidth, bmpHeight, offset_left, offset_top +4 * bmpHeight+30);

 // 释放临时数组内存
 delete[] laplacian_data;

单独拉普拉斯实现效果

visual Studio MFC 平台实现拉普拉斯和拉普拉斯与直方图均衡化与中值滤波相结合实现比较,MFC学习,visual studio,mfc,计算机视觉,数字图像处理,c++

2.2 拉普拉斯与直方图均衡化相结合实现代码

// 计算直方图
int histogram[256] = { 0 };
for (int i = 0; i < bmpWidth * bmpHeight; ++i) {
 histogram[gray_data[i]]++;
}

// 计算累积分布函数(CDF)
int cdf[256] = { 0 };
cdf[0] = histogram[0];
for (int i = 1; i < 256; ++i) {
 cdf[i] = cdf[i - 1] + histogram[i];
}

// 映射灰度级别到临时变量
unsigned char* temp_data = new unsigned char[bmpWidth * bmpHeight];
int min_cdf = cdf[0];
for (int i = 0; i < bmpWidth * bmpHeight; ++i) {
 temp_data[i] = static_cast<unsigned char>(255 * (cdf[gray_data[i]] - min_cdf) / (bmpWidth * bmpHeight - min_cdf));
}

// 应用拉普拉斯变换
unsigned char* laplacian_data = new unsigned char[bmpWidth * bmpHeight];
int laplacianKernel[3][3] = {
 { -1, -1, -1 },
 { -1,  8, -1 },
 { -1, -1, -1 }
};
for (int y = 1; y < bmpHeight - 1; ++y) {
 for (int x = 1; x < bmpWidth - 1; ++x) {
  int sum = 0;
  for (int i = -1; i <= 1; ++i) {
   for (int j = -1; j <= 1; ++j) {
    sum += laplacianKernel[i + 1][j + 1] * temp_data[(y + i) * bmpWidth + (x + j)];
   }
  }
  laplacian_data[y * bmpWidth + x] = static_cast<unsigned char>(sum);
 }
}

// 绘制均衡化后的图像
//m_pBmp->drawGrayBmp(pDC, temp_data, bmpWidth, bmpHeight, offset_left + 900, offset_top);

// 绘制经拉普拉斯变换后的图像
m_pBmp->drawGrayBmp(pDC, laplacian_data, bmpWidth, bmpHeight, offset_left+bmpWidth, offset_top + 4* bmpHeight + 30);

拉普拉斯与直方图均衡化相结合实现效果

visual Studio MFC 平台实现拉普拉斯和拉普拉斯与直方图均衡化与中值滤波相结合实现比较,MFC学习,visual studio,mfc,计算机视觉,数字图像处理,c++

2.3 拉普拉斯与中值滤波相结合实现

// 中值滤波
for (int y = 1; y < bmpHeight - 1; ++y) {
 for (int x = 1; x < bmpWidth - 1; ++x) {
  // 获取3x3邻域内的像素值
  unsigned char neighborhood[9] = {
   gray_data[(y - 1) * bmpWidth + x - 1], gray_data[(y - 1) * bmpWidth + x], gray_data[(y - 1) * bmpWidth + x + 1],
   gray_data[y * bmpWidth + x - 1], gray_data[y * bmpWidth + x], gray_data[y * bmpWidth + x + 1],
   gray_data[(y + 1) * bmpWidth + x - 1], gray_data[(y + 1) * bmpWidth + x], gray_data[(y + 1) * bmpWidth + x + 1]
  };

  // 对邻域内像素值进行排序
  std::sort(neighborhood, neighborhood + 9);

  // 取中值作为当前像素值
  temp_data[y * bmpWidth + x] = neighborhood[4];
 }
}

// 拉普拉斯变换
int laplacianKernel[3][3] = {
 { -1, -1, -1 },
 { -1,  8, -1 },
 { -1, -1, -1 }
};

// 应用卷积运算
for (int y = 1; y < bmpHeight - 1; ++y) {
 for (int x = 1; x < bmpWidth - 1; ++x) {
  int sum = 0;
  for (int i = -1; i <= 1; ++i) {
   for (int j = -1; j <= 1; ++j) {
    sum += laplacianKernel[i + 1][j + 1] * temp_data[(y + i) * bmpWidth + (x + j)];
   }
  }
  median_laplacian_data[y * bmpWidth + x] = static_cast<unsigned char>(sum);
 }
}

CClientDC dc(this);
CDC* pDC = &dc;

// 显示结果
//m_pBmp->drawGrayBmp(pDC, temp_data, bmpWidth, bmpHeight, offset_left, offset_top);
m_pBmp->drawGrayBmp(pDC, median_laplacian_data, bmpWidth, bmpHeight, offset_left + 2*bmpWidth, offset_top + 4 * bmpHeight + 30);

中值滤波与拉普拉斯相结合实现效果

visual Studio MFC 平台实现拉普拉斯和拉普拉斯与直方图均衡化与中值滤波相结合实现比较,MFC学习,visual studio,mfc,计算机视觉,数字图像处理,c++

可以观看出在添加一些平滑操作后,与单独进行拉普拉斯变换还是有一些区别的,当然最后实现的效果可以调节拉普拉斯算子进行调节,以达到相应的效果。文章来源地址https://www.toymoban.com/news/detail-757517.html

到了这里,关于visual Studio MFC 平台实现拉普拉斯和拉普拉斯与直方图均衡化与中值滤波相结合实现比较的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 拉普拉斯矩阵的定义,常见的几种形式以及代码实现?

    拉普拉斯矩阵(Laplacian matrix) 也叫做导纳矩阵、基尔霍夫矩阵或离散拉普拉斯算子,主要应用在图论中,作为一个图的矩阵表示。对于图 G=(V,E),其Laplacian 矩阵的定义为 L=D-A,其中 L 是Laplacian 矩阵, D=diag(d)是顶点的度矩阵(对角矩阵),d=rowSum(A),对角线上元素依次为各个顶点

    2023年04月25日
    浏览(48)
  • 【信号与系统】(二十一)拉普拉斯变换与复频域分析——拉普拉斯变换及其性质

    傅里叶变换: j w jw j w 拉普拉斯变换: s = σ + j w s=sigma+jw s = σ + j w 有些函数不满足绝对可积条件 ,求解傅里叶变换困难。为此,可用一衰减因子 e − σ t e^{-sigma t} e − σ t ( σ sigma σ 为实常数)乘信号 f ( t ) f(t) f ( t ) ,适当选取 σ sigma σ 的值,使乘积信号 f ( t ) e −

    2024年02月09日
    浏览(60)
  • 拉普拉斯算子

    在介绍拉普拉斯算子概念之前我们先介绍,哈密尔顿算子( ∇ nabla ∇ ),梯度,散度等概念 所谓哈密尔顿算子即为某一物理量在笛卡尔坐标系下的偏导数的矢量和,其运算符号为: ∇ nabla ∇ ,定义如下: ∇ = δ δ x i + δ δ y j + δ δ z k nabla={frac{delta}{delta x}}pmb{i}+{f

    2024年02月09日
    浏览(49)
  • 拉普拉斯变换

    1.公式:设f(t)在t≥0时有定义, 其中s=β+jw。 注:L(1)=   L(sgnt)=   L()= 2.性质         性质1:          性质2:          性质3:         性质4:L()= 推导性质2:使用欧拉公式进行推导 同理,cosat= ,使用分部积分法,经过两次分部积分后会出现原来的积分,通过合并

    2024年02月05日
    浏览(46)
  • 【电路分析】拉普拉斯变换及其应用

    零状态响应 是指电路的外加激励源为零的情况下,由动态元件的初始储能引起的响应。 零输入响应 是指电路的初始状态为零(即换路前电容电压为零,电感电流为零),由外加激励源产生的响应。 该函数在 t0时幅值为1,在 t0 时幅值为-0,在 t=0时函数没有定义但为有限值

    2024年02月03日
    浏览(46)
  • 【线性代数】P3 拉普拉斯定理

    拉普拉斯定理是通过对余子式和代数余子式的变形展开得到,有关余子式和代数余子式的概念见:https://blog.csdn.net/weixin_43098506/article/details/126765390 假设有四阶行列式: k阶子式 行列式D的一个二阶子式为: 余子式 那么二阶子式A的余子式为: 代数余子式 那么二阶子式的代数余

    2024年02月12日
    浏览(46)
  • 基于拉普拉斯金字塔的图像融合

    仅为笔记,供自己使用。 读入两幅大小相同的图像 img1 img2; 构建 img1 img2的 高斯金字塔,层数根据需要设定(本实验为7层); 根据高斯金字塔和拉普拉斯金字塔的关系,推出拉普拉斯金字塔的Li(也为7层,第一层大小和原图相同); 在 两组拉普拉斯图层 的每一层进行图像

    2024年02月11日
    浏览(47)
  • 图谱论学习—拉普拉斯矩阵背后的含义

    一、为什么学习拉普拉斯矩阵     早期,很多图神经网络的概念是基于图信号分析或图扩散的,而这些都需要与图谱论相关的知识。并且在图网络深度学习中(graph deep learning)中,拉普拉斯矩阵是很常用的概念,深入理解其物理含义非常有助于加深对GNN模型的理解。博主最

    2023年04月09日
    浏览(45)
  • Opencv 图像金字塔----高斯和拉普拉斯

    原文:图像金字塔----高斯和拉普拉斯 图像金字塔 是图像中多尺度表达的一种,最初用于机器视觉和图像压缩,最主要用于图像的分割、融合。 高斯金字塔是由底部的最大分辨率图像逐次向下采样得到的一系列图像。最下面的图像分辨率最高,越往上图像分辨率越低。 高斯

    2024年02月09日
    浏览(45)
  • 图像处理之LoG算子(高斯拉普拉斯)

    LoG算子是由拉普拉斯算子改进而来。拉普拉斯算子是二阶导数算子,是一个标量,具有线性、位移不变性,其传函在频域空间的原点为0。所有经过拉普拉斯算子滤波的图像具有零平均灰度。但是该算子的缺点是对噪声具有敏感性,因此在实际应用中,一般先要对图像进行平滑

    2024年02月16日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包