文档章节

图像的卷积(滤波)运算(一)——图像梯度

o
 osc_a22drz29
发布于 2019/03/23 00:13
字数 846
阅读 5
收藏 0

精选30+云产品,助力企业轻松上云!>>>

[toc]

1. 卷积/滤波原理

首先要明确的一点是图像的卷积/滤波运算,是针对原图像每一个像素进行处理,得到一个新的图像的过程。那么进行怎么样的运算呢?要知道图像能够被人所识别,是因为图像中每个像素并不完全是离散而独立的,每个像素都跟周围的像素相关。因此,对每一个像素,选定其周围一定范围内的像素值进行运算,得到新的图像的像素值也一定是相关的。而这个范围,就是卷积/滤波的窗口。

只有相关的像素值是不够的,还需要改变因子——也就是我们说的卷积核了。它就是之前说的卷积/滤波的窗口大小,通常由数学原理推导出来的。

最后,将窗口内覆盖的像素值和卷积核值相乘并相加,就得到新的像素值填充到新的图像中。对每个像素值都这样做,就是卷积/滤波运算后新的图像了。

2. 具体实例

以X方向上的一维卷积/滤波为例,选取一个卷积核(-1,0,1),对于图像像素X,其卷积运算的结果Y=-1 × Xa + 0 × X + 1 × Xb,即总是X的后一个像素与前一个像素之差。示意图如下:. 其具体实现代码:

#include <iostream>
#include <opencv2\opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	//从文件中读取成灰度图像
	const char* imagename = "D:\\Data\\imgDemo\\lena.jpg";
	Mat img = imread(imagename, IMREAD_GRAYSCALE);
	if (img.empty())
	{
		fprintf(stderr, "Can not load image %s\n", imagename);
		return -1;
	}

	//OpenCV函数进行一维卷积(梯度图)
	Mat xKernel = (Mat_<double>(1, 3) << -1, 0, 1);			//卷积算子
	Mat Ix;
	filter2D(img, Ix, -1, xKernel);

	//自建算法进行一维卷积(梯度图)
	Mat Ixx;
	Ixx.create(img.cols, img.rows, CV_8UC1);
	double xk[3] = { -1, 0, 1 };			//卷积算子
	for (int i = 0; i < img.rows; ++i)
	{
		for (int j = 0; j < img.cols; ++j)
		{
			//img.at<uchar>(i, j) = 255;
			uchar b[3] = { 0 };
			b[0] = (j == 0 ? 0 : img.at<uchar>(i, j - 1));
			b[1] = img.at<uchar>(i, j);
			b[2] = (j == img.cols - 1 ? 0 : img.at<uchar>(i, j + 1));

			double value = xk[0] * b[0] + xk[1] * b[1] + xk[2] * b[2];
			value = (std::min)(std::max(value, 0.0), 255.0);
			Ixx.at<uchar>(i, j) = (uchar)value;
		}
	}

	//比较两者的结果
	Mat c;
	compare(Ix, Ixx, c, CMP_EQ);

	//显示图像
	imshow("原始", img);
	imshow("梯度图(CV)", Ix);
	imshow("梯度图(MY)", Ixx);
	imshow("比较结果", c);

	waitKey();
	return 0;
}

在这里分别通过OpenCV的filter2D和自己的算法实现了X方向上的一维卷积/滤波运算,显示了其结果图。最后还用compare函数比较两者的差异,纯白(像素值255)色表示两者无差异。其运行结果如下:

3. 图像梯度图

这里的卷积核(-1,0,1)其实是从图像的梯度推导出来的。如果把图像看作是函数f(x),那么其X方向上梯度也就是函数X方向上的变化率为: 对所有的像素卷积运算都会除以2,对结果无关紧要,因此可以将其舍弃。最后就得到卷积核(-1,0,1)。 除此之外,也可以在Y方向上进行卷积,得到Y方向上的卷积图,只不过卷积核需要转置。

4. 参考资料

1.图像梯度的基本原理 2.图像梯度计算

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
图像的卷积(滤波)运算(一)——图像梯度

目录 1. 卷积/滤波原理 2. 具体实例 3. 图像梯度图 4. 参考资料 1. 卷积/滤波原理 首先要明确的一点是图像的卷积/滤波运算,是针对原图像每一个像素进行处理,得到一个新的图像的过程。那么进...

charlee44
2019/03/23
0
0
图像的膨胀与腐蚀——OpenCV与C++的具体实现

目录 1. 膨胀与腐蚀的原理 2. 膨胀的具体实现 3. 腐蚀的具体实现 1. 膨胀与腐蚀的原理 膨胀与腐蚀是数学形态学在图像处理中最基础的操作。在笔者之前的文章《图像的卷积(滤波)运算(一)——图...

charlee44
2019/03/31
0
0
图像处理——卷积、滤波的整理

1.使用模板处理图像相关概念: 模板:矩阵方块,其数学含义是一种卷积运算。 卷积运算:可看作是加权求和的过程,使用到的图像区域中的每个像素分别于卷积核(权矩阵)的每个元素对应相 乘,所...

SnailTyan
06/29
0
0
图像的膨胀与腐蚀——OpenCV与C++的具体实现

[toc] 1. 膨胀与腐蚀的原理 膨胀与腐蚀是数学形态学在图像处理中最基础的操作。在笔者之前的文章《图像的卷积(滤波)运算(一)——图像梯度》、《图像的卷积(滤波)运算(二)——高斯滤波》具体介...

osc_w9s1w4o0
2019/03/31
1
0
harris角点检测的简要总结

[toc] 1. 概述相关 harris角点检测是一种特征提取的方法,而特征提取正是计算机视觉的一种重要手段。尽管它看起来很复杂,其实也是基于数学原理和简单的图像处理来实现的。本文之前可以参看笔...

osc_xgk2otgu
2019/04/13
1
0

没有更多内容

加载失败,请刷新页面

加载更多

会议通知 | 2020中国计算与认知神经科学会议

关于大会关于 计算神经科学以神经生物实验为基础,以建立数学模型,开展计算模拟和分析作为基本手段,来刻画和描述大脑的神经活动,探究神经系统各种复杂活动和认知功能包括注意、学习、记忆...

脑机接口社区
06/02
17
0
大神分享快3怎么算下期和值

大神分享快3怎么算下期和值{叩67790572}使用的标签:constructor-arg标签出现的位置:bean标签的内部标签中的属性type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个...

yiren081
22分钟前
21
0
Matlab系列之运算符和标点符号的功能介绍

本来月初就打算接着写的,但是电脑不小心进水,主板什么的都废了,周末才找时间拿去修好,心塞。 就不多讲太多废话了,开始分享今天的内容,对MATLAB的运算符做个介绍,然后再对标点符号进行...

狂人V
07/06
3
0
Java源码系列(1):Comparable和Comparator的区别

在讲Comparable和Comparator区别之前,先补充一个知识点。 先看代码: Person类 1public class Person<T> { 2  private T id; 3 4  public T getId() { 5    return i...

学习Java的小姐姐
2018/09/19
19
0
ThreadPoolTaskScheduler手写调度中心

先贴一个自己写的demo把,原理其实就是这样的。 CronTrigger这个类可以将cron表达式转换成Date,可以查看schedule源码学到不少东西,下面代码就是转换成下一执行时间。 public Date nextEx...

朝如青丝暮成雪
44分钟前
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部