cv-拉普拉斯算子锐化浅析

图像锐化处理的主要目的是突出图像中的细节或者增强被模糊了的细节,这种模糊一般由于错误操作或者是特殊图像获取方法的影响导致的。图像锐化的方法有很多,这里主要说下微分算子的方法来进行图像的锐化处理。总的来说,微分算子的响应强度与图像在该点(应用了算子)的突变程度有关。

数学中的微分描述的是连续函数关于各个变量的变化。但是在图像中,是以众多像素点来组成整张图片,所以,虽然图像有两个方向:水平方向(x方向)和垂直方向(y方向),但是这些方向的值也就是像素点的x值和y值均是离散的。X:1,2,3,…n;   Y:1,2,3,…m;那我们就需要用离散的方法来表示出微分。

数学函数的微分可以用不同的术语定义,也有各种方法定义这些差别,然而,对于一阶微分的任何定义都必须保证以下几点:(1)在平坦段(灰度不变的区域)微分值为零;(2)在灰度阶梯或斜坡的起始点处微分值非零;(3)沿着斜坡面微分值非零。任何二阶微分的定义也类似:(1)在平坦区微分值必为零;(2)在灰度阶梯或斜坡的起始点处微分值非零;(3)沿着斜坡面微分值非零。因为我们处理的是数字量,其值是有限的,故最大灰度级的变化也是有限的,变化发生的最短距离是在两相邻像素之间。

1.基于一阶微分的图像增强原理

对于二元函数的一阶偏微分微分表示如下:

定义二元函数的微分为:

这就描述了图像中一个像素点(x,y)的一阶微分变化。简单的总结为一个算子的话就是一个2*2的矩阵如下

此算子在图像中应用的意思就是将(x,y)处像素的值减去(x-1,y)处值,与(x,y)出像素值减去(x,y-1)处的像素值相加替换(x,y)处的像素值。这就表征了图像在(x,y)处的一种变化,将这种变化与(x,y)处原有的值进行叠加,就可以将使这种变化更明显,也就是放大这种变化,从而达到图像锐化的目的。

2.基于二阶微分的图像增强处理。

首先定义一个二阶微分的离散公式,然后构造一个基于此式的滤波器。我们最关注的是一种各向同性滤波器,这种滤波器的响应与滤波器作用的图像的突变方向无关。也就是说,各向同性滤波器是旋转不变的,即将原始图像旋转后进行滤波处理给出的结果与先对图像滤波,然后再旋转的结果相同。

一个二元图像函数f(x,y)的拉普拉斯变换定义为:          

因为任意阶微分都是线性操作,所以拉普拉斯变换也是一个线性操作。

为了更适合于数字图像处理,这一方程需要表示为离散形式。通过邻域处理有多种方法定义离散变换,但无论怎样定义,都必须符合3.7.1节中提到的二阶微分处理的性质。在上一节中给出的数字二阶微分处理的定义是最常用的一种。考虑到有两个变量,因此,我们在x方向上对二阶偏微分采用下列定义:

类似地,在y方向上为:

式(3.7.1)中的二维拉普拉斯数字实现可由这两个分量相加得到:

从而得到拉普拉斯算子

意思同上面的一阶微分算子相同。

这里解释一下微分算子的使用,很简单,如上面这个就是在处理每个像素点的RGB值时,将该像素的RGB三个值乘以4然后减去他上向左右四个像素点的RGB值,注意R、G、B分别处理。

这样是变化的表示,我们要想图片锐化,应该把这种变化叠加到原像素就行了,也就是

思路很简单。

一下为自己实现图像基于拉普拉斯算子的锐化过程:

void sharpen(const Mat &img, Mat &result)
{

	for (int j = 1; j < img.rows - 1; ++j)
	{
		const uchar *previous = img.ptr<const uchar>(j - 1);
		const uchar *current = img.ptr<const uchar>(j);
		const uchar *next = img.ptr<const uchar>(j + 1);
		uchar *output = result.ptr<uchar>(j);
		for (int i = 1; i < 3 * (img.cols - 1); ++i)//这里是基于RGB图的,如果非RGB图则无需这样
		{
			*output++ = cv::saturate_cast<uchar>(
				5 * current[i] - current[i - 1] - current[i + 1]
				- previous[i] - next[i]);
		}
	}
	result.row(0).setTo(cv::Scalar(0));
	result.row(result.rows - 1).setTo(cv::Scalar(0));
	result.col(0).setTo(cv::Scalar(0));
	result.col(result.cols - 1).setTo(cv::Scalar(0));
}

以下为使用opencv中的fiter2D函数通过拉普拉斯算子实现锐化操作的代码

int main()
{
	Mat img, resulta;
	img = imread("C:/Users/Administrator/Desktop/bbb.jpg");

	cv::Mat kernela(3, 3, CV_32F, cv::Scalar(0));

	// assigns kernel values 

	kernela.at<float>(1, 1) = 5.0;
	kernela.at<float>(0, 1) = -1.0;
	kernela.at<float>(2, 1) = -1.0;
	kernela.at<float>(1, 0) = -1.0;
	kernela.at<float>(1, 2) = -1.0; 

	filter2D(img, resulta, img.depth(), kernela);
	//cout << img.rowRange(1, 4).colRange(1, 4) << endl;
	//cout << result.rowRange(1, 4).colRange(1, 4) << endl;
	imwrite("C:/Users/Administrator/Desktop/solved.jpg", resulta);
	//imshow("origin", img);
	//imshow("锐化结果", resulta);
	waitKey(0);
	return 0;
}

