opencv解析系列 - 基于DOM提取大面积植被(如森林)

Note:简单提取,不考虑后处理(填充空洞、平滑边界等)

#include <iostream>
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <opencv2/opencv.hpp>
using namespace cv;

#pragma comment(lib,"opencv_world490d.lib")
int main(int, char**)
{
	// 读取图像
	cv::Mat originalImage = cv::imread("D:\\OpenCV\\1.jpg");
	cv::Mat image = cv::imread("D:\\OpenCV\\1.jpg", cv::IMREAD_GRAYSCALE);

	// 应用阈值处理
	cv::Mat binaryImage;
	cv::threshold(image, binaryImage, 128, 255, cv::THRESH_BINARY);

	// 可以使用滤波、边缘检测等方法进行图像处理和增强
	// 可以使用特征提取、目标检测等方法进行建筑物识别

	//创建结构元素
	cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(10, 10));
	//膨胀
	cv::Mat dilateImage;
	cv::dilate(binaryImage, dilateImage, kernel, cv::Point(0, 0), 3);
	//腐蚀
	cv::Mat erodedImage;
	cv::erode(dilateImage, erodedImage, kernel);

	// 颜色反转
	cv::bitwise_not(erodedImage, erodedImage);

	// 寻找轮廓
	std::vector<std::vector<cv::Point>> contours;
	cv::findContours(erodedImage, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);

	// 绘制轮廓
	cv::Mat contourImage = cv::Mat::zeros(image.size(), CV_8UC3);
	cv::drawContours(contourImage, contours, -1, cv::Scalar(0, 255, 0),2);

	//将轮廓叠加到原始图片上
	Mat resultImage;
	addWeighted(originalImage, 0.7, contourImage, 0.3, 0, resultImage);

	// 创建窗口并显示图片
	cv::imshow("Original Image", originalImage);
	//cv::imshow("Tree", contourImage);
	cv::imshow("Tree", resultImage);

	// 等待按键退出
	cv::waitKey(0);

	// 销毁窗口
	cv::destroyAllWindows();
}

处理效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值