OpenCV学习Laplacian 变换及其运用

原创 2016年05月30日 20:54:14


int main(int /*argc*/, char** /*argv*/) {

	Mat img, imgLaplacian, imgResult;

	//------------------------------------------------------------------------------------------- test, first of all
	// now do it by hand
	img = (Mat_<uchar>(4, 4) << 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 11, 12, 13, 14, 15);
	cout << img << endl;

	// first, the good result
	/*
	src_gray: 输入图像。
	dst: 输出图像
	ddepth: 输出图像的深度。 因为输入图像的深度是 CV_8U ,这里我们必须定义 ddepth = CV_16S 以避免外溢。
	kernel_size: 内部调用的 Sobel算子的内核大小,此例中设置为3。
	scale, delta 和 BORDER_DEFAULT: 使用默认值。
	*/
	//Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT );
	Laplacian(img, imgLaplacian, CV_8UC1);
	cout << "opencv laplacian" << endl;
	cout << imgLaplacian << endl;

	Mat kernel = (Mat_<float>(3, 3) <<
		0, 1, 0,
		1, -4, 1,
		0, 1, 0);
	int window_size = 3;

	// now, reaaallly by hand
	// note that, for avoiding padding, the result image will be smaller than the original one.
	Mat frame, frame32;
	Rect roi;
	imgLaplacian = Mat::zeros(img.size(), CV_32F);
	for (int y = 0; y<img.rows - window_size / 2 - 1; y++) {
		for (int x = 0; x<img.cols - window_size / 2 - 1; x++) {
			roi = Rect(x, y, window_size, window_size);
			//使用括号运算符,从图像中提取感兴趣区域
			frame = img(roi);
			frame.convertTo(frame, CV_32F);
			frame = frame.mul(kernel);
			float v = sum(frame)[0];
			imgLaplacian.at<float>(y, x) = v;
		}
	}
	imgLaplacian.convertTo(imgLaplacian, CV_8U);
	cout << "dudee" << imgLaplacian << endl;

	// a little bit less "by hand"..
	// using cv::filter2D
	filter2D(img, imgLaplacian, -1, kernel);
	cout << imgLaplacian << endl;


	//------------------------------------------------------------------------------------------- real stuffs now
	img = imread("C:/Users/dell/Desktop/1.jpg", IMREAD_GRAYSCALE); // load grayscale image

	// ok, now try different kernel
	kernel = (Mat_<float>(3, 3) <<
		1, 1, 1,
		1, -8, 1,
		1, 1, 1); // another approximation of second derivate, more stronger

	// do the laplacian filtering as it is
	// well, we need to convert everything in something more deeper then CV_8U
	// because the kernel has some negative values, 
	// and we can expect in general to have a Laplacian image with negative values
	// BUT a 8bits unsigned int (the one we are working with) can contain values from 0 to 255
	// so the possible negative number will be truncated
	filter2D(img, imgLaplacian, CV_32F, kernel);
	img.convertTo(img, CV_32F);
	imgResult = img - imgLaplacian;

	// convert back to 8bits gray scale
	imgResult.convertTo(imgResult, CV_8U);
	imgLaplacian.convertTo(imgLaplacian, CV_8U);

	namedWindow("laplacian", CV_WINDOW_AUTOSIZE);
	imshow("laplacian", imgLaplacian);

	namedWindow("result", CV_WINDOW_AUTOSIZE);
	imshow("result", imgResult);

	while (true) {
		char c = (char)waitKey(10);
		if (c == 27) { break; }
	}

	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

opencv入门学习之六:拉普拉斯Laplacian变换锐化图像

博客用于知识记录和学习交流,欢迎大家互动学习。 作者:JackGao16 CSDN文章链接: 邮箱:gshuai16@mail.ustc.edu.cn1、拉普拉斯变换锐化图像的原理拉普拉斯锐化图...

学习opencv-Laplacian图像融合

网上看到一个很有意思的利用opencv实现图像融合的方法: 1.设计一个mask(一半全1,一半全0),并计算level层的gaussion_mask[i]; 2.计算两幅图像每一层的La...

opencv学习之二:运用camshift进行红外视频跟踪。

一、RGB到GRAY的换算 camshift一般使用颜色直方图进行匹配,而红外视频为灰度图像,一般彩色RGB到灰度图像转换公式如下: Gray = R*0.299 + G*0.587 + B*...

opencv学习笔记(十一)——图像腐蚀和膨胀混合运用练习

图像腐蚀和膨胀混合运用经常应用在图像去噪,和骨架提取等场合。接下来的例子是运用图像腐蚀和膨胀进行去噪的例程: 简单的图像去噪过程就是:先对图像进行腐蚀,然后再进行膨胀。 代码如下:#include...

Opencv学习笔记-----霍夫变换直线检测及原理理解

霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通过一种投票算法检测具有特定形状的物体。该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍...

opencv学习-imgprocess-仿射变换warpAffine

opencv中的warpAffine函数可以对图像进行位移、旋转、缩放变换。getRotationMatrix2D可以获取旋转矩阵,getAffineTransform返回仿射矩阵。 代码如下: #i...

OpenCV学习笔记【5】:一个复杂的变换

使用cvPryDown创建一幅宽度和高度为输入图像一半尺寸的图像

Opencv学习笔记(四)霍夫变换

最简单的霍夫变换是在图像中识别直线。在平面直角坐标系(x-y)中,一条直线可以用下式表示。      y=kx+b      对于直线上一个确定的点(x_0,y_0),有:y_0=kx_0...

OpenCV学习笔记-拉普拉斯变换

拉普拉斯变换的函数为:Laplace计算图像的 Laplacian 变换void cvLaplace( const CvArr* src, CvArr* dst, int aperture_size=...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)