OpenCV C++案例实战二十九《遥感图像分割》

OpenCV C++案例实战二十九《遥感图像分割》


前言

本案例基于k-means机器学习算法进行遥感图像分割。主要是用到了OpenCV 中的kmeans API。关于kmeans聚类算法原理大家自行查找资料学习,也比较容易理解,我这里就示范一下如何调用OpenCV中的API进行图像分割。

一、准备数据

在这里插入图片描述
原图如图所示,我们想要的效果是将该图像中白色部分作为前景像素,黑色部分作为背景像素进行分割出来,属于一个二分类问题。对于这个简单的二分类也可以直接使用阈值分割将图像前景与背景分割出来。我这里是使用kmeans聚类算法将图像进行一个二分类。
首先,需要将图像中的像素灰度存储为一个mat格式,width*height行,channel列。

	//图像宽、高、通道
	int width = src.cols;
	int height = src.rows;
	int channel = src.channels();

	Mat data(width*height, channel, CV_32FC1);//mat类型数据,用于存储图像灰度信息-width*height行,channel列
	int index = 0;//图像像素索引
	for (int i = 0; i < src.rows; i++)
	{
		for (int j = 0; j < src.cols; j++)
		{
			index = i * width + j;//图像像素索引
			for (int c = 0; c < channel; c++)
			{
				data.at<float>(index, c) = saturate_cast<int>(src.at<Vec3b>(i, j)[c]);//将当前像素灰度值存储进mat数据里面
			}
		}
	}

二、K-Means分类

准备好数据之后,就可以调用OpenCV中的kmeans API了。

double kmeans( InputArray data,   //聚类数据,浮点型数据,每行为一个样本
               int K,  //类别数
               InputOutputArray bestLabels, //每一个样本分类结果,整型数据
               TermCriteria criteria, //算法停止迭代的标准
               int attempts,//判断某个样本为某个类的最少聚类次数,比如值为3时,则某个样本聚类3次都为同一个类,则确定下来。
               int flags, //确定簇心的计算方式。有三个值可选:KMEANS_RANDOM_CENTERS 表示随机初始化簇心。KMEANS_PP_CENTERS 表示用kmeans++算法来初始化簇心,KMEANS_USE_INITIAL_LABELS 表示第一次聚类时用用户给定的值初始化聚类,后面几次的聚类,则自动确定簇心。
               OutputArray centers = noArray() //用来初始化簇心的。与前一个flags参数的选择有关。如果选择KMEANS_RANDOM_CENTERS随机初始化簇心,则这个参数可省略。
               );	
	Mat labels;//数据分类标签
	int k = 2;//2类,前景、背景
	kmeans(data, k, labels, TermCriteria(TermCriteria::COUNT | TermCriteria::EPS, 100, 0.01), 3, KMEANS_RANDOM_CENTERS);

三、效果显示

在这里插入图片描述

四、源码

#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main()
{
	Mat src = imread("test.bmp");
	if (src.empty())
	{
		cout << "can not read the image..." << endl;
		system("pause");
		return -1;
	}

	//图像宽、高、通道
	int width = src.cols;
	int height = src.rows;
	int channel = src.channels();

	Mat data(width*height, channel, CV_32FC1);//mat类型数据,用于存储图像灰度信息-width*height行,channel列
	int index = 0;//图像像素索引
	for (int i = 0; i < src.rows; i++)
	{
		for (int j = 0; j < src.cols; j++)
		{
			index = i * width + j;//图像像素索引
			for (int c = 0; c < channel; c++)
			{
				data.at<float>(index, c) = saturate_cast<int>(src.at<Vec3b>(i, j)[c]);//将当前像素灰度值存储进mat数据里面
			}
		}
	}

	Mat labels;//数据分类标签
	int k = 2;//2类,前景、背景
	kmeans(data, k, labels, TermCriteria(TermCriteria::COUNT | TermCriteria::EPS, 100, 0.01), 3, KMEANS_RANDOM_CENTERS);

	Scalar color[] =
	{
		Scalar(255,0,0),
		Scalar(255,255,0)
	};
	
	//进行图像像素分类,并将同一类像素绘制相同的颜色
	for (int i = 0; i < src.rows; i++)
	{
		for (int j = 0; j < src.cols; j++)
		{
			index = i * width + j;
			for (int c = 0; c < channel; c++)
			{
				src.at<Vec3b>(i, j)[c] = color[labels.at<int>(index)][c];
			}
		}
	}
	
	imwrite("result.bmp", src);
	namedWindow("test", WINDOW_NORMAL);
	imshow("test", src);
	waitKey(0);
	destroyAllWindows();
	system("pause");
	return 0;
}

总结

本文使用OpenCV C++ 进行遥感图像分割,主要操作有以下几点。
1、将图像像素灰度存储为mat数据格式,用于kmeans分类。
2、进行像素分类以及结果显示

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
本程序主要对遥感图像实现三种处理:几何校正、图像增强和图像配准。这三种处理都可以独立实现,然而对于原始的遥感图像将这三种处理依次进行效果更佳。 具体操作步骤如下: 1.在主窗口打开图像1 2.选择【几何校正】菜单,打开【图像几何校正】对话框进行几何校正。在此对话框中,首先打开待校正图像2,然后点击【选取特正点】按钮,按照提示依次在待校正图像和基准图像中手动选取特征点,最后点击【校正图像】得到几何校正结果,如果达到预期效果,则点击【保存并在主窗口打开】按钮,保存此校正图片,并在主窗口打开。 3.选择【图像增强】菜单,打开【图像增强】对话框进行图像增强。在此对话框中,首先在相应的处理类别(如:直方图增强、灰度增强等)中选择具体方法(如:均衡化、规定化等),然后点击本类别的按钮。增强后的结果会在右侧显示,如果达到预期效果,则点击【保存并在主窗口打开】按钮,保存此增强后的图片,并在主窗口打开。 4.选择【图像配准】菜单,打开【图像配准】对话框进行图像配准。在此对话框中,首先打开待匹配图像3,然后选择“半自动”或“手动”方法并点击【选取特正点】按钮,按照提示依次在待配准图像和基准图像中半自动或手动选取特征点(如果在半自动选取中特征点对应错误,可以更改特征点),最后点击【匹配图像】得到图像配准结果,如果达到预期效果,则点击【保存并在主窗口打开】按钮,保存此校正图片,并在主窗口打开。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Zero___Chen

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值