高斯模糊处理

2023-11-17

借鉴:http://blog.sina.com.cn/s/blog_861912cd0101957x.html            http://www.ruanyifeng.com/blog/2012/11/gaussian_blur.html 


二维高斯曲面的公式

高斯半径(σ)对曲线形状的影响,σ越小,曲线越高越尖,σ越大,曲线越低越平缓。因此高斯半径越小,则模糊越小,高斯半径越大,则模糊程度越大。
模版矩阵的大小一般设为 ( 6*sigma+1 ) *( 6*sigma+1 )
模版搜索半径一般为	3σ 为合适
		3*3模版
			1 2 1
			2 4 2              /16
			1 2 1
			是对r=0.849时的一个近似
			guass radius=0.849000
			0.062467   0.125000   0.062467
			0.125000   0.250131   0.125000
			0.062467   0.125000   0.062467
			int r= (f1(i - 1,j - 1) + f1(i - 1,j + 1) + f1(i + 1,j - 1) + f1(i + 1,j + 1) + (f1(i - 1,j) + f1(i,j - 1) + f1(i + 1,j) + f1(i,j + 1)) * 2 + f1(i,j) * 4 ) / 16;
			int g = (f2(i - 1, j - 1) + f2(i - 1, j + 1) + f2(i + 1, j - 1) + f2(i + 1, j + 1) + (f2(i - 1, j) + f2(i, j - 1) + f2(i + 1, j) + f2(i, j + 1)) * 2 + f2(i, j) * 4) / 16;
			int b = (f3(i - 1, j - 1) + f3(i - 1, j + 1) + f3(i + 1, j - 1) + f3(i + 1, j + 1) + (f3(i - 1, j) + f3(i, j - 1) + f3(i + 1, j) + f3(i, j + 1)) * 2 + f3(i, j) * 4) / 16;