原始图片

锐化后图片

时间: 2024-10-21 14:12:47

cv-拉普拉斯算子锐化浅析的相关文章

使用二阶微分锐化图像(拉普拉斯算子)基本原理及Python实现

1. 拉普拉斯算子 1.1 简介 一种典型的各向同性的微分算子,可用于检测图像中灰度图片的区域 $$ \nabla^{2} f=\frac{\partial^{2} f}{\partial x^{2}}+\frac{\partial^{2} f}{\partial y^{2}} $$ 根据上述的差分近似可以推导出 $$ \nabla^{2} f(x, y)=f(x+1, y)+f(x-1, y)+f(x, y+1)+f(x, y-1)-4 f(x, y) $$ 1.2 锐化过程 使用拉普拉斯过滤

数学之路-python计算实战(20)-机器视觉-拉普拉斯算子卷积滤波

拉普拉斯算子进行二维卷积计算,线性锐化滤波 # -*- coding: utf-8 -*- #线性锐化滤波-拉普拉斯算子进行二维卷积计算 #code:[email protected] import cv2 import numpy as np from scipy import signal fn="test6.jpg" myimg=cv2.imread(fn) img=cv2.cvtColor(myimg,cv2.COLOR_BGR2GRAY) srcimg=np.array(im

灰度图像--图像增强 拉普拉斯算子

学习DIP第34天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意.有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!! 文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro

paper 109 :图像处理中的拉普拉斯算子

1.基本理论 拉普拉斯算子是最简单的各向同性微分算子,具有旋转不变性.一个二维图像函数 的拉普拉斯变换是各向同性的二阶导数,定义为:   为了更适合于数字图像处理,将该方程表示为离散形式:    另外,拉普拉斯算子还可以表示成模板的形式,如图5-9所示.图5-9(a)表示离散拉普拉斯算子的模板,图5-9(b)表示其扩展模板,图5-9(c)则分别表示其他两种拉普拉斯的实现模板.从模板形式容易看出,如果在图像中一个较暗的区域中出现了一个亮点,那么用拉普拉斯运算就会使这个亮点变得更亮.因为图像中的边缘

Opencv拉普拉斯算子做图像增强

Opencv拉普拉斯算子——图像增强 #include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; //拉普拉斯处理 cv::Mat laplaceMat(cv::Mat imgParam); int main(int argc, char *argv[]) { Mat image = imread("D:\\images\\JK$DPF6315~A4G

图像处理-线性滤波-2 图像微分(1、2阶导数和拉普拉斯算子)

更复杂些的滤波算子一般是先利用高斯滤波来平滑,然后计算其1阶和2阶微分.由于它们滤除高频和低频,因此称为带通滤波器(band-pass filters). 在介绍具体的带通滤波器前,先介绍必备的图像微分知识. 1 一阶导数 连续函数,其微分可表达为 ,或                         (1.1) 对于离散情况(图像),其导数必须用差分方差来近似,有 ,前向差分 forward differencing                  (1.2)  ,中心差分 central

拉普拉斯算子

%function PicOut=Lap_edge(PicInput,thresh)           PicInput=imread('c:/boat.png');thresh=45;% 本程序能够将BMP格式的黑白灰度图像用拉普拉斯算子进行边缘检测% 生物图像处理作业2% 格式为 a=Lap_edge(PicInput,thresh) 或者嵌套为 Lap_edge(imread('rice.tif'),15)% thresh参数可自选,对于rice.tif这张图来说最合适的值大约为14到1

OpenCV-跟我一起学数字图像处理之拉普拉斯算子

Laplace算子和Sobel算子一样,属于空间锐化滤波操作.起本质与前面的Spatial Filter操作大同小异,下面就通过Laplace算子来介绍一下空间锐化滤波,并对OpenCV中提供的Laplacian函数进行一些说明. 数学原理 离散函数导数 离散函数的导数退化成了差分,一维一阶差分公式和二阶差分公式分别为, Laplace算子的差分形式 分别对Laplace算子x,y两个方向的二阶导数进行差分就得到了离散函数的Laplace算子. 在一个二维函数f(x,y)中,x,y两个方向的二阶

拉普拉斯算子网格形变

网格顶点的拉普拉斯坐标定义为 ,公式中di代表顶点Vi的一环邻域顶点数量 网格的拉普拉斯坐标用矩阵表示, ,  然后通过网格的拉普拉斯坐标求解为稀疏线性方程组便可以得到形变后的网格顶点 初始化拉普拉斯矩阵 1 void mainNode::InitLpls() 2 { 3 int vertexNumber = m_vecAllVertex.size(); 4 //计算拉普拉斯坐标.方式一 5 for (int i = 0; i < vertexNumber; i++) 6 { 7 pVERTEX