OpenCV 2 学习笔记(8): 利用邻域处理图像与简单的算术图像处理算法:图像滤波与加权和

本文介绍了OpenCV中如何利用像素邻域进行图像处理,如滤波和加权和。通过拉普拉斯算子展示了图像锐化的方法,并探讨了in-place处理的限制。文章还讨论了cv::filter2D函数在滤波中的应用,以及OpenCV提供的算术运算函数,如cv::add和cv::addWeighted,用于图像的组合和加权和。此外,还讲解了如何分离和合并图像通道以进行特定通道的处理。
摘要由CSDN通过智能技术生成

关于邻域的概念,请查阅有关数字图像处理的书籍,在这里就不再赘述。在图像处理中,利用像素邻域的值来计算本邻域的值是非常常见的事情。例如滤波,边缘检测等。要同时访问多行中像素中的值。

        我们选取锐化图像来讲述本节。拉普拉斯算子,关于这个后面的章节会提到。他是一个计算梯度的算子,通常用在边缘检测中。根据拉普拉斯算子模板卷积之后的算式为:sharpened_pixel=5*current-left-right-up-down;left就是本行左边的像素,上就是本列的上一个像素,以此类推。

下面就提出了一个问题,我们的图像还能不能in-place处理。答案当然是否定的。因为我们同时需要三个指针,指向当前行,上一行和下一行。这三个指针指向的像素在处理时都是不可以变化的。于是锐化处理的算法可以这样写:

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>

void sharpen(cv::Mat &image, cv::Mat &result)
{
	result.create(image.size(),image.type());
	//the first ,last row and colum do not process , bucause they do not have up or left neighbour
	for(int i = 1; i<image.rows-1; i++)
	{
		const uchar* previous = image.ptr<const uchar>(i-1);
		const uchar* current = image.ptr<const uchar>(i);
		const uchar* next = image.ptr<const uchar>(i+1);

		uchar* output = result.ptr<uchar>(i);

		for (int j=1; j<image.cols-1 ;j++ )
			*output++ = cv::saturate_cast<uchar>(5*current[j]-current[j-1]-current[j+1]-previous[j]-next[j]);
	}
	//Set the unprocess pixels to 0
	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));
}


int _tmain(int argc, _TCHAR* argv[])
{
	/*
		imread the second parameter:
		CV_LOAD_IMAGE_UNCHANGED (<0) loads the image as is (including the alpha chann
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值