附 :源代码
//一般情况下模版为( 6*sigma+1 ) *( 6*sigma+1 )的矩阵。 注:sigma为高斯公式中的sigma
#define sigma  1 //高斯半径
const int  N = (int)(sigma * 3);
#define M_PI 3.1415926535898
double a[2 * N + 1][2 * N + 1];
d CMFCAppDlg::CalcMatrix() //计算权重矩阵
{
	/*
	高斯半径越小,则模糊越小,高斯半径越大,则模糊程度越大。我们将看到ps对高斯半径的范围定义是【0.1~250】
	半径为r时,取σ为 r/3 是一个比较合适的取值
	*/
	int i, j;
	double A = 1 / (2 * M_PI*sigma*sigma);
	double sum = 0.0;
	for (i = -1 * N; i <= N; i++)
	{
		for (j = -1 * N; j <= N; j++)
		{
			a[i + N][j + N] = A*exp((-1)*(i*i + j*j) / (2 * sigma * sigma));
		}
	}
	if (sum == 1.0)
		return;
	for (i = 0; i < 2 * N + 1; i++)
		for (j = 0; j < 2 * N + 1; j++)
			sum += a[i][j];//计算权值和
	/*归一化:
	首先求得权重总和,为了须让它们的权重之和等于1,
	还要把上面值还要分别除以这个和,得到最终的权重矩阵。
	若滤镜的权重总值不等于1,使用总值大于1的滤镜会让图像偏亮,小于1的滤镜会让图像偏暗。
	*/
	for (i = 0; i < 2 * N + 1; i++)
		for (j = 0; j < 2 * N + 1; j++)
			a[i][j] /= sum;

}
int CMFCAppDlg::f1(int x, int y)
{
	return GetRValue(img.GetPixel(x, y));
}
int CMFCAppDlg::f2(int x, int y)
{
	return GetGValue(img.GetPixel(x, y));
	
}
int CMFCAppDlg::f3(int x, int y)
{
	return GetBValue(img.GetPixel(x, y));
}
void CMFCAppDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	bStart = TRUE;
	CDC *pDC = GetDC();
	img.Load(_T("D:\\1.png"));
	//给图片做高斯处理
	int i, j;
	for(i = N;i<img.GetWidth()-N;i++)
		for (j = N; j < img.GetHeight()-N; j++)
		{
			/*
			3*3模版
			1 2 1
			2 4 2              /16
			1 2 1
			是对r=0.849时的一个近似
			guass radius=0.849000
			0.062467   0.125000   0.062467
			0.125000   0.250131   0.125000
			0.062467   0.125000   0.062467
			int r= (f1(i - 1,j - 1) + f1(i - 1,j + 1) + f1(i + 1,j - 1) + f1(i + 1,j + 1) + (f1(i - 1,j) + f1(i,j - 1) + f1(i + 1,j) + f1(i,j + 1)) * 2 + f1(i,j) * 4 ) / 16;
			int g = (f2(i - 1, j - 1) + f2(i - 1, j + 1) + f2(i + 1, j - 1) + f2(i + 1, j + 1) + (f2(i - 1, j) + f2(i, j - 1) + f2(i + 1, j) + f2(i, j + 1)) * 2 + f2(i, j) * 4) / 16;
			int b = (f3(i - 1, j - 1) + f3(i - 1, j + 1) + f3(i + 1, j - 1) + f3(i + 1, j + 1) + (f3(i - 1, j) + f3(i, j - 1) + f3(i + 1, j) + f3(i, j + 1)) * 2 + f3(i, j) * 4) / 16;
			*/
			CalcMatrix();
			/*
			下面两层for含义:
				例: a11  a12  a13
					 a21  a22  a23
					 a31  a32  a33
				此时N等于1
				由于权值矩阵中,a11, a13, a31, a33 的值是相等的,所以只需要把四个角落的计算一遍即可
			*/
			int r, g, b;
			r = g = b = 0;
			for (int m = 0; m < N + 1; m++)
			{
				for (int n = 0; n < N + 1; n++)
				{
					if (N - m != 0 && N - n != 0)
					{
			/*
				由于高斯分布是对称的,所以只要计算左上角,然后四个角落分别相乘自己对应的矩阵权值。
				如果列或者行与中点在同一直线上,则计算两次。
				中点计算一次。
			*/
						r += f1(i - (N - m), j - (N - n))*a[m][n];
						g += f2(i - (N - m), j - (N - n))*a[m][n];
						b += f3(i - (N - m), j - (N - n))*a[m][n];

						r += f1(i - (N - m), j + (N - n))*a[m][n];
						g += f2(i - (N - m), j + (N - n))*a[m][n];
						b += f3(i - (N - m), j + (N - n))*a[m][n];

						r += f1(i + (N - m), j - (N - n))*a[m][n];
						g += f2(i + (N - m), j - (N - n))*a[m][n];
						b += f3(i + (N - m), j - (N - n))*a[m][n];

						r += f1(i + (N - m), j + (N - n))*a[m][n];
						g += f2(i + (N - m), j + (N - n))*a[m][n];
						b += f3(i + (N - m), j + (N - n))*a[m][n];
					}
					else if (N - m == 0 && N - n == 0)//中心点
					{
						r += f1(i , j )*a[m][n];
						g += f2(i , j )*a[m][n];
						b += f3(i , j )*a[m][n];
					}
					else //与中心点在同一直线上的非中心点
					{//由于在同一直线上必然有 N-m 或 N-n 为0,所以只需要- -与 + +情况
						r += f1(i - (N - m), j - (N - n))*a[m][n];
						g += f2(i - (N - m), j - (N - n))*a[m][n];
						b += f3(i - (N - m), j - (N - n))*a[m][n];

						r += f1(i + (N - m), j + (N - n))*a[m][n];
						g += f2(i + (N - m), j + (N - n))*a[m][n];
						b += f3(i + (N - m), j + (N - n))*a[m][n];
					}
				}

			}
			img.SetPixel(i, j, RGB(r,g,b));//将经过模糊处理后的像素值赋值到相应的位置
			//更新进度信息
			m_progress.SetPos((i*j) / (double)(img.GetWidth()*img.GetHeight()) * 100);
		}
	//绘制处理完成后的新图像
	img.Draw(pDC->m_hDC, 0,0);
}


 
 
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高斯模糊处理 的相关文章

  • MFC winMain 如何最终进入可执行文件?

    In MFC wWinMain定义于appmodul cpp 据我所知 该文件内置于 mfc90ud dll 中 但是 当我运行我的应用程序时 调用堆栈显示MyApplication exe wWinMain 它是如何采取的wWinMain
  • 托管和非托管 C++/MFC 可以混合在一个 dll 中吗?

    以前 我们有 MFC VC6 VB6 和 C 应用程序中的软件 需要调用用 C 和 MFC 编写的相同引擎 该引擎需要 C 来提高速度 当时我们决定使用 COM 作为接口 因为所有三个都可以使用它 并且在编组等方面的问题最少 我们的 MFC
  • Boost::序列化和 MFC Doc/View 架构

    我正在移植现有的 MFC C 应用程序以对 XML 文件使用 Boost Serialization 我的 CDocument 对象包含应用程序的所有数据 我已将序列化函数实现为 template
  • SetWindowPos() 函数不移动窗口?

    我有一个对话框 我想将其放置在另一个对话框中 并相对于主对话框上的其中一个控件进行定位 void CspAceDlg DrawResultsArea CWnd pTabCtl GetDlgItem IDC BUILDTABS CRect r
  • 具有透明背景的CWnd

    我想创建一个基于 CWnd 的类 它将引入具有透明背景的控件 只要内容是静态的 创建一个控件并用透明背景绘制其内容对我来说没什么大不了的 问题是当我想创建一个内容不断变化的控件时 这是因为我不知道如何用父背景删除控件的内容 一般情况下可能不
  • CloseWindow和WM_CLOSE有什么关系

    我现在有点困惑 是吗 WM CLOSE http msdn microsoft com en us library windows desktop ms632617 28v vs 85 29 aspx and CloseWindow htt
  • 使用 CSplitterWnd 在 CChildFrame 中创建多个视图

    我正在使用 MFC MDI 我需要创建如下视图 我的 ChildWnd 分为两部分 它们是LeftView CView 和RightView CScrollView LeftView 分为两部分 TreeView 和 FormView 我怎
  • MFC 控件上的文本 - Unicode 字符(例如日语)被截断

    背景 我正在开发一个 C MFC 应用程序 我们已经将其转换为显示 unicode 字符以支持外语 在大多数情况下 这是成功的并且 unicode 字符显示正确 但我遇到了一个问题 某些控件上的某些文本被截断 Example 在这里 您可以
  • 如何向 CMFCPopupMenu 添加图标?

    我想用CMFCPopupMenu用于右键单击期间的弹出菜单 如何添加图标CMFCPopupMenu 这是我在基本 MFC 应用程序中尝试的示例代码 CMFCPopupMenu TestCMFCPopMenu new CMFCPopupMen
  • 如何在现有 Windows 应用程序中获得 ATL 支持

    我正在 Visual Studio 2012 中使用 Qt 5 3 1 构建一个应用程序 我还想使用一个硬件库 这需要我向项目添加一个简单的 ATL 对象 这可以通过使用 Visual Studio 向导来完成 该向导抱怨我的项目既不是 M
  • 编辑默认工具栏时 Microsoft Visual Studio“未知位图格式”

    我已使用项目创建向导使用 Microsoft 基础类库 MFC 创建了一个应用程序 我创建了一个多文档界面 MDI 应用程序 该向导创建您可以使用的虚拟工具栏和菜单 我扩展了默认工具栏 没有任何问题 但是现在当我尝试通过资源视图编辑它时 我
  • 如何调整 CWnd 内 WPF 控件的大小?

    我正在托管 WPFUserControlMFC 内部CWnd 它工作得很好 我现在需要弄清楚如何与其父控件一起调整控件的大小 我已经迷上了OnSize我正在打电话GetWindowRect并将结果设置为我的控件 如下所示 void CChi
  • _CrtDumpMemoryLeaks( ) == 1 在第一行代码上?

    我正在开发一个 MFC Visual C 项目 据我了解MSDN http msdn microsoft com en us library d41t22sb 28v VS 100 29 aspx CrtDumpMemoryLeaks 应该
  • 如何使用 MFC 禁用顶级菜单项并使其变灰

    我有一个对话框应用程序 我希望在对话框顶部有可单击的菜单项 这些项目不显示下拉菜单 但实际上运行关联的命令 我通过在对话框属性中设置 Popup False 并分配消息 ID 来做到这一点 但我的问题是 当项目可点击没有意义时 无法正确禁用
  • 如何在 MFC 中调整对话框大小时移动控件?

    我已经在 MFC 中创建了对话框视图 从下图中可以清楚地看到 如滑块控件和编辑框等 当我调整对话框大小时 这些控件不会移动 在此输入图像描述 https i stack imgur com 7OxAK jpg 我想移动控件以适应对话框 但不
  • 具有键唯一性和按位置排序的 MFC 字典集合

    看着表上http msdn microsoft com en us library y1z022s1 28v vs 80 29 aspx core collection shape features http msdn microsoft
  • C++ 中的转换错误

    有人可以帮我解决这个错误吗 我是 C 新手 看来错误就发生在一堆宏中 我能做什么来解决它 或者我怎样才能追踪到它的源头 我真的不明白这个错误 这是否意味着编译器尝试转换该方法void ReadCPUparameter to a LRESUL
  • 使用 MFC 对象初始化 std::map 无法编译

    MFC初学者看这里 我尝试过初始化std map像这样 在CView的标题中 myprogramView h std map
  • MFC:从另一个线程调用 CWnd 方法安全吗?

    其实我有两个问题 打电话安全吗SendMessage来自工作线程 Do CWnd方法 比如MessageBox 调用API函数SendMessage幕后 根据我的理解 当工作线程调用时SendMessage 它将消息推送到UI线程的消息队列
  • 支持 ARM 上的 Windows 10 桌面应用程序 - MFC 和 COM 以及 OPOS 可以工作吗?

    我试图了解将在 x86 Windows 10 上运行的 C MFC 应用程序移植到具有 Qualcomm Snapdragon 处理器的 ARM Windows 10 设备的障碍 32位应用程序具有以下特点 MFC 与 C 用于用户界面 C

