C++利用vector实现随机选N项

利用stl中的vector实现随机选择N个数字里的N项,主要使用<algorithm>中的random_shuffle函数,

函数格式是random_shuffle(vector.begin(), vector.end())。

举例:

srand(unsigned(time(NULL)));
vector<int> randomVec;
for(int i = 0; i < 100; ++i)
{
     randomVec.push_back(i);
}
random_shuffle(randomVec.begin(), randomVec.end());

好了,这时randomVec中就已经把0-99这100个数字打散了(随机化),选择前N项即可。

随机游走图像分割是一种基于概率统计的图像分割方法,其主要思想是将图像看作一个图,图每个像素点作为节点,像素之间的相似性作为边的权值,然后通过在图进行随机游走,来确定像素点属于哪个分割区域。 在opencv,可以采用以下步骤实现随机游走图像分割: 1.读取图像,并将其转化为灰度图像。 2.计算每个像素点之间的相似性。 3.构建图像的邻接矩阵,即将每个像素点看作图的节点,将其相邻的像素点之间的相似性作为边的权值,构建出邻接矩阵。 4.利用随机游走算法,将每个像素点进行随机游走,最终确定像素点属于哪个分割区域。 5.将分割结果可视化。 下面是一个简单的opencv实现代码示例: ``` #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> #include <queue> #include <cmath> #include <vector> using namespace std; using namespace cv; // 计算像素之间的相似性 double calculate_similarity(Mat img, int i, int j) { double diff = abs(img.at<uchar>(i) - img.at<uchar>(j)); return exp(-diff * diff / 10.0); } // 构建邻接矩阵 void build_adjacency_matrix(Mat img, Mat& adjacency_matrix) { int n = img.rows * img.cols; adjacency_matrix = Mat::zeros(n, n, CV_64FC1); for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { double similarity = calculate_similarity(img, i, j); adjacency_matrix.at<double>(i, j) = similarity; adjacency_matrix.at<double>(j, i) = similarity; } } } // 随机游走算法 void random_walk(Mat adjacency_matrix, int n, vector<int>& segmentation) { vector<double> p(n, 0); for (int i = 0; i < n; i++) { p[i] = 1.0 / n; } queue<int> q; q.push(0); while (!q.empty()) { int i = q.front(); q.pop(); segmentation[i] = 1; for (int j = 0; j < n; j++) { if (adjacency_matrix.at<double>(i, j) > 0 && segmentation[j] == 0) { p[j] += adjacency_matrix.at<double>(i, j) * p[i]; q.push(j); } } } } // 可视化分割结果 void visualize_segmentation(Mat img, vector<int> segmentation) { Mat segmented_img = Mat::zeros(img.size(), CV_8UC1); for (int i = 0; i < img.rows * img.cols; i++) { if (segmentation[i] == 1) { segmented_img.at<uchar>(i / img.cols, i % img.cols) = 255; } } imshow("Segmented Image", segmented_img); waitKey(0); } int main() { Mat img = imread("test.jpg", IMREAD_GRAYSCALE); if (img.empty()) { cout << "Failed to load image" << endl; return -1; } Mat adjacency_matrix; build_adjacency_matrix(img, adjacency_matrix); int n = img.rows * img.cols; vector<int> segmentation(n, 0); random_walk(adjacency_matrix, n, segmentation); visualize_segmentation(img, segmentation); return 0; } ``` 需要注意的是,随机游走算法的收敛速度很慢,这会导致算法的运行时间较长。因此,实际应用可能需要采用一些加速方法,如拉普拉斯算子、谱聚类等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值