基于C++的图像散度计算

在x y的梯度上再求一次导数后相加便是散度。注意不要使用convertScaleAbs

int main(int argc, char*argv[])
{
	cv::Mat IMG = cv::imread("./img.jpg", 1);

	cv::Mat k = getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3), cv::Point(-1, -1));
	cv::Mat graySrc, grad_x, grad_y;
	cv::Mat abs_grad_x, abs_grad_y;
	   cv::cvtColor(IMG, graySrc, cv::COLOR_BGR2GRAY);
	//cv::GaussianBlur(graySrc, graySrc, cv::Size(3,3), 0, 0, 4);
	// 计算x方向的散度
	cv::Mat Sobel_x = (Mat_<char>(3, 3) << -1, 0, 1, -2, 0, 2, -1, 0, 1);
	filter2D(graySrc, grad_x, CV_64FC1, Sobel_x, cv::Point(-1, -1), 0, 0);
	filter2D(grad_x, grad_x, CV_64FC1, Sobel_x, cv::Point(-1, -1), 0, 0);
//	Sobel(grad_x, grad_x, CV_32FC1, 1, 0, 3, 1, 0, cv::BORDER_DEFAULT);
	//convertScaleAbs(grad_x, abs_grad_x);
	// 计算y方向的散度
	cv::Mat Sobel_y = (Mat_<char>(3, 3) << 1, 2, 1, 0, 0, 0, -1, -2, -1);
	filter2D(graySrc, grad_y, CV_64FC1, Sobel_y, cv::Point(-1, -1), 0, 0);
	filter2D(grad_y, grad_y, CV_64FC1, Sobel_y, cv::Point(-1, -1), 0, 0);
//	Sobel(grad_y, grad_y, CV_32FC1, 0, 1, 3, 1, 0, cv::BORDER_DEFAULT);
	//convertScaleAbs(grad_y, abs_grad_y);
	// 合并散度
	cv::Mat divImage;
	addWeighted(grad_x, 0.5, grad_y, 0.5, 0, divImage);
	//morphologyEx(divImage, divImage, cv::MORPH_OPEN, k);
	morphologyEx(divImage, divImage, cv::MORPH_CLOSE, k);
	cv::imwrite("dstGradientImage.jpg", divImage);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AplusX

踩坑不易,打个赏呗~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值