随机推荐

  • 手把手带你撸zookeeper源码系列目录

    手把手带你撸zookeeper源码 前言 手把手带你撸zookeeper源码 配置文件 手把手带你撸zookeeper源码 如何启动一个zookeeper服务 手把手带你撸zookeeper源码 从源码角度分析zookeeper启动时都做了
  • Linux系统之Centos安装epel源

    Linux系统之Centos安装epel源 一 检查本地系统环境 1 检查系统版本 2 检查系统内核版本 二 检查yum仓库 1 查看repo文件 2 检查yum仓库的状态 三 安装epel源 1 查看系统epel release noar
  • 【论文笔记_目标检测_2022】Cross Domain Object Detection by Target-Perceived Dual Branch Distillation

    基于目标感知双分支提取的跨域目标检测 摘要 在野外 跨领域目标检测是一项现实而具有挑战性的任务 由于数据分布的巨大变化和目标域中缺乏实例级注释 它的性能会下降 现有的方法主要关注这两个困难中的任何一个 即使它们在跨域对象检测中紧密耦合 为了
  • arcgis不闭合线转面_ArcGIS不闭合线转面

    ArcGIS不闭合线转面 1 打开ArcMap用Add Data加载shp Polyline线文件 2 选Editor编辑 Start Editing开始编辑 3 选Editor编辑 More Editing Tools Topology拓
  • java:hashMap: get(null)引发的对其数据结构具体形态的思考

    ref 原文 https blog csdn net fenglongmiao article details 79656198 note 我们知道HashMap集合是允许存放null值的 hashMap是根据key的hashCode来寻找
  • 软工导论知识框架(五)面向对象方法学

    传统软件工程方法学适用于中小型软件产品开发 面向对象软件工程方法学适用于大型软件产品开发 一 四要素 对象 类 继承 传递消息实现通信 二 概念 1 对象 具有相同状态的一组操作的集合 对状态和操作的封装 2 类 对具有相同状态和相同操作的
  • 带你手写基于 Spring 的可插拔式 RPC 框架(三)通信协议模块

    在写代码之前我们先要想清楚几个问题 我们的框架到底要实现什么功能 我们要实现一个远程调用的 RPC 协议 最终实现效果是什么样的 我们能像调用本地服务一样调用远程的服务 怎样实现上面的效果 前面几章已经给大家说了 使用动态代理 在客户端生成
  • CentOS7中安装mysql

    1 确保本机的mysql已经卸载干净 需要将mariadb和mysql全部卸载 rpm qa grep i mariadb rpm qa grep i mysql 使用rpm ev nodeps 命令将查询出来的文件逐一卸载 sudo rp
  • Docker Compose、Docker Swarm (docker进阶 狂神)

    文章目录 Docker Compose 安装 开源项目 博客 实战 自己编写微服务上线 Docker Swarm 四台机器安装docker环境 Swarm集群搭建 Raft协议 体会 灰度发布 金丝雀发布 其他命令学习方式 Docker C
  • notepad++以16进制查看文件

    1 Notepad 可以编辑PE文件 二进制文件即HEX码 2进制 16进制都可以 通过附加的组件HexEditor即可实现 另外一款Notepad 自带插件TextFX也有这个功能 但实现效果不如Hex Editor 下载地址 https
  • CH1-绪论

    文章目录 算法时间复杂度的计算 一 冒泡排序简介 从小到大排序 算法时间复杂度的计算 我们一般只关心随着问题规模n趋于无穷时 函数中对函数结果影响最大的项 比如说 T n 3n 3 当n非常大的时候 常数3和n的系数3对函数结果的影响就很小
  • vue--综合组件间的通信

    二 综合组件之间的通信 实现一个ToDoList 完成所有的组件的创建和使用 add点击add按钮时候 将用户输入的内容 todoinput 显示在 todolist 核心代码 兄弟组件间通信 步骤1 var bus new Vue 步骤2
  • QT210烧写UBOOT到SD卡原理以及UBOOT启动

    原文地址 http blog csdn net shushi0123 article details 8018998 世界早已进入cortex a8了 我也得跟进一下所以买了QT210的开发板 长话短说开始搞SD卡烧写UBOOT 从SD启动
  • TCP选项之SO_LINGER

    SO LINGER这个选项在我以前带队改造haproxy的时候引出过一个reset RST 客户端连接的bug SO LINGER作用 设置函数close 关闭TCP连接时的行为 缺省close 的行为是 如果有数据残留在socket发送缓
  • 手动实现 call、apply、bind

    手动实现 call apply bind 改变 this的指向 就是将函数fn放入传入的context中 然后执行context fn 此时的fn中的this就变成了context 在函数执行完毕之后 需删除context中的fn call
  • 腾讯云2核4G服务器性能如何?能安装几个网站?

    腾讯云2核4G服务器能安装多少个网站 2核4g配置能承载多少个网站 一台2核4G服务器可以安装多少个网站 阿腾云2核4G5M带宽服务器目前安装了14个网站 从技术角度是没有限制的 只要云服务器性能够用 想安装几个网站就安装几个网站 但是从公
  • Windows系统下安装Ubuntu子系统

    总共分三步 1 网上是有Windows 10版本的安装教程 链接如下 14条消息 Windows系统中安装ubutu子系统 惜洛 Jankin的博客 CSDN博客 2 补充Windows 11版本的安装 大同小异 3 如果出现报错 14条消
  • linux非阻塞socket教程

    本文并非解释什么是非阻塞socket 也不是介绍socket API的用法 取而代替的是让你感受实际工作中的代码编写 虽然很简陋 但你可以通过man手册与其它资源非富你的代码 请注意本教程所说的主题 如果细说 内容可以达到一本书内容 你会发
  • csgo 直连服务器,csgo你只可以从大厅连接此服务器解决办法

    csgo你只可以从大厅连接此服务器解决办法 请完成以下步骤刷新您的 Steam 设置 您注销并完全退出 Steam 请打开 Internet Explore Safari 或 Firefox 和并在网址列中输入 Steam flushcon
  • 高斯模糊处理

    借鉴 http blog sina com cn s blog 861912cd0101957x html http www ruanyifeng com blog 2012 11 gaussian blur html 二维高斯曲面的公式